2018-10-22-BWAPP注入篇

一.HTML注入
注入原理:服务端未对用户输入进行严格过滤导致,只要在可以接收用户输入的地方输入html标签,由于服务端为进行html编码,导致html标签可被浏览器解析执行,导致出现问题.
1.GET类型注入
服务端代码如下:

if(isset($_GET["firstname"]) && isset($_GET["lastname"]))//isset函数检测变量是否为空
    {   
        $firstname = $_GET["firstname"];
        $lastname = $_GET["lastname"];    

        if($firstname == "" or $lastname == "")
        {
            //firstname和lastname有一个为空就输出这句话
            echo "<font color=\"red\">Please enter both fields...</font>";       
        }
        else            
        { 
            //firstname和lastname都不为空才输出过滤后的firstname和lastname
            echo "Welcome " . htmli($firstname) . " " . htmli($lastname);   
        }
    }

对应的过滤代码htmli函数如下:

function htmli($data)
{
    switch($_COOKIE["security_level"])
    {
         //对应security_level为low
        case "0" : 
            $data = no_check($data);            
            break;
        //对应security_level为medium
        case "1" :
            $data = xss_check_1($data);
            break;
        //对应security_level为high
        case "2" :            
            $data = xss_check_3($data);            
            break;
        default : 
            $data = no_check($data);            
            break;   
    }       
    return $data;
}

A: Level Low
对应的xss_check_0的源代码如下所示:

function no_check($data)
{    
    return $data;//不做任何检查直接原样返回
}

输入payload如下所示:

First name:<marquee>vivo</marquee>//marquee起到滚动作用
Last name:<a href='http://www.baidu.com'>vivo</a>

效果如下所示:


图一

黑体的vivo点击以后会直接跳到百度首页.

B:Level Medium
对应的xss_check_1的源代码如下所示:

function xss_check_1($data)
{
    // Converts only "<" and ">" to HTML 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实体编码变成&lt和&gt,但是问题的关键是最后他进行了url解码,这样就出现一个问题,先进行url解码,然后不会被html编码,后面又进行url解码就还原出来了.

payload:%3cscript%3ealert(1)%3c%2fscript%3e
图二

C:Level High
对应的xss_check_2源代码如下所示:

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);//ENT_QUOTES - 编码双引号和单引号,默认是不设置的,记得是 & , ' , " , < , >.
}

这种情况下很难绕过了,等以后知识再进一步丰富再来研究.

2.POST类型注入
服务端代码和html过滤函数代码都同GET类型一样,防御代码也一样,只是把参数传递方式换成post而已,其他做法没啥变化.

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

A:Level Low
Level Low是采用拼接的方式,从host字段中取出值并拼接成current_url,所以只要直接改了host字段就可以了.


图三

图四

B:Level Medium
Document.url返回当前文档的url,document.write可向文档中写入 HTML 表达式或 JavaScript 代码.

C: Level High
xss_check_3的代码如下所示:

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);//进行了html实体编码,对',",<,>,&符号进行编码,ENT_QUOTES设置了',"同样有效.
}

4.HTML Injection Blog
服务端代码如下所示:

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进行过滤,所以直接补上sqli_check_3代码如下:

 function sqli_check_3($link, $data)
 {    
     return mysqli_real_escape_string($link, $data);     
 }//该函数对SQL 语句中使用的字符串中的特殊字符进行转义,以下字符收到影响, \x00, \n, \r, \, ', ", \x1a

但是经过实测发现,low level并没有任何防御,而medium以及high等级应该是mysqli_real_escape_string函数过滤了,不存在啥可以绕过的条件.

二.SMTP注入
先直接上服务端源代码如下

