向 Safari iOS 发送 URL 时存在 XSS 漏洞

Posted

技术标签:

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

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

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

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

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

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

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

提前致谢!

【问题讨论】:

我认为这是因为它是一个动态创建的 URL,您在将其传递给 openURL 之前没有对其进行验证: 【参考方案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 上下文,只需使用经典的编码方法。

【讨论】:

以上是关于向 Safari iOS 发送 URL 时存在 XSS 漏洞的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Safari Web Inspector 向 iOS 设备发送控制台命令

从 iOS Safari 抓取 URL

如何制作在 Safari for iOS Facebook Messenger 应用程序而不是应用程序内 Web 浏览器中打开的 URL

向指定URL发送GET和POST请求

HttpSenderUtil向指定 URL 发送POST方法的请求

将Safari URL发送到Quicksilver