HTML注入-反射型GET
描述:HTML 注入漏洞是指在用戶輸入的地方,輸入 HTML 文本,被當作 GET 引數傳到服務器,服務器以原始格式存盤,未采用 HTML 編碼,導致 HTML 的特性被瀏覽器決議執行,這種編碼必須在服務器端存盤引數的時候進行,
low
當用戶在輸入框輸入內容,后臺對輸入內容不做處理直接添加入頁面的時候,用戶就可以刻意填寫HTML、JavaScript腳本來作為文本輸入,這樣這個頁面就會出現一些用戶加入的東西了

這里在文本框內輸入內容,直接回傳像是在網頁頁面,那么在文本框內輸入HTML陳述句會產生什么效果

將陳述句
<a href="https://www.cnblogs.com/Yuuki-/" >點擊這里</a>
填入兩個文本框后點擊確定,可以發現welcome后面跟了兩個超鏈接

查看他的網頁原始碼會發現,我們寫的HTML陳述句直接添加到了里面,

不過,如果退出賬號重新登錄,或退出該頁面重新訪問,這段代碼就不在了,所以是一種反射型的注入,
看一看這個網頁在服務器端的源代碼,與前端不同的是,多了三段PHP代碼,
第一段,用來判斷當前題目的防護等級,即low、medium、high,并針對不同等級呼叫不同的防護代碼,根據防護等級呼叫functions_external.php檔案中的代碼進行防護
1 <?php 2 include("security.php"); 3 include("security_level_check.php"); 4 include("functions_external.php"); 5 include("selections.php"); 6 7 function htmli($data) 8 { 9 switch($_COOKIE["security_level"]) 10 { 11 case "0" : 12 $data = no_check($data); 13 break; 14 15 case "1" : 16 $data = xss_check_1($data); 17 break; 18 19 case "2" : 20 $data = xss_check_3($data); 21 break; 22 23 default : 24 $data = no_check($data); 25 break; 26 } 27 return $data; 28 } 29 ?>
第二段,用來接收文本框中輸入的內容,并回傳顯示至網頁
首先判斷文本框中是否有輸入內容,若沒有則回傳紅色字體的Please enter both fields...
如果有輸入內容就將輸入的內容跟在welcome后面輸出到網頁
<?php if(isset($_GET["firstname"]) && isset($_GET["lastname"])) { $firstname = $_GET["firstname"]; $lastname = $_GET["lastname"]; if($firstname == "" or $lastname == "") { echo "<font color=\"red\">Please enter both fields...</font>"; } else { echo "Welcome " . htmli($firstname) . " " . htmli($lastname); } } ?>
第三段,來確定當前屬于題目表中的哪一個題目
<?php // Lists the options from the array 'bugs' (bugs.txt) 列出陣列“bugs”(bugs.txt)中的選項 foreach ($bugs as $key => $value) { $bug = explode(",", trim($value)); // Debugging // echo "key: " . $key; // echo " value: " . $bug[0]; // echo " filename: " . $bug[1] . "<br />"; echo "<option value='https://www.cnblogs.com/Yuuki-/p/$key'>$bug[0]</option>"; } ?>
在防護代碼中0防護(也就是low)下是沒用任何防御手段的,

medium
改變防護等級,繼續輸入測驗陳述句,發現他原樣輸出,并沒有產生超鏈

我們抓包比較一下兩種難度下的資料包

其中在回傳的資料包中,有區別的地方如下:
Welcome <a href="https://www.cnblogs.com/Yuuki-/" >點擊這里</a> <a href="https://www.cnblogs.com/Yuuki-/" >點擊這里</a>
Welcome <a href="https://www.cnblogs.com/Yuuki-/" >點擊這里</a> <a href="https://www.cnblogs.com/Yuuki-/" >點擊這里</a>
注意一下兩個的區別,它將代碼中的“<”和“>”進行了轉義,轉移為HTML物體編碼,
通過對尖括號<>做編碼處理,將尖括號<>進行兩次url編碼,即可成功繞過轉義編碼,


在這個難度模式下,呼叫了xss_check_1,我們找到該原始碼,在這里可以看到,他將輸入的尖括號進行了替換,而如何繞過的方法也有在下面解釋,

high
在高防護等級中,輸入測驗代碼,還是直接回顯出來,查看他的原始碼部分,發現也是對“<>”進行了轉義處理


嘗試進行URL編碼后再測驗

當防護等級調整到最高時,會呼叫xss_check_3
我們找到原始碼看看,他利用了php的高級轉義函式htmlspecialchars,這種情況下就解決了這種注入問題,
但是如果開發人員把htmlspcialchars用在不當地方(如script標簽中間),那這層防護就和沒有一樣,


HTML注入-反射型POST

與GET型最大的區別在于傳輸方式的不同
POST型

GET型

這兩種的防御方式都一樣,只是資料的傳輸方式不一樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43493.html
標籤:其他
上一篇:【bWAPP】0X00 安裝教程
下一篇:【整理中】半導體理論及IC工藝
