向Safari iOS发送URL时的XSS漏洞

时间:2014-11-24 12:02:42

标签: ios xcode security xss nsurl


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

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

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

我理解为避免使用XSS,您应该对输出进行编码。
但这会弄乱网址,Safari无法打开正确的网页?

还是有其他原因造成了这个问题?

我不熟悉安全性,所以任何指针都会受到赞赏。

提前致谢!

1 个答案:

答案 0 :(得分:0)

当app尝试反映href属性中的输出时,可以显示基于URL上下文的XSS。

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

AS你可以看到同一个变量可以使用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上下文,只需使用经典编码方法。