向 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 设备发送控制台命令
如何制作在 Safari for iOS Facebook Messenger 应用程序而不是应用程序内 Web 浏览器中打开的 URL