Discuz!X ≤3.4 任意文件删除漏洞分析及解决方法 [复制链接]

moqu8 2017-10-1

3695 0
94f0a3f7-a97e-413b-bdbd-fbee41b4d568.png
[p=null, 2, left]作者:LoRexxar'@知道创宇404实验室[/p][p=null, 2, left]日期:2017年9月30日[/p]
[p=null, 2, left]0x01 简述[/p][p=null, 2, left]Discuz!X社区软件,是一个采用 PHP 和 MySQL 等其他多种数据库构建的性能优异、功能全面、安全稳定的社区论坛平台。[/p][p=null, 2, left]2017年9月29日,Discuz!修复了一个安全问题用于加强安全性,这个漏洞会导致前台用户可以导致任意删除文件漏洞。[/p][p=null, 2, left]2017年9月29日,知道创宇404 实验室开始应急,经过知道创宇404实验室分析确认,该漏洞于2014年6月被提交到 Wooyun漏洞平台,Seebug漏洞平台收录了该漏洞,漏洞编号 ssvid-93588。该漏洞通过配置属性值,导致任意文件删除。[/p][p=null, 2, left]经过分析确认,原有的利用方式已经被修复,添加了对属性的 formtype 判断,但修复方式不完全导致可以绕过,通过模拟文件上传可以进入其他 unlink 条件,实现任意文件删除漏洞。[/p][p=null, 2, left]
[/p][p=null, 2, left]0x02 复现[/p][p=null, 2, left]登陆DZ前台账户并在当前目录下新建 test.txt 用于测试[/p]
b7fd2c4d-f906-4df0-89c3-f25835c9e27e.png
[p=null, 2, left]请求[/p]


1
2
home.php?mod=spacecp&ac=profile&op=base
POST birthprovince=../../../test.txt&profilesubmit=1&formhash=b644603b

[p=null, 2, left]其中formhash为用户hash[/p][p=null, 2, left]修改成功之后出生地就会变为../../../test.txt[/p]
49a0713f-3e5d-4a36-b41c-8109a840828c.png
[p=null, 2, left]构造请求向home.php?mod=spacecp&ac=profile&op=base上传文件(普通图片即可)[/p][p=null, 2, left]请求后文件被删除[/p][p=null, 2, left]
[/p][p=null, 2, left]0x03 漏洞分析[/p][p=null, 2, left]Discuz!X 的码云已经更新修复了该漏洞[/p][p=null, 2, left]https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574 [/p][p=null, 2, left]核心问题在upload/source/include/spacecp/spacecp_profile.php[/p]
a664355a-843c-47f3-85ed-371c787bd883.png
[p=null, 2, left]
[/p][p=null, 2, left]0x03 漏洞分析[/p][p=null, 2, left]Discuz!X 的码云已经更新修复了该漏洞[/p][p=null, 2, left]https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574 [/p][p=null, 2, left]核心问题在upload/source/include/spacecp/spacecp_profile.php[/p]
9012b040-196c-4f8d-9239-1f1871c8ae7e.png
[p=null, 2, left]跟入代码70行[/p]

1
if(submitcheck('profilesubmit')) {

[p=null, 2, left]当提交 profilesubmit 时进入判断,跟入177行[/p]
53dae5cc-0213-45b2-b3c2-234fcee99383.png
[p=null, 2, left]我们发现如果满足配置文件中某个 formtype 的类型为 file,我们就可以进入判断逻辑,这里我们尝试把配置输出出来看看[/p]
b233fa97-a939-40c0-9798-8891243d191c.png
[p=null, 2, left]我们发现formtype字段和条件不符,这里代码的逻辑已经走不进去了[/p][p=null, 2, left]我们接着看这次修复的改动,可以发现228行再次引入语句 unlink[/p]

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

[p=null, 2, left]回溯进入条件[/p]
0a5f346c-4bc7-4f5b-b9c2-404fe2f96e0d.png
[p=null, 2, left]当上传文件并上传成功,即可进入 unlink 语句[/p]
8adfdc23-3e75-4713-ba5a-4ce37eb838ea.png
[p=null, 2, left]然后回溯变量$space[$key],不难发现这就是用户的个人设置。[/p][p=null, 2, left]只要找到一个可以控制的变量即可,这里选择了 birthprovince。[/p][p=null, 2, left]在设置页面直接提交就可以绕过字段内容的限制了。[/p]
2a4fcc0e-d635-47b7-bdfd-6632585e0635.png
[p=null, 2, left]成功实现了任意文件删除[/p][p=null, 2, left]
[/p][p=null, 2, left]0x04 说在最后[/p][p=null, 2, left]在更新了代码改动之后,通过跟踪漏洞点逻辑,我们逐渐发现,该漏洞点在 2014 年被白帽子提交到 Wooyun平台上,漏洞编号wooyun-2014-065513。[/p][p=null, 2, left]由于DZ的旧版代码更新流程不完整,已经没办法找到对应的补丁了,回溯到 2013 年的 DZ3 版本中,我们发现了旧的漏洞代码[/p]
1f7e05c7-db83-47b9-a4c2-783b17ec5586.png
[p=null, 2, left]在白帽子提出漏洞,可以通过设置个人设置来控制本来不可控制的变量,并提出了其中一种利用方式。[/p][p=null, 2, left]厂商仅对于白帽子的攻击 poc 进行了相应的修复,导致几年后漏洞再次爆出,dz 才彻底删除了这部分代码...[/p][p=null, 2, left]期间厂商对于安全问题的解决态度值得反思...[/p]
[p=null, 2, left]0x05 Reference[/p][p=null, 2, left][1] Discuz!官网[/p][p=null, 2, left]http://www.discuz.net [/p][p=null, 2, left][2] Discuz!更新补丁[/p][p=null, 2, left]https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574 [/p][p=null, 2, left]
[/p][p=null, 2, left][/p][p=null, 2, left]【解决方法】[/p][p=null, 2, left]下载解压包,解压覆盖到source/include/spacecp/spacecp_profile.php[/p][p=null, 2, left]
[/p][p=null, 2, left] 点击下载 spacecp_profile.rar(大小:4.67K)[/p]



最新回复 (0)
返回
支持中心
邮箱:winkill2012@qqcom
新站优化中!部分功能尚未完善,敬请谅解!
支持中心