一次JSONP导致的XSS漏洞

1,101 阅读1分钟

JSONP:

  • 首先,因为ajax无法跨域
  • 其次,开发者发现,  标签的src属性是可以跨域的(没有跨域限制),进而使用此种方式进行跨域
  • 服务端支持:传递一个callback参数给跨域服务端,然后跨域服务端返回数据时会将这个callback参数作为函数名来包裹住json数据即可。

JSON导致的XSS漏洞

<! DOCTYPE html >
< html lang="en" >
< head >
    < meta charset="UTF-8" >
    < title > jsonp下XSS注入 < /title>
< /head>

< body >

< script >
    function myCallback(jsonObject) {

        //函数内容

    }
< script src="https://接口?callback=myCallback" >< /script>

< /body>
< /html>

以上是一个带参数的 JSONP 形式的跨域请求。注意,myCallback 为自定义的 callback 函数名。

个人理解:对于支持JSONP的接口,即:get请求+满足JSONP第三条,就可能产生像XSS漏洞等风险。

示例假如:网站X,使用以上代码形式,将src设置为我方接口,而 ?callback=js代码】。此时,就会发生XSS漏洞,浏览器执行注入的js代码。

XSS解决方案

接口这样设计的目的也正是为了满足JSONP跨域调用的场景,此处的解决方案是:

HtmlUtils.htmlEscape(request.getParameter(CALLBACK));

通过把传入的callback进行html字符转义,已解决XSS注入漏洞。