网页挂马常见漏洞分析与检测
字数 1561 2025-08-18 11:37:37
网页挂马漏洞CVE-2018-8373分析与检测技术文档
一、漏洞概述
CVE-2018-8373是2018年8月由趋势科技披露的一个IE浏览器漏洞,属于VBScript引擎中的释放后重用(UAF)漏洞。攻击者通过构造特制的网页,可以在受害者访问时实现远程代码执行,常被用于"Drive-By-Download"攻击(网页挂马)。
二、漏洞技术分析
2.1 漏洞触发机制
该漏洞的核心在于VBScript中对动态数组处理不当导致的释放后重用问题,具体流程如下:
-
类初始化阶段:
- 通过
new创建类实例时,调用vbscript!VBScriptClass::Create和vbscript!VBScriptClass::InitializeClass - 在类初始化中尝试创建数组,但初始创建失败(维度为空)
- 通过
-
数组重定义阶段:
- 使用
Redim重新定义数组为一维数组(长度3) - 由于初始创建失败,实际再次调用
vbscript!MakeArray创建新数组
- 使用
-
漏洞触发阶段:
- 访问数组元素时调用
vbscript!AccessArray和vbscript!AssignVar - 在赋值操作中,源操作数获取时触发
Public Default Property Get - 期间会调用
vbscript!RedimPreserveArray重新分配数组内存 - 导致目标地址被释放但后续仍被使用(UAF)
- 访问数组元素时调用
2.2 关键数据结构
-
VARIANT类型:
typedef struct tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { // 各种类型数据 }; } VARIANT; -
tagSafeArray(动态数组结构):
typedef struct tagSAFEARRAY { USHORT cDims; // 维度数 USHORT fFeatures; // 特征标志 ULONG cbElements; // 元素大小 ULONG cLocks; // 锁计数 PVOID pvData; // 数据指针 SAFEARRAYBOUND rgsabound[1]; // 维度信息 } SAFEARRAY;
2.3 漏洞利用技术
攻击者利用该漏洞的主要步骤:
- 通过UAF控制释放的内存区域
- 构造大量二维数组占用释放的内存块(大小0x30)
- 伪造二维数组的第一维度长度为任意值
- 利用堆块头部8字节错位,修改伪造数组的头4字节
- 创建伪造的全局可读写数组(长度0x7ffffff)
- 实现任意内存读写,进而执行shellcode
三、漏洞检测技术
3.1 静态检测方法
关键检测特征:
Public Default Property Get声明Redim或Redim Preserve关键字- 动态数组的创建和修改操作
- 类初始化中的数组操作
注意:Initialize_Class不是必要检测字段,攻击代码可能省略
3.2 动态检测方法
建议Hook的关键函数:
vbscript!MakeArray:数组创建vbscript!RedimPreserveArray:数组重分配vbscript!AssignVar:变量赋值vbscript!AccessArray:数组访问
监控点:
- 数组创建与释放的时序关系
- 内存释放后又被使用的行为
- 异常的数组维度修改操作
3.3 高级检测技术
-
行为检测:
- 检测堆喷射(Heap Spray)行为
- 检测ROP链构造
- 检测异常的全局读写操作
-
机器学习检测:
- 基于VBScript代码特征的分类模型
- 异常行为模式识别
四、防护建议
- 及时更新:安装微软提供的安全补丁
- 禁用VBScript:在不需要的场景下禁用IE的VBScript支持
- 深度防御:
- 启用DEP(数据执行保护)
- 启用ASLR(地址空间布局随机化)
- 启用CFG(控制流防护)
- 监控措施:
- 部署网络流量检测系统
- 监控异常的脚本解释行为
五、技术验证POC分析
简化版漏洞触发代码结构:
Class MyClass
Public Default Property Get P
Redim array(2)
End Property
Private Sub Class_Initialize()
Dim array()
End Sub
End Class
Sub Trigger()
Dim cls
Set cls = New MyClass
cls.array(2) = cls
End Sub
关键点说明:
- 通过
Class_Initialize初始化空数组 - 使用
Redim在属性获取时重定义数组 - 通过数组赋值操作触发UAF条件
六、参考资料
- 微软官方VARIANT类型定义
- Windows Kits头文件
- 趋势科技原始漏洞报告
- 看雪论坛相关技术分析文章
注:本文仅限技术研究与防御用途,严禁用于非法活动