$email = "";
$recipient = $smtp_recipient;
$subject = "bWAPP - Mail Header Injection (SMTP)";
$message = "";
// $debug = "false";
if(isset($_POST["form"]))
{
    // E-mail validation if the security level is MEDIUM or HIGH
    if(!email_check_2($_POST["email"]) && ($_COOKIE["security_level"] == "1" || $_COOKIE["security_level"] == "2"))
    {
        $message = "<font color=\"red\">Enter a valid e-mail address!</font>";
    }
    else
    {
        // If the SMTP server is blank, then the default SMTP server is set (php.ini)
        if($smtp_server != "")
        {
            ini_set( "SMTP", $smtp_server);
            //Debugging
            // $debug = "true";
        }
        // HIGH security level
        if($_COOKIE["security_level"] == "2")
        {
            $email = maili_check_2($_POST["email"]);
            // Debugging
            // $email = "foo@foo.com\r\nCc:bar@bar.com";
        }
        else
        {       
            $email = $_POST["email"];
            // Debugging
            // $email = "foo@foo.com\r\nCc:bar@bar.com";
        }
        // Formatting the message body
        $content =  "Content:\n\n";
        $content .= "Name: " . $_POST["name"] . "\n";
        $content .= "E-mail: " . $email . "\n";
        $content .= "Remarks: \n";
        $content .= $_POST["remarks"] . "\n\n";
        $content .= "Greets from bWAPP!";
        // Sends the e-mail
        $status = @mail($recipient, $subject, $content, "From: $email");
        if($status != true)
        {
            $message = "<font color=\"red\">An e-mail could not be sent...</font>";
            // Debugging
            // die("Error: mail was NOT send");
            // echo "Mail was NOT send";
        }
        else
        {
            $message = "<font color=\"green\">Your message has been sent to our master bee!</font>";
            // Debugging
            // echo "e-mail: ".$email;
            // echo "<br />";
            // echo "SMTP server: ". $debug;   
 
        }
    }
}

这里介绍一个参考链接:http://www.freebuf.com/articles/web/14918.html

A: Level Low
这个等级没有进行任何的过滤措施,因此可以直接注入smtp,其实也就是改变发件人,主题,正文等等而已.


图五

Level medium以及Level High找不到过滤部分的源代码,经测试实践中是没经过过滤的.

三.命令注入
1.系统命令注入
先上服务端代码如下所示:

function commandi($data)
{
    switch($_COOKIE["security_level"])
    {
        case "0" :
            $data = no_check($data);
            break;
        case "1" :
            $data = commandi_check_1($data);
            break;
        case "2" :
            $data = commandi_check_2($data);
            break;
        default :
            $data = no_check($data);
            break;
    }
    return $data;
}
?>

A:Level Low
根据服务端代码可知道没有进行任何防御,因此直接上&&符号执行代码就行了.


图六

B:Level Medium
防御代码如下所示:

function commandi_check_1($data)
{
    
    $input = str_replace("&", "", $data);
    $input = str_replace(";", "", $input);
    
    return $input;
    //显然把&符号以及;给过滤掉了,没事,还有|符号
}
图七

C:Level High
防御代码如下所示:

function commandi_check_2($data)
{    
    return escapeshellcmd($data);     
}//该函数把所有可能造成命令注入的符号进行转义,而在win平台上,则是被空格代替

2.命令注入盲注
先上服务端代码如下:

function commandi($data)
{
    switch($_COOKIE["security_level"])
    {
        case "0" :
            $data = no_check($data);
            break;
        case "1" :
            $data = commandi_check_1($data);
            break;
        case "2" :
            $data = commandi_check_2($data);
            break;
        default :
            $data = no_check($data);
            break;
    }
    return $data;
}
?>

A:Level Low
Level Low的命令注入方法和前面并无不同,差别在于完全没有任何返回信息,因此命令执行了没有你是不知道的,需要通过一些手段来判别.这里有一种根据返回时间来判别的方法.https://www.cnblogs.com/hongren/p/7169083.html
其他的我觉得可以用netcat反弹以及bash反弹来尝试有没有执行成功,但是发现并没有反弹回来,其他命令执行了也没任何回显,网上别人的文章都是能反弹成功的...这就尴尬了.....

Level medium以及Level high的防御代码和前面是一样的,就不重复了.

四.php代码注入
服务端代码如下:

<?php
if(isset($_REQUEST["message"]))
{
    // If the security level is not MEDIUM or HIGH
    if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
    {
    <p><i><?php @eval ("echo " . $_REQUEST["message"] . ";");?></i></p>
    }//低等级执行命令,将message之后的代码打印出来
    // If the security level is MEDIUM or HIGH
    else
    {
    <p><i><?php echo htmlspecialchars($_REQUEST["message"], ENT_QUOTES, "UTF-8");;?></i></p>//高等级和中等级要进行特殊字符的html实体编码
    }
}
?>

从代码中可以看出他接收message的值,然后echo,echo这里用了eval函数,低等级没进行过滤,从而存在问题.


图八

Level Medium以及Level High进行编码,虽然没啥卵用,但是由于没出现eval函数,就没问题了.

