XSS- 跨站点脚本:DOM 问题

Posted

技术标签:

【中文标题】XSS- 跨站点脚本:DOM 问题【英文标题】:XSS- Cross-Site Scripting: DOM issue 【发布时间】:2014-05-07 04:27:31 【问题描述】:

Fortify 扫描将此以下错误视为严重错误。有人可以帮忙吗?

switchcontent.loadpage=function(page_request, header) var innercontent=document.getElementById(header.id.replace("-title", "")) //引用这个header的内容容器 innercontent.innerhtml=switchcontent_ajax_msg //显示“获取页面消息” if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)) innercontent.innerHTML=page_request.responseText header.ajaxstatus="加载"

为了避免 XSS ,修复此代码需要进行哪些更改?任何帮助是极大的赞赏。谢谢。

【问题讨论】:

【参考方案1】:

在 responseText 中是否插入了 HTML 标记,或者只是您想要插入/更改的文本?根据经验,始终清理/编码从用户输入生成的所有用户输入和输出。如果您插入的只是文本,请使用 document.createTextNode (example) 并将文本附加到需要的元素(也总是编码),我建议使用 jQuery .text() 与纯 javascript 一样,这有点麻烦。如果需要插入的是 HTML,请确保它不是用户输入,因为这是一个漏洞。如果文本需要来自用户,请使用白名单来检查用户是否只编写您期望的标签,例如 <p></p>

Fortify 将此视为漏洞,因为如果用户发送 responseText <script>alert('XSS')</script>,页面会将其呈现为 HTML,如果您对其进行编码,脚本将被执行,它只会显示为文本而不被执行,不仅可以执行脚本,但 HTML 也会被渲染并使您的页面变形。您可以阅读更多内容:OWASP DOM Prevention Sheet

积分:

1:始终对用户输入进行编码!

2:如果只是文本,则创建文本节点并将它们附加到元素以使其更容易使用 jQuery 函数 .text() 而不是 .html(),因为 .htlm() 函数将呈现 HTML。

3:如果它是用户生成的 HTML 清理恶意标签和白名单,你可以做黑名单,但黑名单并不安全,因为总有标签你可能会忘记检查。

4:如果 HTML 是服务器生成的并且没有用户输入,那应该没问题。

5:要知道 Fortify 只是一个扫描工具,它有误报,所以如果你有正确的对策,你应该没有 XSS。

白名单:再次检查可用标签列表。只允许您知道用户可以使用的标签,例如<p></p><br/>

黑名单:检查“不受欢迎”标签列表。这意味着拥有一个包含您不想让用户使用的标签的列表。

【讨论】:

感谢您提供的信息。这很有帮助。

以上是关于XSS- 跨站点脚本:DOM 问题的主要内容,如果未能解决你的问题,请参考以下文章

请教关于使用appscan 检测"基于DOM的跨站点脚本"漏洞修复问题

playframework 1.x 是不是处理跨站点脚本 (xss)?

经典 ASP :: 跨站点脚本 (XSS) 验证不良问题

跨站点脚本编制-XSS 描述及解决方法

如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗

PortSwigger 跨站点脚本(XSS)