1. 程式人生 > >跟bWAPP學WEB安全(PHP程式碼)--HTML注入和iFrame注入

跟bWAPP學WEB安全(PHP程式碼)--HTML注入和iFrame注入

背景


這裡講解HTML注入和iFrame注入,其他的本質都是HTML的改變。那麼有人會問,XSS與HTML注入有啥區別呢?其實本質上都是沒有區別的,改變前端程式碼,來攻擊客戶端,但是XSS可以理解為注入了富文字語言程式程式碼,而HTML注入只注入了超文字標記語言,不涉及富文字程式程式碼的問題。這裡的iframe注入實際上就是一個閱讀器,可以閱讀通過協議載入的活伺服器本地的檔案。

HTML注入


在這裡不在區分GET和POST,沒有任何意義,只看一下反射和儲存。

沒有防禦--簡單級



一般防禦--中等級


直接編碼就可以繞過,不編碼會被轉義成HTML實體字元

完善防禦--高等級


安全

程式碼分析


function htmli($data)
{
         
    switch($_COOKIE["security_level"])
    {
        
        case "0" : 
            
            $data = no_check($data);            
            break;
        
        case "1" :
            
            $data = xss_check_1($data);
            break;
        
        case "2" :            
                       
            $data = xss_check_3($data);            
            break;
        
        default : 
            
            $data = no_check($data);            
            break;;   

    }       

    return $data;

}
function xss_check_1($data)
{
    
    // Converts only "<" and ">" to HTLM entities    
    $input = str_replace("<", "&lt;", $data);
    $input = str_replace(">", "&gt;", $input);
    
    // Failure is an option
    // Bypasses double encoding attacks   
    // <script>alert(0)</script>
    // %3Cscript%3Ealert%280%29%3C%2Fscript%3E
    // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
    $input = urldecode($input);
    
    return $input;
    
}

function xss_check_2($data)
{
  
    // htmlentities - converts all applicable characters to HTML entities
    
    return htmlentities($data, ENT_QUOTES);
    
}

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);
       
}

function xss_check_4($data)
{
  
    // addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
    // These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
    // Do NOT use this for XSS or HTML validations!!!
    
    return addslashes($data);
    
}

函式xss_check_1只過濾<>轉移為HTML實體,但是對編碼的解碼放在了後面,如果把編碼解碼放前面呢就可以也過濾了,我們來試試。

function xss_check_1($data)
{

    // Converts only "<" and ">" to HTLM entities
    $input = urldecode($input);
    $input = str_replace("<", "&lt;", $data);
    $input = str_replace(">", "&gt;", $input);

    // Failure is an option
    // Bypasses double encoding attacks
    // <script>alert(0)</script>
    // %3Cscript%3Ealert%280%29%3C%2Fscript%3E
    // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
    //$input = urldecode($input);

    return $input;

}



xss_check_3這個函式則使用了htmlspecialchars函式能轉移編碼後的實體,他的作用很大,能很好的防禦這類攻擊。而儲存型的在中級和高階難度中都使用了這個函式,所以只有初級才可以把儲存的資訊直接輸出到頁面

iFrame 注入


在這裡可以成為閱讀器(www目錄下所有靜態檔案的閱讀器)和跳轉和一個可以誘導客戶訪問某站點的一個點,利用:大小size設定為0時可以理解為無互動的刷訪問、前端挖礦、掛黑鏈、誘導下載等等。

現象


程式碼分析:


<?php

if($_COOKIE["security_level"] == "1" || $_COOKIE["security_level"] == "2")
{

?>
    <iframe frameborder="0" src="robots.txt" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php

}

else
{

?>
    <iframe frameborder="0" src="<?php echo xss($_GET["ParamUrl"])?>" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php

}

?>

可以看到,當最低階的事後iframe位置可控,中高階則寫死,不可控,則無法利用。又因為height和width兩個引數,想構造XSS需要閉合",在xss_check_3過濾了",所以高階沒戲,中、低階的確實可以。