五.server-side includes injection (ssi)
废话少说,服务端代码如下:

<?php
$field_empty = 0;
function xss($data)
{
    switch($_COOKIE["security_level"])
    {
        case "0" :
            $data = no_check($data);
            break;
        case "1" :
            $data = xss_check_4($data);
            break;
        case "2" :
            $data = xss_check_3($data);
            break;
        default :
            $data = no_check($data);
            break;
    }       
    return $data;
}
if(isset($_POST["form"]))
{
    $firstname = ucwords(xss($_POST["firstname"]));
    $lastname = ucwords(xss($_POST["lastname"]));
    if($firstname == "" or $lastname == "")
    {
        $field_empty = 1;
    }
    else//这里的代码才是关键
    {
        $line = '<p>Hello ' . $firstname . ' ' . $lastname . ',</p><p>Your IP address is:' . '</p><h1><!--#echo var="REMOTE_ADDR" --></h1>';
        // Writes a new line to the file
        $fp = fopen("ssii.shtml", "w");
        fputs($fp, $line, 200);
        fclose($fp);
        header("Location: ssii.shtml");//header() 函数向客户端发送原始的 HTTP 报头
        exit;
    }
}
?>

该段代码接收了用户输入的用户名和密码以后,直接根据安全等级过滤输入,然后把输入写入html文件中,再从html文件取出消息头部向客户端发送响应.

A:Level Low
低等级没有进行任何的防护,因此直接加上<script>代码就可以构成xss攻击了.


图九

图十

B:Level Medium
防御代码如下:

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

网上查了addslashes的绕过方法,发现并不能设置宽字节以及没有各种解码方案,所以并不能绕过该函数.

C:Level High
防御代码如下所示:

function check($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);
       
}

进行html特殊字符编码,基本绕不过了.

六.SQL注入
1.GET类型的SQL注入
先上服务端防御代码如下:

function sqli($data)
{

    switch($_COOKIE["security_level"])
    {

        case "0" :

            $data = no_check($data);
            break;

        case "1" :

            $data = sqli_check_1($data);
            break;

        case "2" :

            $data = sqli_check_2($data);
            break;

        default :

            $data = no_check($data);
            break;
    }
}

A: Level Low的注入过程和以前的DVWA没啥太大的区别,就不重复了

B:Level Medium的防御代码如下:

function sqli_check_1($data)
{
 return addslashes($data);
 }

同前,需要有一定条件才能绕过该函数

C:Level high

function sqli_check_2($data)
{  
    return mysql_real_escape_string($data);   
}

基本没啥机会绕过了....不过还是预编译查询大法好

2.POST 类型注入
该类型注入和Get类型没啥区别,所以这里不再重复.

3.Captcha SQL注入
服务端代码如下所示:

$message = "";
// Debugging
// echo print_r($_SESSION);
if(isset($_POST["form"]) && isset($_SESSION["captcha"]))
{
    if($_POST["captcha_user"] == $_SESSION["captcha"])
    {
        $_SESSION["manual_interv"] = 1;
        
        header("Location: sqli_9.php");
        
        exit;
    }
    else
    {
        $message = "<font color=\"red\">Incorrect CAPTCHA!</font>";
    }
}
?>

其中sqli_9.php的代码如下所示:

