最近在CTF_HUB上看到任意文件读取的一道web渗透测试题,详见ctfhub 中web afr-3,突然想到2020年参加网鼎杯白虎组,有个picdown的题目大同小异,手法相似,对任意文件读取漏洞的危害做个总结。
在afr-3中,任意文件读取漏洞如下,首先进入首页,如下图:
点进去,首页是个输入框,输入test,提交查询,如图:
在输入框这个地方存在xss,不过暂时先不管这个,重点关注任意文件读取。看到url中有个name=article,这个参数,猜测这个参数是突破点,将article改为article2,报错如图:
从报错可以看出name参数可以读取到系统文件,尝试读取/etc/passwd,如图:
确认name参数存在任意文件读取漏洞后,直接查看proc文件夹下的相关信息,如cmdline,cwd等文件夹,访问/proc/self/cmdline,如图,
说明存在当前目录下存在server.py文件,读取server.py文件,如图:
整理一下源代码,如图:
从源代中可以看到name参数中,存在任意文件读取漏洞,因为过滤了flag,不能直接看到flag文件中的内容。第9行中可以看到flag已经放到FLAG变量中。最开始想方设法绕过page.find的过滤,最终放弃。发现在24行中存在ssti模板注入漏洞。
但注入的内容,必须通过session获取,就是说要伪造session,构造ssti注入。伪造flask的session,必须知道secret_key,从源代码中可以看到,secret_key在key.py文件中,读取key.py文件中的内容如下:
利用flask-session-manage,可以伪造session,使用方法如下,详细用法见github官网说明。
伪造{"n1code":"{{''.__class__.__mro__[2].__subclasses__[2]("flag.py").read()}}"}的session,如图:
改为post请求,修改session,结果如图: