前言
最近看到几个公众号都披露了DedeCMS的漏洞,很久也没有分析过PHP的漏洞了,趁着周末没什么事情分析下这两个漏洞。
V5.8.1内测版前台RCE
这个漏洞在这篇文章有过分析,但我还是决定自己搭建好环境分析一下,以便自己能理解的更加深刻。
分析过程
在DedeCMS中,当访问出现某些异常,Dede会弹出一个窗口给用户提示。
而这个页面的生成和处理主要是由ShowMsg
方法完成的。生成的页面包含一个跳转地址,如果这个地址在函数调用时设置为-1
,则会去接收Referer头中的地址。
将Referer中接收的内容放到msg
中,并通过Dede的模板渲染。
1 | $func .= "var pgo=0; |
在Display
函数中,通过WriteCache
将内容写入到缓存文件并进行文件包含。
1 | public function Display() |
虽然看上去可以直接命令执行,但是我们注意到在写入缓存前会先调用CheckDisabledFunctions
检查Disablefunction, 这里检查了常见的敏感函数,但是我们仔细分析会发现这里其实只是检查了敏感的字符串
,我们可以直接利用反引号命令执行。
漏洞总结
是否有其他点可以造成漏洞?
虽然看网上的文章是利用了flink.php
这个文件来进行利用的,可了解漏洞原理后会发现,只要是调用了ShowMsg
函数并且第二个参数为-1
的都有可能导致这个漏洞。而似乎能够未授权访问的都在plus
目录下,所以只要在这个目录下找都是可以无限制RCE的。
比如在search.php
中,当keyword
包含一些敏感字符串或者字符长度小于2时,也会导致这个漏洞。
再仔细分析一下,其实也不是只有在ShowMsg
中才能造成漏洞,只要在加载模板的过程中通过LoadString
加载,并且$msg
的内容可控就可以了。
1 | $tpl = new DedeTemplate(); |
但是除了ShowMsg
直接调用了LoadString
只有在SetString
中调用了,而SetString
并没有任何调用。
还有一种可能也可以导致漏洞,就是如果Showmsg
函数中的msg
或gourl
的值可控也可以导致漏洞。
比如在user-do.php
中,当用户名不合法时,我们输入的用户名会被带入到ShowMsg
的参数中。
也有些文件第二个参数可控也可以造成漏洞。
其他版本是否受影响
下载DedeCMS 5.7.7
版本测试,在Showmsg
中并不会接收refere头中的信息,所以此处无法利用。
但前面分析过也可以通过控制msg
或者gourl
参数来利用,仅仅从上面来看不能说一定没有,主要还是看下面,在这个版本的Dedecms中,获得msg
后直接通过echo输出,并没有通过模板渲染所以从根源上就不会出现上面的问题了。
并且在Display
函数中也是直接输出解析模板,没有文件包含操作。
下载最新的5.8.0
版本和5.7.7
版本一样,都没有使用模板处理,所以也不会导致漏洞。