当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
0x01 同源策略
0x02 什么是JSONP?与JSON的区别是什么?
0x03 XSSI 跟XSS和CSRF 的区别
以此图为例,这里我以
0x04 静态JavaScript(常规XSSI)
0x05 经身份验证后才能访问XSSI
0x06 POST XSSI
0x07 防御措施
0x08 总结
0x09 拓展小知识
跨域窃取CSV
那日,听闻朋友谈及XSSI(跨站点脚本包含),恕在下不才,第一次听闻,竟对此术略感迷茫,对此攻击之法也是困顿不堪。为将此法破解并为我所用,故尔花费数日深究此术。
经谷哥度娘指引,网界索取后,给出的大致答案是:
“XSSI在Same-Origin Policy的限制范围之外,从JSONP等获取来自外部域的机密信息的攻击(通常是Get 请求,但现在又基于POST请求的XSSI)”。
正所谓,闻道有先后,溯源有顺序
在了解XSSI之前,我们先来了解一下什么是同源策略和JSONP。
同源策略是由Netscape提出的一个著名的安全策略。由于知名度广泛,所以所有支持JavaScript 的浏览器都会使用这个策略。
所谓同源是指:域名、协议、端口相同。
不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。
同源策略定义了文档之间的交互方式
当两个文档来自同一来源时,允许两个文档相互访问。这是Web安全的事实基础。
大多数浏览器将来源定义为端口、主机名和协议。
而Microsoft Internet Explorer是一个例外,不包括端口,这有其自身的(安全性)含义。
Let me以同域不同端口,来解释一下同源策略
8888端口创建XSSITest.html
localhost:8888/XSSITest.htm
9999 端口创建XSSIPayload.html
localhost:9999/XSSIPayload.html
此时用Firefox浏览器访问,会得到以下的错误提示:
Error: Permission denied to accessproperty 'body
注意
此例子是域相同,但端口不相同,所以此时访问是失败的。
JSONP是一种发送JSON数据而无需担心跨域问题的方法;
JSONP不使用XMLHttpRequest对象;
THE SOP不工作HERE。
服务器示例(JSON.php):
服务端返回:
Notice: Undefined index: jsoncallback in C:\phpStudy\WWW\XSSI-3\JSONP.php on line 4
(["customername1","customername2"])
我们构建并包含到script标签中:
function callbackFunction(result, methodName)
{
var html = '';
for(var i = 0; i < result.length; i++)
{
html += '- ' + result[i] + '
';
}
html += '
';
document.getElementById('divCustomers').innerHTML = html;
}
客户端完整代码(Test.php):
JSONP 实例
客户端访问Test.php,页面展示:
以上代码案例中可看出:
JSONP允许我们指定传递JSON对象的回调函数。允许我们绕过相同的原始策略,这就导致了JSON从外部服务器加载到网页上的JavaScript中。
以上,只是我们的前菜,在我们了解了同源策略和JSONP后,我们再回过头来讲XSSI。
也许,当你听到这个名称(XSSI)的时候第一感觉是跨站点脚本攻击。
比如说我吧,第一次听到XSSI时,说时迟那时快,迅雷不及掩耳盗铃之铃儿响叮当,脑海里出现两个对话框:
果然,Too Young Too Simple
以上的猜测都不是。
经过查看一番资料后发现它的利用方式跟CSRF 很相似,容易混淆。
XSSI的名称接近于跨站脚本(XSS)。
从描述出发,接近跨站请求伪造(CSRF)。两者之间的共同点是它们都是客户端攻击。
与XSS的区别
在将XSS恶意代码放入受害者的页面时,在XSSI受害者的代码包括在恶意页面中。从表面上看,XSSI和CSRF看起来很相似,因为在这两种情况下,请求都是从恶意页面发送到另一个域的,并且在两种情况下,请求都是在登录用户的上下文中执行的。
关键区别在于目标
在CSRF中,攻击者希望在受害者的页面内执行状态更改操作,例如在网上银行应用程序中转账,受害者使用一次转账,它就操作一次。而在XSSI中,攻击者则想泄漏数据的跨源,以便随后执行上述攻击之一,也就是随时随地操作。
跨站点脚本包含(XSSI),即使用script标签包含资源时,SOP(同源策略)不适用也没关系,因为脚本必须能够包含在跨域中。攻击者因此可以读取使用该script标签包含的所有内容。
动态环境JavaScript或JSONP(使用cookie等所谓的环境权限信息)进行身份验证时。与其他跨站点请求伪造(CSRF)一样,在从其他主机请求资源时也包含cookie 。
可以根据脚本中数据的内容,以不同的方式利用XSSI。广泛使用的敏感数据是个人数据,例如电子邮件,邮政地址,生日等。但是人们也可以找到令牌,会话ID和其他ID(例如UID)。最简单方法是检查用户是否已登录(登录oracle)。获得的信息也可能被滥用用于社会工程攻击和特定于应用程序的攻击。
简单通俗的来说
XSSI(跨站点包含)漏洞允许经过Jupyter服务器验证的用户访问时,在恶意页面上包含资源。
http://127.0.0.1/XSSI-2/safedog-1.cn 代替safedog-1.cn
http://10.0.x.x/XSSI-2/safedog-2.cn 代替 safedog-2.cn
访问http://127.0.0.1/XSSI-2/safedog-1/unsecure/index.php
点击【Get Secret Code】按钮获取密码
safedog-1.cn
safedog-1.cn 获取密码
您的密码是
「」
这样,我们就获取到下发的密码Keys,并且每次浏览器获得的密码Keys始终是相同的。
生成密码并利用JSONP
$secret_code];
}
$callback = "jsonCallback";
if(isset($_GET['callback'])){
$callback = $_GET['callback'];
}
// 获取用户的密码
$result = getSecretCode($_SESSION['secret_code']);
$json = json_encode($result, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
header("Content-type: application/x-javascript");
echo "$callback($json)";
获取密码下发,先