本篇文章会从复现mrdoc任意文件读取漏洞为入口,记录一下怎么用类似的思路去寻找其他的漏洞。
影响版本:
commit提交记录是2月一号,但是最近一次 release版本时 2个月前v0.9.2,大概 v0.9.2以下的版本都存在漏洞.
Commit记录:
漏洞分析:
通过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 = '''
