bWAPP_HTML Injection

0x00:前言

bWAPPweb安全靶場,HTML_Injection模塊php

0x01:HTML注入

超文本標記語言(HTML)注入有時也被稱爲虛擬污染。 這其實是一個由站點形成的攻擊,該站點容許惡意用戶向其 Web 頁面注入 HTML,而且沒有合理處理用戶輸入。 換句話說,HTML 注入漏洞是由接收 HTML 引發的,一般經過一些以後會呈如今頁面的表單輸入。html

1)HTML injection (get)_low

1.1.1 輸入兩個名字,頁面出現用戶輸入的東西mysql

 

1.1.2網頁地址爲:web

 

 更改參數,low等級的沒有對輸入的內容有任何檢測sql

 

 結果:數據庫

 

 1.1.3 或者  firstname  改成 <a href=http://www.baidu.com>點這裏到百度</a>數組

<a>標籤的href 屬性規定連接的目標瀏覽器

 

結果:緩存

 

 

 

firstname=<script>alert(document.cookie)</script>    能夠獲取用戶cookie安全

2)HTML injection (get)_medium

1.2.1  <h1>Hack</h1>無效

 

 應該對字符<>/ ,檢測或過濾了,檢測的方法:過濾、替換、編碼解碼,這裏沒有作替換,試一下編碼解碼

試一下URL encode(其餘還有不少編碼方式base64等)

urlencode("<h1>Hack</h1>")  --->   

 

 結果:沒變,說明頁面展現的時候,把我輸入的內容URLdecode

 

 那咱們URLencode兩次,他解碼後就是一次URLencode的結果

 

 結果注入成功

 

 由於 只進行一次URLencode,瀏覽器會自動默認 把參數URLdecode一遍,因此和沒編碼沒有區別,兩次的話瀏覽器解碼一次,頁面展現的時候在解碼一次

2)HTML injection (get)_high

......看一下源碼吧

function xss_check_3($data, $encoding = "UTF-8")
{
    // htmlspecialchars - converts special characters to HTML entities    

    // '&' (ampersand) becomes '&'

    // '"' (double quote) becomes '"' when ENT_NOQUOTES is not set

    // "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set

    // '<' (less than) becomes '<'

    // '>' (greater than) becomes '>'  

    return htmlspecialchars($data, ENT_QUOTES, $encoding);

}

有一個htmlspecialchars()函數,百度一下

 

 

 

不會繞過~~~

知乎上有回答的https://www.zhihu.com/question/27646993,分不一樣場景,可是我都試過了仍是不行

 

2)HTML injection_post

方法和get同樣,只是postget的區別

(3) HTML injection_current url

代碼審計:

switch($_COOKIE["security_level"])
{
    case "0" :
        // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
        $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];               
        break;
case "1" : $url = "<script>document.write(document.URL)</script>"; break; case "2" : $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]); break; default : // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; break; }
<div id="main">
    
    <h1>HTML Injection - Reflected (URL)</h1>   

    <?php echo "<p align=\"left\">Your current URL: <i>" . $url . "</i></p>";?>    

</div>

