Attack 目標網站如下圖所示。由此頁面可發現 :
項目 | 資訊 |
program language | PHP |
Input | $_GET['name'] |
Example 1
第一個練習較為簡單,網站並無進行任何驗證。
<script>alert(‘hello’);</script>
Example 2
此時網站開發者針對輸入項進行簡單的驗證。將<script>替換為空字串。
然而該開發者的過濾方式過於單純,僅需進行簡單的大小寫替換 (HTML語法不分打小寫) 即可以成 by pass 驗證。
<ScrIpt>alert('hello');</ScRipt>
Example 3
此時網站開發者針對輸入項增加較多的過濾。經過幾次測試後,推估是將可能形成<script> 語法的相關語句進行過濾,將其替換成為空字串。
因此可以利用其針對特殊字串替換為空字串的特性,在<script>語法中間插入"<script>"使其被替換後仍可組成<script>標籤,即可成功by pass驗證。
<scr<script>ipt>alert('Hacker Lung')</scr</script>ipt>
Example 4
此時網站開發者針對輸入項加強防禦。經過幾次測試後,推估開發者偵測輸入字串若含有<script> 語法,則直接回應"error"字串,不進行處理。
所幸要在客戶端執行javascript語法並非只有一種方法,可以透過其他html語法,來執行javascript語句。
<img src='xxx' onerror='alert(1)' />
Example 5
此時網站開發者針對輸入項加強防禦。經過幾次測試後,發現此次網站會可以回應<script>,而當符合某種規則時則直接回應"error"字串,不進行處理。
因此將要執行的語法經過編碼後傳入即可by pass驗證,當客戶端執行時會調用函數進行解碼,即可轉為正常運作的script語法。
<script>eval(String.fromCharCode(97,108,101,114,116,40,39,72,97,99,107,101,114,32,76,117,110,103,39,41,59))</script>
Example 6
觀察HTML語法可以發現,網站本身已有<script>標籤,經過測試與觀察可以發現,輸入的資訊會放置到「$a = "」 的後方,因此僅需正確完成其語法後,即可添加自己的javascript語法。
hacker";alert('Hacker Lung');"
Example 7
觀察HTML語法可以發現,伺服器端利用PHP常用的HTML-encode 方法將語法進行編碼,以避免XSS攻擊。
然而在此案例中,並不需要使用到特殊字元。
hacker';alert(55);'
Example 8
經過幾次測試後,發現網站會將<input>資訊透過POST方法接收後,顯示於網頁上。而其中action的可推測為PHP於Web Server的目錄夾底下的實際位置。
然後偷偷進入Server查看PHP原始碼發現該程式使用 $_SERVER['PHP_SELF']
也就是說網址稍作修改後,HTML Source 會變成如下圖所示。
/"><script>alert('HackerLungyu')</script>
Example 9
This example is a DOM-based XSS.基本上是一個靜態網站。但是仍可透過#添加scipt,使其內容作用URL的一部分,進而觸發XSS。
<script>alert('hacker lung')</script>