从历史漏洞学习漏洞挖掘

本篇文章会从复现mrdoc任意文件读取漏洞为入口,记录一下怎么用类似的思路去寻找其他的漏洞。

影响版本:

commit提交记录是2月一号,但是最近一次 release版本时 2个月前v0.9.2,大概 v0.9.2以下的版本都存在漏洞.

Commit记录:

https://gitee.com/zmister/MrDoc/commit/b634cf84eedb669fc1f11ce87558b0b045301af1

漏洞分析:

通过commit记录可以看到是对变量 media_filename 进行了处理, 那么感觉问题就出现在 media_filename 这个变量,我们下载下项目,切换到修复前的版本:

git clone https://gitee.com/zmister/MrDoc.git
git checkout d1ce

定位一下漏洞位置 app_doc/report_utils.py#152

这段代码就是从markdown文件中去查找静态资源,然后对查找到的每个静态资源进行路径处理,最后移动到一个文件中进行下载。
先来看第一个正则表达式:pattern = r"\!\[.*?\]\(.*?\)",他是用来匹配

![]()

格式的字符串, 当然如果你对正则不熟悉,直接去问AI也行:

接着会从匹配到的每个字符串中取出括号() 中的内容, 并进行资源目录查找,其中要求了加载资源地址需要是以 /media 开头, 到这里基本上都能猜到payload的形式了, 无非就是 /media/../../../xxx ,
先吧这个函数取出来测试一下, 其中self.media_path 等一些路径变量我就先随便模拟了:

import re
import os
import pathlib
from urllib.parse import unquote

md_content = '''
![example_image](/media/../requirements.txt)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值