关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客

0x01:过关流程

输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):

 http://localhost/sqli-labs/Less-26a/

本关是一个盲注,如果后端数据库中查询出了结果,就会返回;如果后端数据库出现了错误,或者啥也没有查出来,就会显示为空。下面是一个正常的响应样式:

本关的标题已经很清楚了,它会过滤你输入中的空格与注释(还有 andor 这种逻辑判断符号)。

下面讲一下测试思路,由于目标过滤了我们的空格,所以我们需要一些特殊的手段来绕过。这里笔者选择使用 BurpSuite 来进行爆破,下面是测试的基础语句(不管它咋过滤,我们测试还是得基于基础的 Payload 来进行绕过):

 基础 Payload: 1') anandd 1=('1

如下,设置爆破的 Payload 为数值型十六进制。ASCII 码的范围是 0 ~127,我们也只要爆破这么多即可,Payload 设置如下:

爆破完成后,按返回包的长度降序排一下就可以发现可用的值啦:

上面其实不能算是发现了空格的替代值,更像是确定我们的基础 Payload 没错:

 1') anandd 1=('1

其更大意义是证明了目标后端的 SQL 查询模板如下:

 select * from users where id=('$_GET["id"]');

下面是笔者根据上面的模板,测试出来的一个可用的攻击 Payload(测试方法和上面是一样的,使用 BurpSuite 爆破):

 -- 猜测目标后端数据库的第一个字符为 s,若回显了信息,则证明猜测正确
 1%27)%20anandd%2bif(mid(database(),1,1)=%27s%27,1,0)=(%271

可以看到,我们已经成功获取了当前站点使用的后端数据库的信息。至此,SQLI LABS Less-26a GET-Blind Based-All Your SPACES And COMMENTS Belong To Us-String Single Quotes-Parenthesis 成功过关。

0x02:源码分析

下面是 SQLI LABS Less-26a GET-Blind Based-All Your SPACES And COMMENTS Belong To Us-String Single Quotes-Parenthesis 后端的部分源码,以及笔者做的笔记:

 <?php
 //including the Mysql connect parameters.
 include("../sql-connections/sqli-connect.php");
 ​
 // take the variables 
 if (isset($_GET['id'])) {
     // 获取用户输入的内容
     $id = $_GET['id'];
     //logging the connection parameters to a file for analysis.
     $fp = fopen('result.txt', 'a');
     fwrite($fp, 'ID:' . $id . "\n");
     fclose($fp);
 ​
     //fiddling with comments
     // 这里是做一波过滤
     $id = blacklist($id);
     //echo "<br>";
     //echo $id;
     //echo "<br>";
     $hint = $id;
 ​
     // connectivity 
     // 然后直接拼接到 SQL 查询模板上
     $sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
     $result = mysqli_query($con1, $sql);
     $row = mysqli_fetch_array($result, MYSQLI_BOTH);
     if ($row) {
         echo "<font size='5' color= '#99FF00'>";
         echo 'Your Login name:' . $row['username'];
         echo "<br>";
         echo 'Your Password:' . $row['password'];
         echo "</font>";
     } else {
         // 如果未查询出信息,则啥都不输入
         echo '<font color= "#FFFF00">';
         //print_r(mysqli_error($con1));
         echo "</font>";
     }
 } else {
     echo "Please input the ID as parameter with numeric value";
 }
 ​
 // 这个是过滤函数
 function blacklist($id)
 {
     $id = preg_replace('/or/i', "", $id);           //strip out OR (non case sensitive)
     $id = preg_replace('/and/i', "", $id);      //Strip out AND (non case sensitive)
     $id = preg_replace('/[\/\*]/', "", $id);        //strip out /*
     $id = preg_replace('/[--]/', "", $id);      //Strip out --
     $id = preg_replace('/[#]/', "", $id);           //Strip out #
     $id = preg_replace('/[\s]/', "", $id);      //Strip out spaces
     $id = preg_replace('/[\s]/', "", $id);      //Strip out spaces
     $id = preg_replace('/[\/\\\\]/', "", $id);      //Strip out slashes
     return $id;
 }
 ?>
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