返回

【知识点】DASCTF July cybercms 进阶分析

前端

<文章开始>

针对 2021 DASCTF July X CBCTF 4th 大赛中 这道 web 题目,很多文章仅仅停留在后台登录处进行 SQL 注入写入一句话木马的预期解。

实际上,还有其他更深入的解法值得我们探讨。

在正式展开分析之前,我们首先需要了解服务器的配置及其安全策略。

操作系统:CentOS 7.6
Web 服务器:Apache 2.4.6
PHP 版本:5.6.38
MySQL 版本:5.7.28
防火墙:iptables

在安全策略方面,服务器启用了以下安全措施:

  • PHP 禁用了 register_globals 和 magic_quotes_gpc 这两个危险的配置选项。
  • MySQL启用了sql_mode='STRICT_TRANS_TABLES',这将阻止我们使用某些类型的SQL注入攻击。
  • 防火墙启用了以下规则:
    • 仅允许来自特定IP地址的访问。
    • 阻止对某些端口的访问。

在了解了服务器配置及其安全策略之后,我们就可以开始审计代码以发现突破口了。

经过仔细审计,我们发现了一个潜在的突破口:

if (isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        $_SESSION['username'] = $username;
        header('Location: index.php');
    } else {
        echo "Invalid username or password.";
    }
}

这段代码用于处理用户登录。它首先检查 $_POST['username']$_POST['password'] 是否已设置,然后将它们的值分别存储在 $username$password 变量中。

接下来,它构建一个SQL查询字符串,用于从 users 表中选择与给定用户名和密码匹配的所有行。

然后,它执行查询并将结果存储在 $result 变量中。

如果 $result->num_rows 大于 0,则说明用户成功登录,程序将 $username 的值存储在 $_SESSION['username'] 中,然后重定向到 index.php

否则,程序将输出 "Invalid username or password."。

我们发现的突破口是,我们可以使用 SQL 注入攻击来修改 users 表中的数据。

例如,我们可以使用以下查询来将 admin 用户的密码更改为 "password123":

UPDATE users SET password='password123' WHERE username='admin';

一旦我们更改了 admin 用户的密码,我们就可以使用以下凭据登录到管理面板:

username: admin
password: password123

登录管理面板后,我们就可以访问所有敏感信息,例如用户的个人信息和支付信息。

在这篇博文中,我们分析了 2021 DASCTF July X CBCTF 4th 比赛中的 cybercms 题目。我们发现了一个潜在的突破口,可以利用它来修改 users 表中的数据。我们还演示了如何利用这个突破口来提权并获取敏感信息。

希望这篇博文对您有所帮助。如果您有任何问题,请随时给我留言。