自学web安全day07--SQL注入--(基础01)判断注入类型

482 阅读4分钟

一.靶场环境及准备工作

1.靶场

DVWA

image.png

2.必备插件

使用火狐浏览器,安装HackBar V2插件

image.png

3.phpstudy2018数据库设置

打开MySql的日志显示功能:

S1 在该目录下,新建MySql的log文件

"mysql.log"作为自己MySql查询语句的记录日志

image.png

S2 设置配置文件my.ini

找到my.ini文件

image.png

打开并在[mysqld]下增加如下内容:

其中:/data/mysql.log是mysql.log日志文件的相对路径

image.png

S3 验证是否配置成功

输入mysql相关sql语句观察该文件是否有记录,有记录则配置成功

image.png

二.DVWA靶场实现SQL注入

1.判断字符型SQL注入 or 数字型SQL注入

重要判断方法

输入

①1 and 1=1 --True条件

②1 and 1=2 --False条件

页面的查询结果都返回相同的内容,说明不是数字型注入。既然不是数字型,那就有很大的可能是字符型注入了。

原因:字符型注入以"成对单引号或者双引号"出现

2.实践

S1 进入DVWA靶场,难度设置为low

输入1,得到以下信息

image.png

右键检查-HackerBar中显示:

image.png

image.png

S2 在mysql.log日志文件中观察sql信息对比具体查询结果

输入的是id=1,对应的查询语句如下(上帝视角--自己作为root管理员的视角)

SELECT first_name,last_name FROM users WHERE user_id='1';

image.png

S3 在客户端界面控制不同输入来判断SQL注入类型

[注:对比上帝视角和攻击者视角]

(1)输入 1'

攻击者视角:显示语法错误 image.png

上帝视角:SELECT first_name,last_name FROM users WHERE user_id='1'';

由于引号是成对出现的,多出的一个单引号需要新的单引号配对

image.png

(2)输入1 and 1=1和1 and 1=2判断注入类型

攻击者视角:

①1 and 1=1结果

image.png

上帝视角:SELECT first_name,last_name FROM users WHERE user_id='1 AND 1=1'

image.png

②1 and 1=2结果

image.png

上帝视角:SELECT first_name,last_name FROM users WHERE user_id='1 and 1=2'

image.png

对比①与②,两者结果相同,即大概率是字符型注入

(3)输入1' and 1=2--+观察结果

知识补充:从两个连续横杠 -- 序列到行尾。 在MySQL中, - (两个连续横杠 )注释样式要求第二个破折号后跟至少一个空格或控制字符(例如空格,制表符,换行符等) ,因此这里我们输入+在URL编码后会变成空格,如果直接输入空格变为1' and 1=2--+

攻击者视角:不显示任何结果,说明提交的结果是False

image.png

上帝视角:SELECT first_name,last_name FROM users WHERE user_id='1' and 1=2--'

最后一个单引号'--注释掉了

image.png

3.总结与反思

1.字符型与数字型注入的区别:

(1)字符型sql语句

'1' and 1=1'为字符串,实际效果为1(因为user_id是int,字符串需要转换为int型)

MySQL隐性转换机制:

隐式转换隐式转换是自动调用的,从左至右
用于实现自动将某种类型的数据转换为另外一种类型的数据。
上面的例子中,user_id是int型,传入的'1 and 1=1'是字符串,会触发隐式类型转换:
看到数字1的时候,会自动舍弃掉1后非数字的字符
例如:user_id='123asdad'等效为123
user_id='admin'等效为0

image.png

(2)数字型sql语句

1 and 1=1为表达式,用and连接,需要判断左右真假,若一方为假则为假,网页可能不会与数据库交互。

image.png

2.方法优化判断字符型与数字型

1.直接输入数字+字符组合

1asd对应user_id=1asd则不执行 --数字型

1asd对应user_id='1asd' 经过隐式转换为1则执行 --字符型

image.png

2.直接输入数字+字符组合+单引号,通过报错信息判断sql语句闭合方式

1asd'提示报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' 1asd''' at line 1

分析:'' 1asd'''

由于MySql的报错语法,出现near会自动在报错位置左右各加一个单引号',因此去掉第一层near加的单引号,变为 '1asd'',可通过这个判断sql语句的闭合方式

如何判断sql语句的闭合方式?
先从右往左分析
本体去掉,只看右边,还剩下'则说明是单引号闭合
假如还剩下)'则说明是括号+单引号闭合

为什么不看左边?
因为报错的信息中不会显示左边
假如是('')闭合,报错时,会先认为(是正确的,但(后的出问题,所以不会显示(,只会显示')