前言

学习代码审计中,毕竟不会代码审计的安全人员不是一个好的安全人员。这是我写代码审计的第一篇文章,之前复现了Discuz!X 3.4的任意文件删除,那么我就来写写这个漏洞的成因。这个漏洞在我博客也是可以找到的,所以前面的话也不多说了,直接开始分析吧。

漏洞分析

这个漏洞的根本原因在于下图的代码

我们可以看到unlink函数后有个$space[$key],这个参数就是我们的个人设置,是从数据库中读取出来的,而从数据库中读取的数据是我们可以前台控制的数据,那么unlink后面的参数是不是就是可以控制的了。

在看别人的分析代码的时候,在这段代码之前也有个unlink,但是给修复了,所以不用管,我们这个这个版本的漏洞的成因就在这。

我们向前回溯一下,看看$space在哪

如图:$space = getuserbyuid($_G['uid']),就是获取uid相对应的用户

space_merge()函数的功能是把$space存入对应的数据表中,但是并无过滤

所以我们可以POST提交,修改个人资料,如下图,资料修改

space_merge函数把存入数据表,下图birthprovince的数据,这里数据不一致的原因是我截图的时候是又测试了下是否可重装。

在最后,上传图片,满足我们这个漏洞的if语句,就达到了任意文件删除的目的。