PHP超全局變量$_SERVER的做用:(引用http://www.javashuo.com/article/p-zgvachxa-nt.html

$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器建立。不能保證每一個服務器都提供所有項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。

  1. $_SERVER['HTTP_HOST']  請求頭信息中的Host內容,獲取當前域名。
  2. $_SERVER["SERVER_NAME"]  輸出配置文件httpd.conf中的ServerName,通常狀況下與HTTP_HOST值相同,但若是服務器端口不是默認的80端口,或者協議規範不是HTTP/1.1時,HTTP_HOST會包含這些信息,而SERVER_NAME不必定包含。(主要看配置文件的設置)。
  3. $_SERVER["HTTP_USER_AGENT"]  獲取用戶相關信息,包括用戶瀏覽器、操做系統等信息。
  4. $_SERVER['HTTP_ACCEPT']  當前請求的ACCEPT頭部信息。
  5. $_SERVER["HTTP_ACCEPT_LANGUAGE"]  這個值是由瀏覽器發送,代表用戶默認的語言設置,後面的q值表示用戶對該語言的喜愛程度。
  6. $_SERVER["HTTP_ACCEPT_ENCODING"]  大部分的現代瀏覽器都支持gzip壓縮,並會把這一信息報告給服務器。這時服務器就會壓縮過的HTML發送給瀏覽器。這能夠減小近80%的文件大小,以節省下載時間和帶寬。
  7. $_SERVER["HTTP_COOKIE"]  瀏覽器的cookie信息。
  8. $_SERVER["HTTP_CONNECTION"]  當前請求的鏈接狀況。
  9. $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"]  表示瀏覽器可讀懂服務器發過來的請求,
  10. $_SERVER["HTTP_CACHE_CONTROL"]  表示瀏覽器是否會緩存這個頁面信息。
  11. $_SERVER["PATH"]  當前腳本所在文件系統。
  12. $_SERVER["SystemRoot"]  當前服務器的操做系統。
  13. $_SERVER["COMSPEC"]  指向cmd.exe的路徑。
  14. $_SERVER["PATHEXT"]  環境變量設置。
  15. $_SERVER["WINDIR"]  腳本指向的系統目錄。
  16. $_SERVER["SERVER_SIGNATURE"]  包含服務器版本和虛擬主機名的字符串。
  17. $_SERVER["SERVER_SOFTWARE"]  服務器軟件配置信息。
  18. $_SERVER["SERVER_ADDR"]  當前運行腳本的服務器的ip地址。
  19. $_SERVER["SERVER_PORT"]  服務器端口。
  20. $_SERVER["REMOTE_ADDR"]  瀏覽網頁的用戶ip。
  21. $_SERVER["DOCUMENT_ROOT"]  當前運行腳本所在的根目錄。
  22. $_SERVER["REQUEST_SCHEME"]  服務器通訊協議,是http或https。
  23. $_SERVER["CONTEXT_PREFIX"]  前綴。
  24. $_SERVER["CONTEXT_DOCUMENT_ROOT"]  當前腳本所在的文檔根目錄。
  25. $_SERVER["SERVER_ADMIN"]  服務器管理員信息。
  26. $_SERVER["SCRIPT_FILENAME"]  當前執行腳本的絕對路徑。
  27. $_SERVER ["REMOTE_PORT"]  用戶鏈接到服務器時所使用的端口。
  28. $_SERVER["GATEWAY_INTERFACE"]  服務器使用的CGI規範的版本。
  29. $_SERVER["SERVER_PROTOCOL"]  請求頁面時通訊協議的名稱和版本。
  30. $_SERVER["REQUEST_METHOD"]  請求提交數據的方式。
  31. $_SERVER["QUERY_STRING"]  服務器請求時?後面的參數。
  32. $_SERVER["REQUEST_URI"]  當前腳本路徑,根目錄以後的目錄。
  33. $_SERVER["SCRIPT_NAME"]  當前腳本的路徑。這在頁面須要指向本身時很是有用。
  34. $_SERVER["PHP_SELF"]  當前正在執行腳本的文件名。
  35. $_SERVER["REQUEST_TIME"]  獲得請求開始時的時間戳。

那麼這裏是獲取Host和當前腳本路徑,進行處理,而後在頁面顯示

low

把Host改成Hack,實際的時候能夠改成其餘網址,或者把路徑修改也可(前提是有那個腳本)

 

 

 

 mideum

mideum是document.write(document.URL) 

那隻能對URL作手腳了

看別人說只有IE瀏覽器能夠,看來之後要多注意IE瀏覽器額

 

 high

high只對當前腳本路徑  用了htmlspecialchars()函數,HTML編碼技術,可是Host仍是能夠用low等級的方法

 

(4) HTML injection store

low

沒有任何過濾

medium

 試了一下簡單的繞過無果,審計一下代碼,存儲型無非就是將輸入的內容存儲到數據庫,在查詢顯示的過程

找到了關鍵代碼

全部輸入的內容都要通過sqli_check_3()處理一次

function htmli($data)
{
    include("connect_i.php");

    switch($_COOKIE["security_level"])
    {
        case "0" :
            $data = sqli_check_3($link, $data);
            break;

        case "1" :
            $data = sqli_check_3($link, $data);
            // $data = xss_check_4($data);
            break;

        case "2" :
            $data = sqli_check_3($link, $data);
            // $data = xss_check_3($data);
            break;

        default :
            $data = sqli_check_3($link, $data);
            break;
    }
    return $data;
}

這是 sqli_check_3()

function sqli_check_3($link, $data)
{
    return mysqli_real_escape_string($link, $data);
    
}

mysqli_real_escape_string()函數轉義字符串中的特殊字符,好比中文等,詳細這裏https://www.runoob.com/php/func-mysqli-real-escape-string.html

 

while($row = $recordset->fetch_object())
{
    if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2")
    {
?>
        <tr height="40">
            <td align="center"><?php echo $row->id; ?></td>
            <td><?php echo $row->owner; ?></td>
            <td><?php echo $row->date; ?></td>
            <td><?php echo xss_check_3($row->entry); ?></td>   //這裏若是安全等級是 1 或 2 即 medium和high就通過xss_check_3()函數處理以後展現
        </tr>
<?php
    }
    else
    {
?>
        <tr height="40">
            <td align="center"><?php echo $row->id; ?></td>
            <td><?php echo $row->owner; ?></td>
            <td><?php echo $row->date; ?></td>
            <td><?php echo $row->entry; ?></td>
        </tr>
<?php
    }
}
function xss_check_3($data, $encoding = "UTF-8")
{
    // htmlspecialchars - converts special characters to HTML entities    
    // '&' (ampersand) becomes '&amp;' 
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'  
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

 

不知道怎麼Hack,網上的全都是一摸同樣的答案,難道不能Hack?

這個存儲型的通常在Blog中出現(?)

0x02:總結

有點像反射型XSS(同樣的?)漏洞修復建議:過濾輸入的數據,如<   >   '   "   onclick  on***等;對數據編碼,HTML實體編碼 JS編碼 

相關文章
相關標籤/搜索