bWAPP中的HTML injection by L0st

GET和POST型

表单提交:

Please enter both fields...";       
    }
    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:
直接弹窗了,因为接收表单提交的参数后使用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("<", "<", $data);
    $input = str_replace(">", ">", $input);
    
    // Failure is an option
    // Bypasses double encoding attacks   
    // 
    // %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 '&' 
    // '"' (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()函数,将危险字符进行转义,并且设置了编码为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 = "";
        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;

}

核心代码:

HTML Injection - Reflected (URL)

Your current URL: " . $url . "

";?>

Low:

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

改包

反馈

具体作用暂时没想到。

Medium:

核心语句:


构造payload:http://localhost/bwapp/htmli_current_url.php?

heyyy


这个问题只在IE上出现,火狐和Chrome均没有。

High:

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

你可能感兴趣的:(bWAPP中的HTML injection by L0st)