HTML注入-反射型URLphp
查看服務器端源代碼時,其中重點關注的有兩處html
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變量,將輸出的內容跟在後面。服務器
防護代碼:xss
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
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];spa
其中「$_SERVER["HTTP_HOST"]」表示獲取當前域名,與之功能類似的還有一個是$_SERVER['SERVER_NAME']3d
當知足如下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]獲取域名比較保險。code
而「$_SERVER["REQUEST_URI"]」是獲取域名後面的完整的地址路徑。htm
在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後面的部分進行了過濾處理,使得沒法進行注入。