前言
bwapp靶場每一種類型都分爲3種等級: Low, Medium, High
這邊我就按照類型歸類寫, 方便查閱。
本文是HTML注入和iFrame注入,其他的本質都是HTML的改變。那麼有人會問,XSS與HTML注入有啥區別呢?其實本質上都是沒有區別的,改變前端代碼,來攻擊客戶端,但是XSS可以理解爲注入了富文本語言程序代碼,而HTML注入只注入了超文本標記語言,不涉及富文本程序代碼的問題。這裏的iframe注入實際上就是一個閱讀器,可以閱讀通過協議加載的活服務器本地的文件。
話不多說, 直接lu靶場
0x01 HTML injection Reflected GET
分析網站:
Low
Low等級沒有任何防護, 直接注入即可:
Medium
在Medium等級中, 繼續進行注入的話, 會發現< >尖括號被轉義成html實體了:
源碼對input進行了url解碼:
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
$input = urldecode($input);
return $input;
}
那麼可以採用url編碼來繞過:
%3cscript%3ealert(1)%3c/script%3e
注意, 在url中的參數注入不會被url編碼成功..
High
源碼看到, 利用了htmlspecialchars()函數進行html實體編碼:
function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
- ENT_QUOTES - 編碼雙引號和單引號。
評估爲安全。
0x02
分析
在post的請求中, 就不同於get型的直接url中的參數污染注入:
這就需要POST放包來注入, 剩餘的方法和Get型一樣, 不再贅述。
Low
Medium
注意, 要在輸入框中輸入才能被url解碼
High
安全。
0x03
分析網頁特定, 猜想是將網頁的url在前端頁面中顯示出來:
Low
嘗試在url後面加入參數, 判斷是否存在注入點:
http://localhost:8080/bWAPP/htmli_current_url.php?id=1
成功, 然後注入script:
發現尖括號被編碼成html實體了..
經過實驗, 發現是由於注入的尖括號是在url中, 在發送到服務端之前url已經被url編碼了, 而服務端又沒有進行url解碼, 這樣導致尖括號的失效。
兩種方法解決:
1. 用burp抓包, 修改參數:
2. 修改源代碼, 增加url解碼函數:
直接在url注入:
Medium
和Low等級一樣, 由於url中傳參會自動url編碼, 而服務端又沒有進行對應的url解碼,
直接用burp抓包修改即可:
查看源碼, 他是用js腳本執行document.write來寫入url的:
High
high級別用了htmlspecialchars()函數, 安全:
0x04 HTML Injection - Stored (Blog)
Low
分析:
這裏的記錄生成(添加)類似與DOM型的XSS:
在Low級別沒有任何防護, 直接注入js即可:
Medium&High
Medium和High級別一樣, 都使用了mysqli_real_escape_string()來將特殊字符轉義, (比如單雙引號, 尖括號, 括號等等)
- 拓展----mysql_escape_string()函數
mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
\x00, \n, \r, \, ', ", \x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
如果是sql注入還可以利用寬字節等方法繞過, 但html注入就無法注入了。
0x05 iFrame Injection
在這裏可以成爲閱讀器(www目錄下所有靜態文件的閱讀器)和跳轉和一個可以誘導客戶訪問某站點的一個點,利用:大小size設置爲0時可以理解爲無交互的刷訪問、前端挖礦、掛黑鏈、誘導下載等等。
Low
利用的方法有很多, 觀察有一個可控的參數ParemUrl
- 文件包含+目錄穿越
將ParamUrl參數指向服務器的其他文件, 即可實現目錄穿越的文件讀取:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=../README.txt&ParamWidth=800&ParamHeight=800
- XSS攻擊
觀察ParemUrl參數值別寫入HTML源碼中, 這裏直接利用閉合或添加屬性了實現XSS:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=" onload="alert(1)&ParamWidth=800&ParamHeight=800 // 閉合注入xss
http://localhost:8080/bWAPP/iframei.php?ParamUrl=javascript:alert(111)&ParamWidth=800&ParamHeight=800 // JavaScript僞協議
- url跳轉
這裏演示一個url跳轉, 也可以嘗試遠程文件包含:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=http://www.xiaodi8.com&ParamWidth=800&ParamHeight=800
Medium
在Medium級別中, 做看一些防護:
這裏對ParamUrl寫死了, 且雙引號前面加了反斜槓做了轉義, 那麼可以試試ParamWidth還能否閉合:
於是囂張的注入:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=800" onload=alert(document.cookie) //&ParamHeight=800
Do NOT use addslashes() for XSS or HTML validations!!
High
用了htmlspecialchars()轉化爲HTML實體, 安全: