DVWA靶场XSS(Stored)学习分享
字数 1481 2025-08-24 20:49:31
DVWA靶场存储型XSS(XSS Stored)漏洞学习指南
1. 存储型XSS概述
存储型XSS(Stored Cross-Site Scripting)是一种将恶意脚本永久存储在目标服务器上的XSS攻击类型。与反射型XSS不同,存储型XSS的恶意代码会被保存在数据库中,当其他用户访问受影响页面时,恶意代码会被执行。
2. DVWA靶场存储型XSS漏洞分析
2.1 Low级别漏洞
代码分析:
- 使用
trim()函数移除字符串两侧的空白字符 - 使用
mysql_real_escape_string()函数转义特殊字符 - 使用
stripslashes()函数删除反斜杠
漏洞原因:
- 对输入没有做XSS方面的过滤与检查
- 恶意代码直接存储在数据库中
利用方法:
- 在message栏输入:
<script>alert(/xss/)</script> - 对于name栏(前端有字数限制):
- 审查元素修改长度限制
- 或抓包修改name参数为:
<script>alert(/name/)</script>
2.2 Medium级别漏洞
代码分析:
- 使用
strip_tags()函数剥去HTML、XML和PHP标签(但允许使用<b>标签) - 使用
addslashes()函数在预定义字符前添加反斜杠 - 对message参数使用
htmlspecialchars函数编码 - 对name参数简单过滤
<script>字符串
漏洞原因:
- 仅过滤了
<script>标签,但过滤不彻底 - 允许其他HTML标签和事件处理器
绕过方法:
-
双写绕过:
- 修改name参数为:
<sc<script>ript>alert(/xss/)</script>
- 修改name参数为:
-
大小写混淆:
- 修改name参数为:
<Script>alert(/xss/)</script>
- 修改name参数为:
-
非script标签payload:
- ``
- 审查元素修改长度限制后提交
2.3 High级别漏洞
代码分析:
- 使用正则表达式过滤
<script>标签 - 忽略了img、iframe等其他危险标签
漏洞原因:
- 过滤不全面,只针对特定标签
- 没有对事件处理器进行过滤
利用方法:
- 修改name参数为:``
- 或审查元素修改长度限制后提交
2.4 Impossible级别防护
防护措施:
- 使用
htmlspecialchars函数对所有输出进行编码 - 注意:如果
htmlspecialchars使用不当,仍可能被绕过(特别是DOM型XSS)
3. 防护建议
-
输入验证:
- 对所有用户输入进行严格验证
- 使用白名单机制,只允许安全的字符和格式
-
输出编码:
- 对所有动态输出到页面的内容进行HTML编码
- 使用
htmlspecialchars等函数
-
内容安全策略(CSP):
- 实施严格的内容安全策略
- 限制脚本来源和内联脚本执行
-
框架防护:
- 使用现代框架(如React、Vue等)内置的XSS防护机制
- 避免直接使用
innerHTML等危险API
-
HTTP头设置:
- 设置
X-XSS-Protection头 - 设置
Content-Type头并禁用MIME嗅探
- 设置
4. 总结
存储型XSS因其持久性和广泛影响而特别危险。通过DVWA靶场的四个级别,我们学习了:
- 完全不防护的Low级别漏洞
- 简单过滤可被绕过的Medium级别
- 过滤不全面的High级别
- 使用正确编码的Impossible级别防护
在实际开发中,应当采用Impossible级别的防护思路,结合多种安全措施,才能有效防范存储型XSS攻击。