盲注的简单定义:
我们在查询过程中,页面只有两种情况:“true”和“false”,要么有,要么没有;查询表的记录和语句错误也不会显示。这种状况下的注入,称为盲注。
盲注的关键点:
根据页面返回内容分析payload中的问题是否为真,然后通过多次测试遍历出想要的结果
布尔盲注方法:
1、尝试是否存在注入漏洞:
注入语句:?id =1 and 1=1 和 id = 1 and 1=2
判断结果:如果两次返回的页面不同,那么就说明存在SQL注入漏洞
2、猜测数据库字长:
注入语句:?id=1 and (length(database()))>10
然后逐步增大或减小数值,这里可以使用二分法来判断,直到确定数据库名称大小
3、猜测数据库名称:
原理:在知道数据库的长度之后,我们可以尝试用盲猜的方式一个一个尝试数据库的字符是否正确,用的方法就是截取字符并且取ascii码值
注入语句:?id =1 and ascii(substr(database(),1,1))>100
我们可以一点一点的尝试,确定字符之后再一个一个的向下截取。
4、猜测数据库中的表数量:
注入语句:?id = 1 and (select count(table_name) from information_schema.tables where table_schema=database())=1;
将数字不断累加判断;
5、猜测数据库中的表数据:
利用相同的方法,猜测:
a)一个表中的第一个字符
b)字段长度
c)第一个字段全名
d)字段内容的条数
e)字段第一条的具体内容
时间盲注方法
原理:和布尔盲注基本一致,但是用的方式不太相同,这里是用的休眠这种方式,如果你想知道的payload正确(当然也可以设置成错误),那么就休眠
注入语句:?id =1 and if(length(database())=10,sleep(10),0);
相关函数:
length()函数:
length()函数的作用是返回字符串参数的长度,以字节为单位。一个多字节字符算作多字节
substr()函数:
从字符串的特定位置开始返回一个给定长度的子字符串
该有三个参数:str,pos,len
str代表要截取的字符串,pos代表从截取开始的位置,len表示字符串截取的长度即子字符串的长度
相似函数:mid()、substring()
ascii()函数:
返回某个字符的ascii码值,且该函数处理单个字符,如果是字符串则会处理第一个字符
sleep(n)函数:
将程序挂起一段时间,具体时间为参数n秒
if(condition,value_if_ture,value_if_false)函数:
判断函数,如果第一个参数为真则执行第二个参数,为假则执行第三个参数
相关术语
payload:
即有效载重。有效载重说明载重是有意义的;进而理解payload应该是一系列信息中的关键信息