浅谈JSONP跨域漏洞
CSRF(Cross site request forgery)跨站请求伪造,一种挟持用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,跟XSS相比,XSS 利用的是网站对用户的信任,CSRF 利用的是网站对用户网页浏览器的信任。
提起CSRF,可能很多人都会想到修改个人资料、授权登陆等等攻击场景,可以发现这两个场景都是写入型的CSRF漏洞,通常会忽视更常见的读取型的CSRF漏洞,主流如下两种
- JSONP跨域资源读取
- CORS跨域资源读取
当持有敏感资源数据的服务器没有校验请求来源时,如未严格校验Referer或未存在token机制等,都会导致读取型的CSRF漏洞的产生
今天我们就来了解下其中之一的JSONP跨域漏洞
JSONP
我们知道,同源策略SOP(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能。不同域之间相互请求资源,就算作“跨域”,为了能跨域获取资源,产生了JSONP,即JSONP 就是为了跨域获取资源而产生的一种技术手段
JSONP(JSON with Padding)即填充式的JSON,是基于JSON 格式的为解决跨域请求资源而产生的解决方案。通过填充额外的内容把JSON数据包装起来,变成一段有效的可以独立运行的JavaScript语句。
如要在 a.com 域下获取存在 b.com 的 JSON 数据( getUsers.JSON ):
{"id" : "1","name" : "f4ke"}
通过 JSONP 的 “Padding”(填充即包装成可运行的js) , getUsers.JSON 输出为:
callback({"id" : "1","name" : "f4ke"});
它基本原理是利用HTML里script元素标签中的src属性不受同源策略影响的特性,远程调用JSON文件来实现数据传递。JSONP的基本语法为:callback({"name":"alan", "msg":"success"})
具体实现
jsonp.php,作为JSONP服务端资源获取文件,动态生成JSONP格式数据:
<?php
if(isset($_GET['callback'])){
$callback = $_GET['callback'];
print $callback.'({"username" : "testadmin", "password" : "thisisadminpassword"});';
} else {
echo 'No callback param.';
}
?>
客户端可以使用原生js或者jQuery实现JSONP跨域资源请求
原生JS
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSONP 跨域</title>