javascript - URL 上的 HTML <script> 片段可以用于纯客户端应用程序中的 XSS 吗?

原文 标签 javascript html http security xss

背景

假设我有以下网页:

<html>
  <script>
    document.write('querystring=' + location.search.substr(1));
  </script>
<html>

我在这样的 URL 打开它:

http://completely-secure-site/?<script>alert('fsecurity')</script>

在尝试过的所有浏览器(Chrome 57、Firefox 52 和 Safari 10)中,结果是:

querystring=%3Cscript%3Ealert(%27fsecurity%27)%3C/script%3E



因为尖括号<>not valid URL characters它们似乎在进入 JS 运行时之前被浏览器自动编码。

我的假设

这让我相信只是 使用 document.write 在客户端直接呈现查询字符串永远安全 ,而不是可能的 XSS 向量。 (我意识到应用程序当然还有很多其他方式容易受到攻击,但让我们坚持这里描述的具体情况。)

我的问题

我在这个假设中正确吗?
  • URL 中不安全字符的入站编码是否在所有合理的浏览器中标准化/强制执行? (没有可能的 XSS)
  • 或者,这只是我不应该在全局范围内依赖的某些(现代?)客户的细节/实现细节吗? (上面描述的 XSS 理论上是可能的)


  • 与问题无关,但很有趣。如果我先解码 URI,那么浏览器的行为就会不同:document.write(decodeURI(location.search.substr(1))); . XSS Auditor在 Chrome 和 Safari 中阻止页面,而 Firefox 显示警报。

    最佳答案

    如果我使用查询字符串 ?<script>alert("d")</script>在 Windows XP 上的 IE6 上,我得到注入(inject)的代码显示警报,这也发生在使用 decodeURIdecodeURIComponent在页面中,所以我会说你的第二个假设是正确的,如果 IE6仍然是一个合理的浏览器:这是现代浏览器的一个特性

    我还看到 Firefox 53 在使用解码方法时显示注入(inject)的 XSS 警报,Opera 44 和 Chrome 57(全部在 Windows 上)阻止代码。

    关于javascript - URL 上的 HTML <script> 片段可以用于纯客户端应用程序中的 XSS 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43436111/

    相关文章:

    javascript - 如何在 Darkroom.JS 中应用 ImageData 像素转换?

    javascript - 如何通过onClick()函数保留highchart折线图 - php mysql

    javascript - 检查select2下拉列表以进行强制字段验证的条件

    php - 上传文件时克服主机对 PHP/POST 数据的最大文件大小限制?

    javascript - Data.filter在IE 8中不起作用?

    security - HTTP 摘要身份验证

    html - Chrome和Safari缓存302重定向

    javascript - 在 Knockout 评论中自动关闭 <a> 标签

    api - 如果CORS header “Access-Control-Allow-Origin”为“*”且CORS请求未成功,则不支持凭据

    javascript - 防止在 IE 中调整 contenteditable div 中的按钮大小