歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Intigriti XSS挑戰全教程

來源:本站整理 作者:佚名 時間:2019-05-14 TAG: 我要投稿


 
寫在前面的話
Intigriti近期發布了一個非常有意思的XSS挑戰項目,該項目要求我們制作一個特殊的URL,而這個URL不僅要能夠給iframe分配src參數,而且還要能夠發送eval()調用來彈出一個“alert(document.domain)”彈窗,這就是這項XSS挑戰的目標和要求。那我們應該怎么做呢?接下來,我們一起看一看實現這個目標需要哪些步驟和方法。
注意:最終的漏洞以及漏洞利用代碼只適用于Chrome,所以我們推薦大家使用Chrome瀏覽器來進行測試。
 
代碼分析
現在,我們暫時先不要過多考慮XSS以及XSS漏洞利用方面的東西,首先我們要做的就是搞清楚這個XSS挑戰項目所要涉及到的JavaScript代碼。
const url = new URL(decodeURIComponent(document.location.hash.substr(1))).href.replace(/script|/gi, "forbidden");
const iframe = document.createElement("iframe"); iframe.src = url; document.body.appendChild(iframe);
iframe.onload = function(){ window.addEventListener("message", executeCtx, false);}
function executeCtx(e) {
  if(e.source == iframe.contentWindow){
    e.data.location = window.location;
    Object.assign(window, e.data);
    eval(url);
  }
}
1、 上述代碼首先獲取的是當前頁面URL的哈希值,并根據哈希解碼URL實體,然后使用字符串“forbidden”替換掉了所有的“script”、“”實例。最終代碼運行完之后,會分配一個“url”變量。2、 接下來,代碼會在當前頁面中創建一個iframe,這個iframe的src參數值就是之前創建的“url”變量,然后將這個URL地址加載進iframe中。3、 當iframe加載完畢之后,我們會開始監聽message事件,并在監聽到message事件后調用executeCtx。4、 executeCtx函數的功能定義如下:
a) 該函數會確保事件來自于這個iframe;b) 事件中Payload的“location”屬性會根據當前窗口的“location”參數進行重寫,并保護當前地址不會重定向至其他URL;c) Payload對象的每一個參數都會分配當前窗口的Object.assign(window、e.data),這也就意味著,任何發送給executeCtx()函數的值都會在window中定義;d) 通過eval()函數對url變量進行處理;
仔細閱讀完上述代碼之后,我腦海中第一個反應就是:message事件是個什么玩意兒?翻了半天文檔之后,我發現這是一個用于跨源通信的API,它使用了window.postMessage方法來允許我們向任何監聽message事件的組件發送對象。這就非常有意思了!
 
XSS漏洞利用
既然我們的目標是找到一個XSS漏洞并利用之,那“eval(url)”明顯就是我們的目標了。一開始,對于如何利用“url”參數來尋找并利用XSS漏洞,我是毫無頭緒的,但這個階段暫時不用過多關注XSS方面的東西。我當前主要關注的東西就是“eval()”。不過,在真正利用eval()調用之前,我們還有很多操作和步驟需要做,但如果能夠成功,我們就離最終的XSS漏洞不遠了。不過現在,大家先把XSS的事情放一放。
一步一步實現漏洞利用
Iframe中的JavaScript
根據我以往的經驗,這種情況下的XSS漏洞一般都跟Data URL(前綴為data:的URL)有關。Data URL允許我們使用Base64來編碼Payload,因此這樣就可以輕松繞過
.replace(/script|/gi, "forbidden")
過濾器了。
我嘗試了以下地址參數:
https://challenge.intigriti.io/#data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGknKTs8L3NjcmlwdD4=
即alert(‘hi’);的Base64編碼格式,并成功實現了alert彈窗。但是alert(document.domain)并沒有在iframe中成功運行,因為這是一個Data URL,其中并不包含域名。雖然現在有了彈窗警告框,但是我想要的是在iframe外部實現它,所以我們現在還沒成功。
向父窗口發送消息
在現在這個階段,我們的目標仍然是eval(url)。現在,我們需要發送一條消息來運行executeCtx()函數。我嘗試了剛才了解到的那個API,并使用了下列腳本代碼:
script>window.postMessage("test", "*")script>
postMessage()函數的第二個參數是我們的目標源,這里我們傳入的是”*”,雖然這樣做不安全(任何人都可以攔截到我的消息),不過這不是我們在這里需要考慮的事情。最終編碼后的URL如下:

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 俱乐部英超赚钱 闲鱼鱼塘可以赚钱吗 gta5出租车赚钱小费 电影群怎么赚钱变现 gtaol地堡挂机赚钱 互联网营销赚钱么 黑色沙漠最效率刷怪赚钱 小学教师怎么赚钱 怎么运用免费模式赚钱 学纹绣真的能赚钱吗 线上任务赚钱的平台 临摹书法赚钱 梦想是赚钱的演讲稿 菜场卖菜赚钱吗 互联网么最赚钱 买防水材料赚钱吗