【问题标题】:XSS with javascript:alert()带有 javascript:alert() 的 XSS
【发布时间】:2019-05-21 20:16:40
【问题描述】:

我正在处理我们网站上的一些Reflected Cross-site scripting (XSS) 漏洞(php、html、...)AppSpider 报告了一个我无法解决的问题。

Location: javascript:alert(10829224)

通常 AppSpider 会列出带有 js 的 url。这次没有。它只列出查询字符串:url=javascript:alert(12345)

当我尝试通过将其添加到列出的页面的 url 来进行测试时,我什么也得不到:/path/to/page.html?url=javascript:alert(12345) 如果我添加脚本标签:/path/to/page.html?url=<script>javascript:alert(12345)</script> 我会弹出警报。

问题 1- 没有脚本标签的 javascript:alert() 是否有效?可行的js?

问题 2- 我怎样才能逃避或防止这种类型的攻击?

我们有代码可以过滤掉坏的 unicode 字符(感谢:http://stackoverflow.com/questions/3466035/how-to-skip-invalid-characters-in-xml-file-using-php)。它在取消<script></script> 标签方面效果很好,但显然在这种情况下它没有帮助。

感谢任何提示或技巧

【问题讨论】:

  • 使用正则表达式正确过滤您的 URL: Replace(url, @"[^-A-Za-z0-9+&@#/%?=~_|!:,.;() ]", "");并在您收到的所有输入上运行它。永远不要相信输入。
  • How does XSS work?的可能重复

标签: javascript php xss


【解决方案1】:

事实证明,我正在处理的页面需要$_REQUEST['url'] var 中文件的相对路径。因此,我能够采取不同的方法,然后尝试解析或替换 javascript。我使用了 php 的 parse_url() 函数。便宜的 hack,但它适用于这种一次性页面/案例。

if (isset($_REQUEST['url']) && valid_script_name_passed_in($_REQUEST['url']) ) {
 ...
}else{
 ...
}

function valid_script_name_passed_in($request_value){
    $parts = parse_url($request_value);
    if( is_array($parts) ){
        if( isset($parts['scheme']) || isset($parts['host'] ){
            return false;
        }
    }
    return true;
}

【讨论】:

  • 只有一个有效值的白名单并使用与该白名单完全匹配的字符串会更安全。
【解决方案2】:

在 URL 标记中使用“javascript:”将在单击链接时执行冒号后面的 javascript。

如果没有详细信息,无法确定地告诉您,但似乎警告是“URL=”容易受到用户修改,这将允许用户更改 url="javascript:[恶意代码here]" 注入恶意代码。

您曾经经常在有人可以将 URL 发布到其主页的网站上看到此问题,而无需检查,可以只包含一个 javascript。

你无法逃脱它,它需要在服务器端进行清理,以防止用户被允许插入 javascript 代码。

【讨论】:

    【解决方案3】:

    问题 1- 没有脚本标签的 javascript:alert() 是否有效?

    在您的网站上,查询字符串有时会呈现在页面上。如果它以 html 呈现 - 那么需要标签。如果它在 javascript 代码中呈现 - 那么它可能在没有标签的情况下工作。

    问题 2- 我怎样才能逃避或防止这种类型的攻击?

    一般的解决方案是在页面上打印用户的输入时转义。在 PHP 中,最好的函数是 htmlspecialchars。它将用 html 实体替换所有特殊字符。例如,它将 & 替换为 &amp 。这样文本看起来不会改变,但会阻止 XSS 注入。

    在您的情况下,我猜您希望 ?url=xxx 查询参数中有一个有效的 URL。然后转义将不起作用,因为转义会破坏 URL。在这种情况下,您可能想要验证提供的字符串是否是有效的 URL。 Here 讨论了几个 URL 验证选项。

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多