【Web安全】XSS漏洞原理与DVWA实战分析

张开发
2026/4/10 3:03:53 15 分钟阅读

分享文章

【Web安全】XSS漏洞原理与DVWA实战分析
引言什么是 XSS在 Web 安全领域XSS跨站脚本攻击 绝对是“榜一大哥”级别的存在常年占据 OWASP Top 10 榜单。很多人一听“跨站脚本”就觉得是黑客攻破了服务器。其实不然。XSS 的本质不是攻击服务器而是攻击浏览器的用户。简单来说XSS 就是黑客利用网站的漏洞将恶意代码通常是 JavaScript 注入到网页中。当受害者浏览这个网页时浏览器会“傻傻地”执行这些代码从而导致用户信息如 Cookie、密码被窃取或者页面被篡改。为了让你一眼看懂我们可以把 XSS 分为三种类型我用三个生活中的例子来打比方。一、 反射型 XSS伪装成作业的漫画书场景比喻黑客把一本漫画书伪装成作业本的封面扔在地上。受害者捡起来以为是同学的作业就好心拿去交给老师服务器。老师没细看直接当着全班同学的面打开念了出来“这是一本漫画书”受害者以为自己在交作业点击正常链接。老师服务器只是把收到的东西原样念出来反射。结果恶意内容被执行了。技术原理反射型 XSS 是非持久化的。1.黑客构造一个包含恶意代码的 URL 链接例如http://site.com/search?qscriptalert(1)/script。2.受害者点击链接浏览器向服务器发送请求。3.服务器接收到请求把参数里的恶意代码原封不动地拼接在 HTML 页面里返回给浏览器。4.浏览器收到响应发现里面有 script 标签于是执行。特点 必须诱导用户点击链接通常通过钓鱼邮件代码不存储在服务器上是一次性的攻击。Security Level: Low状态毫无防备现象我们在输入框输入 img srcx onerroralert(12)页面直接弹窗。分析代码对用户的输入没有任何过滤或转义。服务器像复读机一样把你输入的内容直接拼接到了 HTML 中。这里将版本信息以弹窗的形式进行展示了Security Level: Medium状态简单的关键词屏蔽现象如果你输入 script页面会提示“非法字符”或者弹窗失败。分析查看源码发现开发者使用了 str_replace 函数把 script 这个单词替换成了空。绕过技巧JavaScript 是不区分大小写的既然它只过滤了小写的 script我们用大写试试Payload这里通过大小写直接绕过发现直接执行了除了大小写还可以双写绕过将弹窗内容改成获取cookie就可以看到弹窗已经出现了Security Level: High状态正则匹配与更严格的过滤现象即使你用了大小写绕过ScRipt依然无法弹窗。分析查看源码开发者使用了正则表达式 preg_replace并且加上了 i 修饰符忽略大小写。这意味着无论你用 script 还是 SCRIPT都会被干掉。绕过技巧既然 script 标签被彻底封死我们就不用它了。我们可以利用 HTML 的事件属性比如 img 标签的 onerror 事件。这个标签通常用于加载图片不容易被误判为脚本。因为对script进行了限制所以直接换成img也是获取到了cookie值二、 存储型 XSS公告栏上的涂鸦场景比喻黑客趁人不注意在学校的公告栏数据库上贴了一张带毒的告示。之后任何路过并阅读公告栏的人所有用户都会看到这张告示并受到影响。技术原理存储型 XSS 是持久化的危害最大。1.黑客在网站的留言板、评论区或个人资料里提交了一段恶意代码。2.服务器没有过滤直接把这段代码存入了数据库。3.当其他用户访问这个页面时服务器从数据库取出数据拼接在 HTML 中返回。4.用户的浏览器执行了这段代码。特点 不需要诱导点击只要访问页面就会中招。黑客可以批量窃取所有访问者的 Cookie甚至通过蠕虫传播控制整个网站。Level: Low (完全开放)现状页面有两个输入框Name名字和 Message留言。Name前端限制了长度比如只能输 10 个字但后端没限制。Message没有任何过滤直接存入数据库。攻击思路既然是留言板我们就把恶意代码当作“留言内容”发出去。这里漏洞就是在发布框里面了Level: Medium (过滤 长度限制)现状Message 框使用了 strip_tags() 和 htmlspecialchars()这意味着 script 标签在这里完全失效会被转义成纯文本。Name 框过滤了 script 字符串。长度限制前端限制只能输 10 个字符。攻击思路Message 已经废了我们只能攻 Name。但是 Name 太短了10 字符连 script 都写不下。怎么办方法抓包修改长度限制。操作步骤打开抓包工具Burp Suite在 Name 框输入长一点的 Payload比如 scriptalert(1)/script。点击提交拦截请求。在 Burp Suite 中找到 txtName 参数把后面的数据改成 Payload。删除 Content-Length 这个头或者修改它的数值因为我们要突破长度限制。转发数据包。Payload放在 Name 里你可以使用双写绕过也可以直接用 img 标签直接抓包将绿框内容改一下就可以了最后也是成功弹窗并显示1了Level: High (正则过滤)现状Message 框依然被严格转义无法利用。Name 框使用了正则表达式 preg_replace过滤了 script不区分大小写。依然有长度限制。攻击思路既然 script 被正则死死盯住那我们就彻底放弃它使用 img 标签。虽然要抓包绕过长度限制但 img 标签本身不会被正则误杀。操作步骤抓包。修改 txtName 参数。这里也是进行抓包修改参数放行发现成功执行了可以看见也是成功上传了三、 DOM 型 XSS自作聪明的秘书场景比喻老师服务器给了你一个任务清单JS代码让你“把黑板URL上的名字抄下来”。黑客偷偷把黑板上的名字改成了“把墙刷红”。你浏览器是个只会听指令的机器人看到任务清单后就真的去读黑板结果把墙刷红了。注意老师给你的清单本身没问题是你执行任务时“自作聪明”读错了数据。技术原理DOM 型 XSS 是纯前端的漏洞服务器完全不知情。1.黑客构造一个包含恶意数据的 URL通常在 # 后面。2.浏览器请求页面服务器返回的是干净的 HTML/JS 代码。3.但是前端 JS 代码逻辑不严谨例如使用了 document.location.hash 获取参数并用 innerHTML 写入页面。4.浏览器执行 JS 时读取了 URL 中的恶意数据并渲染导致代码执行。特点 流量不经过服务器WAF防火墙很难拦截因为服务器看到的请求是正常的。

更多文章