<?php
if(isset($_REQUEST["action"]) && $_REQUEST["action"] == "stop")
{
    $_SESSION["manual_interv"] = 0;    
      
    // print_r($_SESSION);
}
if(!(isset($_SESSION["manual_interv"])) || $_SESSION["manual_interv"] != 1)
{
    header("Location: manual_interv.php");
    exit;
}
else
{
    function sqli($data)
    {
        switch($_COOKIE["security_level"])
        {
            case "0" : 
                $data = no_check($data);            
                break;
            case "1" :
                $data = sqli_check_1($data);
                break;
            case "2" :            
                $data = sqli_check_2($data);            
                break;
            default : 
                $data = no_check($data);            
                break;   
        }       
        return $data;
    }
?>

从代码中可以看出,基本上需要先验证码正确通过,然后才会到事件处理部分.
这道题目看看源代码就好,然后搞明白一点,验证码在开发中只是验证对不对,并没有进行查询,所以不存在sql注入,要有sql注入首先需要有查询行为或者其他sql语句出现,所以这题目也只是手工输入验证码以后进行普通sql注入而已.

4.Select Get SQL Injection
服务端代码如下所示:

<?php
if($_COOKIE["security_level"] == "2")
{
    
    header("Location: sqli_2-ps.php");
    
    exit;
    
}
$sql = "SELECT * FROM movies";
$recordset = mysql_query($sql, $link);  
function sqli($data)
{
         
    switch($_COOKIE["security_level"])
    {
        
        case "0" : 
            
            $data = no_check($data);            
            break;
        
        case "1" :
            
            $data = sqli_check_2($data);
            break;
        
        default : 
            
            $data = no_check($data);            
            break;   
    }       
    return $data;
}
?>

其中 sqli_2-ps.php的关键代码如下所示:

<?php
if(isset($_GET["movie"]))
{   
    $id = $_GET["movie"];
    $sql = "SELECT title, release_year, genre, main_character, imdb FROM movies WHERE id =?";
    if($stmt = $link->prepare($sql)) //预编译执行,第一次看到这样搞的代码,nice
    // if($stmt = mysqli_prepare($link, $sql))                
    {
        // Binds the parameters for markers
        $stmt->bind_param("s", $id);//接收变量
        // mysqli_stmt_bind_param($stmt, "s", $id);
        // Executes the query
        $stmt->execute();//执行sql语句
        // mysqli_stmt_execute($stmt);
        // Binds the result variables
        $stmt->bind_result($title, $release_year, $genre, $main_character, $imdb);
        // mysqli_stmt_bind_result($stmt, $title, $release_year, $genre, $main_character, $imdb);
        // Stores the result, necessary to count the number of rows
        $stmt->store_result();      
        // mysqli_stmt_store_result($stmt);
        // Prints the number of rows
        // printf("Number of rows: %d.\n", mysqli_stmt_num_rows($stmt));
        // printf("Number of rows: %d.\n", $stmt->num_rows);      
        if($stmt->error)
        // if(mysqli_stmt_error($stmt))
        {        
?>

可以看出如果是高等级的话,基本就不存在sql注入了,而普通的低等级以及中等级代码就和之前差不多了.


图十一

5.SQL injection(Login Form)
服务端源代码如下所示:

function sqli($data)
{
    switch($_COOKIE["security_level"])
    {
        case "0" :
            $data = no_check($data);
            break;
        case "1" :
            $data = sqli_check_1($data);
            break;
        case "2" :
            $data = sqli_check_2($data);
            break;
        default :
            $data = no_check($data);
            break;
    }
    return $data;
}

基本上万能密码绕过就可以了.


图十二

高级以及中级估计就是addslash和htmlspecialchars函数转义了.

6.SQL Injection-stored(Blog)
服务端主要源代码如下所示:

<?php
        if(isset($_POST["blog"]))
        {
            $entry = sqli($_POST["entry"]);
            $owner = $_SESSION["login"];
            if($entry == "")
            {
                $message =  "<font color=\"red\">Please enter some text...</font>";
            }
            else
            {
                $sql = "INSERT INTO blog (date, entry, owner) VALUES (now(),'" . $entry . "','" . $owner . "')";
                $recordset = $link->query($sql);
                if(!$recordset)
                {
                    die("Error: " . $link->error . "<br /><br />");
                }
                // Debugging
                // echo $sql;
                $message = "<font color=\"green\">The entry was added to our blog!</font>";
            }
        }
        echo "&nbsp;&nbsp;" . $message;
?>

从代码中可以看到中间是有一条insert插入语句的,这语句是动态拼接起来的,然后后面又执行了一次查询,把你插入的语句给查询出来,所以这里存在注入点.

Level Low的注入方法是: ',(select version()))#
这里的插入查询选择点应该是owner这个值.
相关的mysql执行过程如下所示:


图十三

图十四

执行效果如下所示:


图十五

所以以后这种插入博客然后进行查询显示的地方都可以进行sql注入尝试.

7.SQL injection -stored(XML)
先上源代码如下:

先是一段前端的
 <script type="text/javascript">
        function ResetSecret()
        {
            var xmlHttp;
            // Code for IE7+, Firefox, Chrome, Opera, Safari
            if(window.XMLHttpRequest)
            {
                xmlHttp = new XMLHttpRequest();
            }
            // Code for IE6, IE5
            else
            {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlHttp.open("POST","sqli_8-2.php",true);
            xmlHttp.setRequestHeader("Content-type","text/xml; charset=UTF-8");
            xmlHttp.send("<reset><login><?php if(isset($_SESSION["login"])){echo $_SESSION["login"];}?></login><secret>Any bugs?</secret></reset>");
        }
    </script>
//sqli_8-2.php源代码如下所示:
<?php
include("security.php");
include("security_level_check.php");
include("connect_i.php");
$message = "";
$body = file_get_contents("php://input");
// If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{
    ini_set("display_errors",1);//该函数用于设置php一些选项,例如这里设置display_error为1
    $xml = simplexml_load_string($body);
    // Debugging
    // print_r($xml);
    $login = $xml->login;
    $secret = $xml->secret;//获取xml中的内容
    if($login && $login != "" && $secret)
    {
        $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";//注入点就在这里
        // Debugging
        // echo $sql;      
        $recordset = $link->query($sql);
        if(!$recordset)
        {
            die("Connect Error: " . $link->error);
        }
        $message = $login . "'s secret has been reset!";
    }
    else
    {
        $message = "An error occured!";
    }
}
// If the security level is MEDIUM or HIGH
else
{
    // Disables XML external entities. Doesn't work with older PHP versions!
    // libxml_disable_entity_loader(true);
    $xml = simplexml_load_string($body);
    
    // Debugging
    // print_r($xml);
    $login = $_SESSION["login"];
    $secret = $xml->secret;
    if($secret)
    {
        $secret = mysqli_real_escape_string($link, $secret);//中高等级上转义函数
        $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
        // Debugging
        // echo $sql;      
        $recordset = $link->query($sql);
        if(!$recordset)
        {
            die("Connect Error: " . $link->error);
        }
        $message = $login . "'s secret has been reset!";
    }
    else
    {
        $message = "An error occured!"; 
    }
}
echo $message;
$link->close();
?>

所以感觉这个也没啥,其实sql注入的根本点是出现查询或者插入等其他sql语句的地方,所以没啥大改变,上一张burp的图就好了.


图十六

8.SQL Injection (Blind)
源代码如下所示:

    <?php
    if(isset($_REQUEST["title"]))
    {
        $title = $_REQUEST["title"];
        $sql = "SELECT * FROM movies WHERE title = '" . sqli($title) . "'";
        $recordset = mysql_query($sql, $link);
        if(!$recordset)
        {
            die("<font color=\"red\">Incorrect syntax detected!</font>");
            // die("Error: " . mysql_error());
        }
        if(mysql_num_rows($recordset) != 0)
        {
            echo "The movie exists in our database!";
        }
        else
        {
            echo "The movie does not exist in our database!";
        }
        mysql_close($link);
    }
    ?>

典型注入,未进行过滤,从源代码来看他只会显示语法错误或者电影存在不存在,没有其他显示了.
Level Low的注入点在title这里,也就是输入的东东.
输入指令为

Iron Man' and if(ascii(substr((select database()),1,1))<120,sleep(10),1)#

效果


图十七

9.SQL Injection - Blind (WS/SOAP)
先上主要源代码如下:

<?php
if(isset($_REQUEST["title"]))
{   
    // Includes the NuSOAP library
    require_once("soap/nusoap.php");
    // Creates an instance of the soap_client class
    $client = new nusoap_client("http://localhost/bWAPP/ws_soap.php");
    // Calls the SOAP function
    $tickets_stock = $client->call("get_tickets_stock", array("title" => sqli($_REQUEST["title"])));
    echo "We have <b>" . $tickets_stock . "</b> movie tickets available in our stock.";
}
?>

这里简单介绍一下SOAP的内容.
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
或者更简单地说:SOAP 是用于访问网络服务的协议。
所以注入点应该是存在于sqli函数这里
sqlmap结果如下所示:


图十八

Level High以及Level Medium应该做了addslashes还有htmlspecialchars转换,基本就不存在问题了.

9.XML/XPath注入
源代码如下所示

<?php
if(isset($_REQUEST["genre"])) 
{
    
    $genre = $_REQUEST["genre"];
    $genre = xmli($genre);
   
    // Loads the XML file
    $xml = simplexml_load_file("passwords/heroes.xml");
     
    // XPath search
    // $result = $xml->xpath("//hero[genre = '$genre']/movie");
    $result = $xml->xpath("//hero[contains(genre, '$genre')]/movie");
    
    // Case insensitive search
    // $result = $xml->xpath("//hero[contains(translate(genre, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate('$genre', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/movie");
    
    // $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ";
    // $lower = "abcdefghijklmnopqrstuvwxyzæøå";
    
    // $result = $xml->xpath("//hero[contains(translate(genre, '$upper', '$lower'), translate('$genre', '$upper', '$lower'))]/movie");
    // Debugging
    // print_r($result);  
    // echo $result[0][0];  
    // echo $result[0]->login;
    if($result)
    {    
        foreach($result as $key => $row)       
        {
            // print_r($row);    
?>

在学习之前请先学习一些一些xml的语法知识,然后再学习人家为啥这样注入.
链接如下:https://www.cnblogs.com/backlion/p/8554749.html
从源代码可以看出主要是一个xpath注入,接收了genre变量输入以后就直接生成xml路径进去搜索,在这个时候用到了xpath注入.
注入的payload如下所示:')] | //* | //* [('
')]是用来闭合前面的函数以及查询条件,中间的//* | //用来查询当下文档里面所有子元素.
构成的查询语句如下所示:
//hero[contains(genre, '')] | //
| //* [('')]/movie
这样就完成了一次xml注入.
前面博主介绍了一款xml盲注工具,叫xcat,可以在python3下面运行的命令行工具,本来想试试,但是发现老是包ipgetter出错无法下载,所以只能这样了.

10.XML/Xpath injection (login form)
源代码如下:

<?php
if(isset($_REQUEST["login"]) & isset($_REQUEST["password"]))
{
    $login = $_REQUEST["login"];
    $login = xmli($login);//xmli函数就是确定安保等级那个
    $password = $_REQUEST["password"];
    $password = xmli($password);
    // Loads the XML file
    $xml = simplexml_load_file("passwords/heroes.xml");
    // XPath search
    $result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");
    // Debugging
    // print_r($result);
    // echo $result[0][0];
    // echo $result[0]->login;
    if($result)
    {
        $message =  "<p>Welcome <b>" . ucwords($result[0]->login) . "</b>, how are you today?</p><p>Your secret: <b>" . $result[0]->secret . "</b></p>";
 
    }
    else
    {
        $message = "<font color=\"red\">Invalid credentials!</font>";
    }
?>

这道题目答案怪怪的,比如正常应该是下处理双引号,但是结果却发现答案是先处理单引号,而且单引号比坏人的方式也和以前不太一样,是用or'来闭合成or' '
payload如下:whatever' or 1=1 or '
如下:


图十九.png

至此,注入篇就到这里结束了....

然后写点总结吧
BWAPP里面的注入一共有HTML注入,SMTP注入,命令注入,php代码注入,ssii,SQL注入,xml/xpath注入
这里的话,写一点各种注入的形式总结....

HTML注入主要是往服务端注入各种html代码,但不一定会存储在服务端,可能只是反弹回来而已,主要以你注入的HTML代码为准.

SMTP注入有点鸡肋,就是改变一下邮件发件人,邮件的标题,内容等等而已....特定场合才用得上吧.

命令注入就不用说了,这个和DVWA很像,没啥新玩意.

php代码注入,这个eval函数应该是其他的语言也有的,例如get给参数到他的title里面,你就可以试试一个phpinfo()等等.

ssii其实没太大高大上的地方,就是server-side include injection,怎么说呢,就是你把代码注入到服务器文件里面,然后服务端再把文件包含起来.所以试试什么xss代码都是可以的.

SQL注入做了这么多,就一句话:有sql语句的地方都可以试试.

XML注入,主要是你要理解好xml/xpath是用来干嘛的,然后搞动xml的基本语法,不然注入的payload你都看不懂...

访问控制篇见了~~~


Gakki.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 误区警示: 当使用"对象"这个术语时,既可以指一个具体的对象,也可以泛指一般的对象,但是当使用"实例"这个术语时,...
    cd4254818c94阅读 142评论 0 1
  • 高考之后,他们就分开去了不同的城市。开始了四年的异地恋。 刚进大学的种种憧憬及新鲜,让她忘记了高考挺过来的压力。他...
    素锦速速阅读 182评论 0 2
  • 昨天晚上去参加了同学聚会,工作这么多年,都没有参加过,昨天刚好赶到了一起,发现同学们有些没什么变化,有些变化好大,...
    嘟嘟1108阅读 126评论 0 0