HTML注入-反射型URL

查看服務器端源代碼時,其中重點關注的有兩處
1 <div id="main"> 2 3 <h1>HTML Injection - Reflected (URL)</h1> 4 5 <?php echo "<p align=\"left\">Your current URL: <i>" . $url . "</i></p>";?> 6 7 </div>
這段代碼中有一段PHP代碼,執行html陳述句,輸出一段“Your current URL:”字符,在文本中左對齊,并呼叫$url變數,將輸出的內容跟在后面,
防御代碼:
1 <?php 2 include("security.php"); 3 include("security_level_check.php"); 4 include("functions_external.php"); 5 include("selections.php"); 6 7 $url= ""; 8 switch($_COOKIE["security_level"]) 9 { 10 case "0" : 11 // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); 12 $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; 13 break; 14 case "1" : 15 $url = "<script>document.write(document.URL)</script>"; 16 break; 17 case "2" : 18 $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]); 19 break; 20 default : 21 // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); 22 $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; 23 break; 24 } 25 ?>
1 <select name="security_level"> 2 3 <option value="0">low</option> 4 <option value="1">medium</option> 5 <option value="2">high</option> 6 7 </select>
閱讀防御代碼可以了解到根據設定的難度不同,呼叫的防御代碼與不同,
當將等級設定為low時,執行
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
其中“$_SERVER["HTTP_HOST"]”表示獲取當前域名,與之功能相似的還有一個是$_SERVER['SERVER_NAME']
當滿足以下3個條件的時候,兩者會輸出相同的資訊
A、服務器埠號為80
B、Apache中的conf中的ServerName設定正確
C、HTTP/1.1協議規范
不同點
A、$_SERVER['HTTP_HOST']:在HTTP/1.1協議下,會根據客戶端的HTTP請求輸出資訊;
$_SERVER['SERVER_NAME']:默認情況下會直接輸出Apache的組態檔httpd.conf中的ServerName的值
B、當服務器的埠號不是80時
$_SERVER['HTTP_HOST']會輸出埠號,例如“www.funwall.cn:8080”
$_SERVER['SERVER_NAME']直接輸出ServerName的值,例如“www.funwall.cn”
在這種情況下,可以理解成HTTP_HOST = SERVER_NAME:SERVRE_PORT
C、當組態檔httpd.conf中的ServerName與HTTP/1.0下的域名不一致的時候,假如httpd.conf配置如下:
<virtualhost *>
ServerName funwall.cn
ServerAlias www.funwall.cn
</virtualhost>
客戶端訪問域名:www.funwall.cn
$_SERVER[HTTP_HOST]輸出:www.funwall.cn
$_SERVER[SERVER_NAME]輸出:funwall.cn
因此,在實際中應該用$_SERVER[HTTP_HOST]獲取域名比較保險,
而“$_SERVER["REQUEST_URI"]”是獲取域名后面的完整的地址路徑,
在level low下,通過抓包改包,修改host引數,可以發現主頁上回顯會有相應的改變,


當將等級設定為medium時,執行
$url = "<script>document.write(document.URL)</script>";
這里document物件 -- 代表整個HTML 檔案,可用來訪問頁面中的所有元素;
document.URL是 設定URL屬性從而在同一視窗打開另一網頁;
document.write() 是動態向頁面寫入內容,
此時再通過前面的方式抓包改包,已經不起作用了,
在low和medium等級下,是沒有做任何防護的,都是直接獲取url然后將其直接輸出,可以在連接中添加代碼實作彈框,這里是ie禁用了部分js腳本,導致了彈框失敗,

在high等級下,執行
$url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
其中呼叫了xss_check_3函式對host后面的部分進行了過濾處理,使得無法進行注入,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38791.html
標籤:其他
上一篇:GUI版本的emacs
