ad_js.php getshell,Dedecms 后台getshell

原文链接:传送门

虽然是复现文章,不过会更详细地来阐释这个漏洞,,因为现在后台getshell花样层出不穷,因此想要复现一波来学习一波getshell姿势~

因为是最新的dedecms版本,因此我们直接在织梦官网上下载即可~

http://www.dedecms.com/products/dedecms/downloads/

DedeCMS V5.7 SP2正式版

59e94be160da03f395a5e213f886e28f.gif

发布日期: 2017-04-05

这里我测试的是utf-8版本,,感觉版本这个无所谓~

下载下来然后安装什么的就不说了,,直接进后台,找到漏洞功能以及对应的功能函数

7f9db74b45a8b6c9d015d648f6ec16b8.png

漏洞在"模块"下的"广告管理"处,这里我们点击“添加一个新广告”

a7420b62da64db96779641573d0c54d5.png

跟原文复现的有一点不一样,,不过不影响,,下面我们来抓包看看参数

f71b1168f2d8284c8b3a7043cde307d8.png

我们的参数在normbody里,文件为dede/ad_add.php

$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");

exit();

1

2

3

4

5

6

7

$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");

exit();

在这里我们看到了我们的代码已经插入到了数据库,,一般的思路应该是找哪些php文件调用了这个广告代码,但是点击我们的广告代码就出现了地址

25efc1d58dd6a24dee64256340c8ce93.png

/plus/ad_js.php?aid=3,ad_js.php这个文件是专门调用广告代码的。。

下面我们进入这个文件来看看是怎么调用的

$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 < $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";

$fp = fopen($cacheFile, 'w');

fwrite($fp, $adbody);

fclose($fp);

}

include $cacheFile;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

$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

$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";

$fp=fopen($cacheFile,'w');

fwrite($fp,$adbody);

fclose($fp);

}

include$cacheFile;

这里首先是三个判断条件,nocache不为空,cachefile不为空,这些判断条件我们都可以通过GET或者POST来提交,从而进行伪造~

进入判断条件后往下走,首先是从数据库中select aid,那么这时候我们到数据库中去看看

e8d27bed2489872f04570e194e8647f2.png

这里当时在填写广告信息的时候,设置的timeset为0,因此也就直接令$adbody = $row['normbody'];

而这里的normbody也就是我们的evil code,下面我们就应该重点看这个adbody参数

首先进行三个replace,这里的replace好像对我们的参数没有影响,因此直接跳过~

接着将adbody参数插入到document.write()代码中,这里如果做过ctf的人都应该有一种感觉,那就是参数闭合的话,将会造成任意代码执行,这里也就是漏洞的成因所在!

最后打开cachefile,将adbody写入到文件中~

这里由于这个文件是html静态文件,,因此没有可利用点,,还是找下文件吧,,

WWW\uploads\data\cache\myad-3.html

b5944d1148e259630d7a588f5d8114c9.png

如果是动态文件,,因此我们也可以利用前后闭合来实现任意代码,,扯远了。。

总结来说其实就是$adbody = "\r\n"; 这段代码出的问题

下面我们来构造参数进行poc验证~

首先是访问给的广告链接

d087e9d0cbee2529d0caa315f8e3a589.png

这里我还没输入参数,,下面输入参数逐步进行循环~

其实也就是两个判断条件和一个代码的执行~

55c9b8c16c126eb6f9679cb7948444c8.png

这里url不用说,,就是给的广告链接,,其中GET了aid参数,,因此我们只要加上nocache参数,来实现isset($nocache),至于!file_exists($cacheFile)这个刚才文件都找到了,,肯定存在的。。

最后就是就是代码执行,,这里一开始有强迫症,我一定要闭合参数!(下面就是闭合问题的一个尝试)

35143a626d59f5825acdb9cb76f84645.png

这里一开始很不解,,这出现的是啥?

");

-->

1

2

3

");

-->

这是源码,,我们插入了-->这段,,但是双引号没闭合啊!也就是页面语句实际成了下面这样

"); -->

1

2

");-->

因此也就出现了上面的情况,,这里不太理解,,这样不闭合竟然可以。。

但是我有强迫症。。

88155b923d55c225867c93c48961184e.png

最后强行闭合。。虽然对结果没影响。。

上述如有不当之处,敬请指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值