【bWAPP】0X02 HTML Injection - Reflected (URL)

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後面的部分進行了過濾處理,使得沒法進行注入。

相關文章
相關標籤/搜索