bwapp系列

bWAPP中的HTML injection by L0st

2018-11-27  本文已影响0人  l0st

GET和POST型

表单提交:

<?php
if(isset($_GET["firstname"]) && isset($_GET["lastname"]))
{   

    $firstname = $_GET["firstname"];
    $lastname = $_GET["lastname"];    

    if($firstname == "" or $lastname == "")
    {
        echo "<font color=\"red\">Please enter both fields...</font>";       
    }
    else            
    { 

        echo "Welcome " . htmli($firstname) . " " . htmli($lastname);   

    }
}

?>

数据过滤:

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;

}

Low:

构造payload: <img src=0 onerror=alert(/hack/)>
直接弹窗了,因为接收表单提交的参数后使用no_check()函数:

function no_check($data)
{    
       return $data;        
}

没有进行任何过滤。

Medium:

构造payload: %3cimg%20src%3d0%20onerror%3dalert(%2fhacker%2f)%3e
这个等级使用了xss_check_1()函数来过滤字符:

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

可见该函数将字符串中的 > 和 < 替换为了HTML实体,然后又对字符串进行urldecode解码,故直接将< >进行urlencode再构造即可。

High:

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

可以看到对字符串使用了htmlspecialchars()函数,将危险字符进行转义,并且设置了编码为UTF-8。
暂时我还没想出来byPass的方法,如果解决了后续会更新。


反射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>

Low:

关于$_SERVER
安全等级为0时是将HTTP请求头中的HOST和URL内容读取过来。
用Burpsuite改包:

改包 反馈

具体作用暂时没想到。

Medium:

核心语句:

<script>document.write(document.URL)</script>

构造payload:http://localhost/bwapp/htmli_current_url.php?<h1>heyyy</h1>
这个问题只在IE上出现,火狐和Chrome均没有。

High:

核心语句:
"http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
该等级对于 $_SERVER["REQUEST_URI"] 使用了htmlspecialchars()函数,但是HTTP_POST没有经过处理,依旧可以用Low等级下改包的方法,但我暂时还是不知道有什么作用。

上一篇下一篇

猜你喜欢

热点阅读