SQLI LABS | Less-51 GET-Error Based-ORDER BY CLAUSE-String-Stacked Injectiion
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-51/
本关注入点很好测试,传入 1'
会显示后端的报错信息(其实在传递数字的时候就不对劲了,当你传入 1
,2
时会发现页面没有变化,证明其后端把你传递的内容未能识别或者识别成一样的东西了,出现这种情况,多半是参数被 ' "
这类特殊符号包裹了,导致丢失其原本含义):
根据上面的报错信息,结合 SORT 的功能,我们可以推测出其后端的 SQL 模板如下:
select * from users order by '$_GET["sort"]';
所以,攻击 Payload 如下:
-- 修改 id=1 的用户的账号
1';update users set username='HACKER' where id=1;select '1
如上,我们已经能够修改数据库中任意的数据了。至此,SQLI LABS Less-51 GET-Error Based-ORDER BY CLAUSE-String-Stacked Injectiion 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-51 GET-Error Based-ORDER BY CLAUSE-String-Stacked Injectiion 后端的部分源码,以及笔者做的笔记:
<?php
include("../sql-connections/sqli-connect.php");
error_reporting(0);
$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);
// 与上一关的区别也就在这了,被 ' 号包裹了
$sql = "SELECT * FROM users ORDER BY '$id'";
/* execute multi query */
if (mysqli_multi_query($con1, $sql)) {
?>
<center>
<font color="#00FF00" size="4">
<table border=1'>
<tr>
<th> ID </th>
<th> USERNAME </th>
<th> PASSWORD </th>
</tr>
</font>
</font>
<?php
/* store first result set */
if ($result = mysqli_store_result($con1)) {
while ($row = mysqli_fetch_row($result)) {
echo '<font color= "#00FF11" size="3">';
echo "<tr>";
echo "<td>";
printf("%s", $row[0]);
echo "</td>";
echo "<td>";
printf("%s", $row[1]);
echo "</td>";
echo "<td>";
printf("%s", $row[2]);
echo "</td>";
echo "</tr>";
echo "</font>";
}
}
echo "</table>";
} else {
echo '<font color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}
} else {
echo "Please input parameter as SORT with numeric value<br><br><br><br>";
echo "<br><br><br>";
echo '<img src="../images/Less-51.jpg" /><br>';
}
?>