在进行SQL注入的时候,我们在确定注入点之后,第一步要做的事情就是判断注入类型,注入类型分为字符型与数字型,确定好注入类型之后,才能继续接下来的sql注入。
以下口诀适用于具有数据回显的情况,如果只有页面变化,没有数据回显,就需要使用布尔盲注,如果页面没有任何变化就需要利用时间盲注判断,这里不对布尔盲注与时间盲注进行讲解,只讲述最基础的具有数据回显的情况。
结论
牢记以下结论,三步即可判断出注入类型,具体原理后面会分析:
- 判断是数字型还是字符型:通过
?id=1 and 1=2
判断,如果显示不正常,说明是数字型,如果显示正常,就是字符串型,就需要进行下面的步骤继续判断。- 判断是什么符号的字符型:
- 单引号测试:通过
?id=1'
观察回显- 双引号测试:通过
?id=1"
观察回显- 判断出字符型:如果哪个符号回显是报错信息,则表示是哪个符号的字符型,接着使用对应符号闭合之后进行SQL注入即可
原理
1.假设是数字型注入
输入?id=33 and 1=2
之后,在sql语句中是这样显示的
select * from cms_article where id=33 and 1=2;
id=33的条件是可以查到正常内容的,但是加上 and 1=2
之后,就不会显示正常内容,说明我们的加上的and 1=2
被mysql解析了,才不会显示正常的内容。所以可以通过输入?id=1 and 1=2
观察显示情况,从而反推出是否是数字型注入,如果不是数字型注入,那必定是字符型注入了,所以就需要进行下一步判断:究竟是单引号还是双引号的字符。
2.假设是双引号字符型注入
1.我们输入?id=1'
进行单引号测试之后,在sql语句中是这样显示的
select * from cms_article where id="33'";
通过结果我们可以知道,mysql将我们输入的单引号忽略了,只取了我们传入的33,从而查出了数据。经过多次尝试,我将单引号换成其他标点符号,都能正常查出数据。
因此可以得出结论:mysql在查询条件为字符串的时候,遇到第一个符号就会停止搜索,只会取第一个符号之前的内容,并且正常显示,如果查询条件为数字,那么遇到符号就会报错了,如图:
所以我们可以借助这个特性,直接判断出字符型注入。
2.我们输入?id=1"
进行双引号测试之后,在sql语句中是这样显示的:
select * from cms_article where id="33"";
可以看到我们输入的双引号闭合了sql语句中的第一个引号,然后引发了如下图报错:
最终结论:如果我们在确定这是字符型注入的时候,使用双引号如果引发了报错,说明就是双引号的字符型。
3.单引号字符的原理和双引号字符原理是一模一样的