SQL注入是WASPTOP10永居榜首的漏洞
SQL注入种类多种多样,此文将通过一个实例详细讲解数字型注入。
在我们拿到一个网页时,首先判断它是否存在注入漏洞最简单粗暴的方法就是在参数后面加一个单引号,如果网页报错,那么说明有可能存在注入漏洞了。请看下面的网页操作:
上面是一个正常的网页,我们先检测网页是否有参数,在网址后面加上:?id=1 即http://192.168.114.147/sqli-labs-master/Less-1/?id=1(注意网页的变化):
此时网页内容有了变化,返回正常的页面,说明什么呢?说明我们在地址栏中的参数被带到数据库中进行查询,那么这里就很有可能存在注入漏洞。
为了进一步弄清楚它的原理我们去看一下这个网页的源代码:
$ sql="SELECT * FROM users WHERE id=’
i
d
′
L
I
M
I
T
0
,
1
"
;
这
句
代
码
就
是
S
Q
L
的
查
询
语
句
,
即
我
们
在
浏
览
器
中
输
入
的
地
址
中
包
含
的
参
数
就
是
id' LIMIT 0,1"; 这句代码就是SQL的查询语句,即我们在浏览器中输入的地址中包含的参数就是
id′LIMIT0,1";这句代码就是SQL的查询语句,即我们在浏览器中输入的地址中包含的参数就是 id。
到此我们只知道我们输入的参数被带到数据库中查询,并不能确定存不存在注入漏洞。我们首先用最简单粗暴的方式验证一下,即在参数后面加一个单引号’,看网页的变化:
网页报错了,我们去看一下我们加进去的单引号在源代码中是怎么样的:
可以看到加进去的单引号在变量id的后面与前面的单引号构成了闭合,原来的后半个单引号成了多余的符号,所以查询语句不能正常理解而报错。由此可以判断此处存在注入漏洞了。
那么我们怎么判断它是数字型还是字符型注入呢?我们用一个逻辑运算符来验证:and ,在后面加上and 1=1或=2,构造查询语句:
此时的返回是正常的,因为1=1是真命题,再来判断1=2的假命题:
为什么1=2还是能正常返回呢?我们把参数带到源代码里看看:(参数的值为“1 and 1=2”原样带到源代码中看为什么能正常返回)
此时我们能看到变量id的值是引号里的值,显然不符合sql语句,正常的语句应该是:‘1’ and 1=2 如此才能构成符合sql语句,所我们再次在地址栏里构造查询语句(1后加个单引号与前面的闭合)如下:
可以看到已经返回了错误提示,那么当然了1=2是假命题所以返回错误提示是我们想要的结果,我们再来看看源代码中是什么样的:
当然,为了不被返回错误信息和不返回信息干扰,我们一般使用–+来注释掉后面的内容,如:
此时它只是不返回内容。
如上说明了此处存在SQL注入,且是数字型注入。字符型的漏洞详解将在之后的文章中详细分析,敬请期待!