什麼是Injection?php
injection,中文意思就是注入的意思,常見的注入漏洞就是SQL注入啦,是如今應用最普遍,殺傷力很大的漏洞。html
什麼是HTML injection?前端
有交互纔會產生漏洞,不管交互是怎麼進行的。交互就是網頁有對後臺數據庫的讀取或前端的動態效果。HTML文件並非像你們想的那樣沒有任何交互,在HTML文件裏仍是會用到一些JavaScript來完成本身須要的一些動態效果,例如,地址欄的參數就是location,用戶所作的點擊觸發事件,以及一些動態的DOM交互都會影響到JavaScript的執行致使漏洞的產生。web
若是HTML文件能夠被injection的話,那麼就能夠利用本地的HTML文件在本地域內執行JavaScript代碼,權限是很是高的。數據庫
平臺簡介:cookie
bWAPP:漏洞平臺,開源web應用less
漏洞利用:xss
頁面函數
咱們能夠看到這是一個Form提交表單的頁面,而且是get請求方法。源碼分析
咱們提交一些信息看看
提交後能夠看到,咱們提交的信息在頁面上顯示。而且也在地址欄裏面看到咱們的信息,這是get請求的一個特徵。
A:Low級別(未進行任何過濾)
A-1:增長外鏈,影響SEO,提高外鏈的PR
PAYLOAD:http://127.0.0.1/htmli_get.php?firstname=<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>&lastname=ESHLkangi&form=submit
效果:
A-2:反射性xss漏洞,進一步能夠僞造存在xss漏洞的惡意網址執行本身DIY的ji代碼,從而蒐集到其餘人的信息。
PAYLOAD:http://118.89.17.134/htmli_get.php?firstname=<script>alert(document.cookie)</script>&lastname=ESHLkangi&form=submit
效果:
盜取了cookie。
源碼分析:
HTML:
1 <form action="/htmli_get.php" method="GET"> 2 3 <p> 4 <label for="firstname">First name:</label><br> 5 <input id="firstname" name="firstname" type="text"> 6 </p> 7 8 <p> 9 <label for="lastname">Last name:</label><br> 10 <input id="lastname" name="lastname" type="text"> 11 </p> 12 13 <button type="submit" name="form" value="submit">Go</button> 14 15 </form>
對應的PHP代碼:
1 <?php 2 if(isset($_GET["firstname"]) && isset($_GET["lastname"])) 3 { 4 $firstname = $_GET["firstname"]; 5 $lastname = $_GET["lastname"]; 6 if($firstname == "" or $lastname == "") 7 { 8 echo "<font color=\"red\">Please enter both fields...</font>"; 9 } 10 11 else 12 { 13 echo "Welcome " . $firstname . " --- " . $lastname; 14 } 15 } 16 ?>
分析:
在表單提交的時候沒有對用戶輸入的數據進行處理,而且在PHP代碼中echo的時候沒有處理就打印到頁面,當咱們在文本框中輸入相似代碼:
<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>
那展現到頁面的結果將會是一個能夠跳轉頁面的超連接,一樣咱們也能夠獲取cookie。
B:Medium級別(初級的字符處理)
測試
發現,超連接沒有實現
cookie也盜取不了。
源碼分析:
HTML:
不變
PHP:
1 function xss_check_1($data) 2 { 3 // Converts only "<" and ">" to HTLM entities 4 $input = str_replace("<", "<", $data); 5 $input = str_replace(">", ">", $input); 6 // Failure is an option^M 7 // Bypasses double encoding attacks 8 // <script>alert(0)</script> 9 // %3Cscript%3Ealert%280%29%3C%2Fscript%3E^M 10 // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E^M 11 $input = urldecode($input); 12 13 return $input; 14 15 }
經過源碼,咱們能夠看到,開始使用了str_replace()函數過濾"<"和">"這兩個特殊字符處理了,最後,用了urldecode()函數進行解碼,把URL編碼還原字符串。
POC:
依據代碼的思路,咱們能夠先對"<"、">"進行urlencode,繞過str_replace()函數的過濾便可。建議把全部特殊的符號都進行編碼,例如"=","/"等
<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>
進行urlencode後
%3Ca href="http://www.cnblogs.com/ESHLkangi/"%3EESHLkangi%3C/a%3E
把編碼後的輸入到文本框內
成功繞過!!!
C:High級別(htmlspecialchars)
直接查看源碼,進行一下審計
後臺源碼:
1 function xss_check_3($data, $encoding = "UTF-8") 2 { 3 4 // htmlspecialchars - converts special characters to HTML entities 5 // '&' (ampersand) becomes '&' 6 // '"' (double quote) becomes '"' when ENT_NOQUOTES is not set 7 // "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set 8 // '<' (less than) becomes '<' 9 // '>' (greater than) becomes '>' 10 11 return htmlspecialchars($data, ENT_QUOTES, $encoding); 12 13 }
發現代碼中用了一個htmlspecialchars()函數。簡單分析一下這個函數:
htmlspecialchars() 函數把預約義的字符轉換爲 HTML 實體。
預約義的字符是:
& (和號)成爲 &
" (雙引號)成爲 "
' (單引號)成爲 '
< (小於)成爲 <
> (大於)成爲>
它的語法以下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二個參數flags須要重要注意,不少開發者就是由於沒有注意到這個參數致使使用htmlspecialchars()函數過濾XSS時被繞過。由於flags參數對於引號的編碼以下:
可用的引號類型:
ENT_COMPAT - 默認。僅編碼雙引號。
ENT_QUOTES - 編碼雙引號和單引號。
ENT_NOQUOTES - 不編碼任何引號。
能夠看到的是咱們這裏是使用了ENT_QUOTES 編碼的,把單引號也過濾了。
技術尚菜,想實現繞過有點困難,如今只能這樣了。。。
知乎上有些解答,能夠參考https://www.zhihu.com/question/27646993