【问题标题】:XSS vulnerability when sending an URL to Safari iOS向 Safari iOS 发送 URL 时存在 XSS 漏洞
【发布时间】:2014-11-24 12:02:41
【问题描述】:


我的代码被扫描后, 该报告显示当我尝试在 Safari 应用程序中打开网页时发生 XSS 漏洞。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[event objectForKey:@"url"]]];

'event' 是一个 NSDictionary,我通过 NSURL 从我的服务器获取。

我知道要避免 XSS,您应该对输出进行编码。
但这会弄乱 URL 并且 Safari 无法打开正确的网页?

还是有其他原因导致问题?

我不熟悉安全性,所以任何指针都将不胜感激。

提前致谢!

【问题讨论】:

  • 我认为这是因为它是一个动态创建的 URL,您在将其传递给 openURL 之前没有对其进行验证:

标签: ios xcode security xss nsurl


【解决方案1】:

当应用尝试在 href 属性中反映输出时,可能会出现基于 URL 上下文的 XSS。

<a href="DATA_REFLECTS_HERE">DATA_REFLECTS_HERE</a>

您可以看到相同的变量可以使用 2 个不同的上下文。第一个在 href 内部,第二个直接是 HTML 上下文。

大多数命令 XSS 有效负载(javascript:alert(1) 等)和缓解可以在下面的示例中找到。

    /**
 * XSS protection function for URL context
 * @usecases
 * <a href="use this function if output reflects here">click</a>
 * <img src="use this function if output reflects here">
 * <iframe src="use this function if output reflects here">
 * @description
 * Only allows URLs that start with http(s) or ftp. e.g.,
 * https://www.google.com
 * Protection against JavaScript, VBScript and Data URI JavaScript code execution etc.
 * @author Ashar Javed
 * @Link https://twitter.com/soaj1664ashar
 * @demo http://xssplaygroundforfunandlearn.netai.net/final.html
 */
function urlContextCleaner($url) {
    if(preg_match("#^(?:(?:https?|ftp):{1})\/\/[^\"\s\\\\]*.[^\"\s\\\\]*$#iu",(string)$url,$match))
    {
        return $match[0];
    }
    else {
        $noxss='javascript:void(0)';
        return $noxss;
    }
}

来自:https://github.com/symphonycms/xssfilter/blob/master/lib/xss.php

此外,您可以轻松解决此问题。如果您知道 url 只能是 http 协议,请在 href 属性处内嵌 http(s) 前缀并对所有类型的引号进行编码。(单引号、双引号和反引号)

对于 HTML 上下文,只需使用经典的编码方法。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2012-03-10
    • 2011-12-03
    • 2012-06-21
    • 2022-01-12
    • 2023-03-27
    • 2021-05-01
    • 2013-09-16
    相关资源
    最近更新 更多