关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-49/
本关考察的其实是 ORDER BY
后的注入(虽然它被归结到了堆叠注入中,但其实它并不是)。
本关的注入点很好测试:
Payload 01: 1 => 页面会正常返回排序后的数据
Payload 02: 1' => 页面会返回空值(证明后端出错了,也证明 ' 与其后端模板拼接成功)
Payload 03: 1' and '1 => 页面会返回正常排序后的数据
根据上面的返回结果我们就可以推测出,其后端模板如下:
select * from users order by '$_GET["sort"]';
那么现在的问题就是,如何构造盲注 Payload 来获取其后端数据?由于 ORDER BY
后的传参被 '
号包裹了,所以我们现在传数字也不是,传字段也不是,都起不了什么用:
那我们转换个思路,听说过多字段排序吗,我们尝试传入以 ,
号分隔的多个字段:
那么,根据上面的原理,我们结合一下布尔盲注,就可以获取其后端数据啦,下面是 Payload:
-- 推测其后端数据库名称的第一个字符是 's',如果是则按 username 排序,否则按 id 字段排序
2',if(mid(database(),1,1)='s',username,id),'2
如上,我们已经能够获取目标后端数据库信息了。至此,SQLI LABS Less-49 GET-Error Based-String-Blind-ORDER BY CLAUSE 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-49 GET-Error Based-String-Blind-ORDER BY CLAUSE 后端的部分源码,以及笔者做的笔记:
<?php
include("../sql-connections/sqli-connect.php");
$id = $_GET['sort'];
if (isset($id)) {
//logging the connection parameters to a file for analysis.
$fp = fopen('result.txt', 'a');
fwrite($fp, 'SORT:' . $id . "\n");
fclose($fp);
// 本关的难点在这里,被引号包裹的 ORDER BY 参数如何利用,话又说回来,你被引号包裹了,你自己传 id 也没用啊,就很迷惑
$sql = "SELECT * FROM users ORDER BY '$id'";
$result = mysqli_query($con1, $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 = mysqli_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 "Please input parameter as SORT with numeric value<br><br><br><br>";
echo "<br><br><br>";
echo '<img src="../images/Less-47.jpg" /><br>';
echo "Lesson Concept and code by <b>D4rk</b>";
}
?>
标签:Blind,Based,String,Less,echo,SQLI,Payload,nbsp,ORDER
From: https://blog.csdn.net/m0_73360524/article/details/143681895