效果如下

漏洞分析

问题文件在\uploads\dede\makehtml_homepage.php中第44行开始

此处将一个静态文件模板进行更新,并且可控的写入了index.php之中。下好断点开始跟踪。

登陆后台在模板管理处,生成新的模板文件,并且写入一句话木马。这里的后缀名一定要htm。

保存以后,在生成功能=》更新主页HTML出进行模板替换。

点击更新主页。

PHPSTORM已经运行到断点代码了,开始跟踪代码流程

首先进入arc.partview.class.php文件中实例化了PartView对象。我们需要关注一下shell2.htm内容是否被改变以及是否写入了index.php之中。

这个对象对模板文件进行一些初始化的工作,例如读取路径之类的操作。

接着进入到SetTemplet函数。发现我们的shell2.htm被调用了

继续往下跟,找到读取文件内容的地方 LoadTemplate函数

在这里,我们的shell2.htm被打开,并且一次读取1024的长度。将读取到的字符串保存在SourceString之中。接下来的目标是看看这个变量是否被处理了。一步步跟代码会发现,SourceString参数并没有被处理。现在要达成getshell,只要保证最后生成的文件是php文件而且SourceString参数被写入。看最后保存文件的部分

目标文件index.php被引入了。往下执行,在SaveTo函数中,利用fwrite函数将$this->GetResult()的值写入,

我们看看GetResult的返回值。

很明显,在此处就将一句话木马写入了index.php之中,并且对后缀名并没有修改。

到此,漏洞复现成功。