WeChall - MD5.SALT
Challenge
Your mission is to login as Admin. The application is vulnerable to sql injection, but the signup process seems a bit "weird". 目标是以 admin 身份登录。用户名字段存在 SQL 注入漏洞。
题目给出了 users 表结构(username、password
两列)。登录表单同时兼具注册功能——输入新用户名和密码即可注册。
表单字段名为 username 和
credents。密码的存储方式为
md5($password . 'salt21')——即 MD5 后接固定盐值
salt21。
Solution
Step 1: 提取 admin 的密码 hash
通过 UNION 注入读取 admin 的 password 字段:
1 | username=' UNION SELECT CONCAT(username,0x3a,password),1 FROM users WHERE username='admin' -- |
返回结果:
1 | Hello Admin:215c61d0104f8925b5f7e4e87a7cbdfa... checking your credentials... |
admin 的密码 hash 为
215c61d0104f8925b5f7e4e87a7cbdfa。
Step 2: 确定 hash 算法
注册一个新用户,用 UNION 提取其 hash,与各种算法比对:
1 | # 注册新用户 extractnqwozrfv 密码 password1 |
比对算法后发现:md5('password1' . 'salt21') =
bd4db6aa036b085e72f546130e5007b7
Step 3: 破解 admin 的 hash
拿到 215c61d0104f8925b5f7e4e87a7cbdfa 后,需要用 MD5
反查得到明文。这里是本题最核心的一步——在线 MD5
反查服务。
尝试了多个在线 hash 反查网站:
- cmd5.com / xmd5.com — 需要付费
- pmd5.com — 解不出
- somd5.com — 成功解出,返回明文
academicsalt21
注意:hashcat / john 等本地工具也可以做,但对于这种简单单词 + 固定后缀的模式,用彩虹表/在线反查更快。关键在于 hash 的构造方式是
md5(明文密码 + 'salt21'),所以反查工具返回的原始输入是密码 + salt21整体。
Step 4: 去掉盐值得到真正密码
somd5 返回的明文是
academicsalt21。这里有个坑——直接拿这个值登录会失败。
题目的名字 MD5.SALT 是关键提示:salt 是拼接在 hash 计算过程中的,不是密码的一部分。所以:
1 | md5('academic' + 'salt21') = md5('academicsalt21') = 215c61d0104f8925b5f7e4e87a7cbdfa |
真正的密码是 academic,去掉末尾的
salt21。
Step 5: 登录
1 | username: admin |
登录成功,/en/challs 中该题显示为
wc_chall_solved_1。
关键的 SQL 注入点
LOGIN 功能的 SQL 查询:
1 | SELECT * FROM users WHERE username='$username' |
该查询结果用于获取用户名和密码 hash,然后 PHP 做密码对比:
1 | $row = $db->queryFirst("SELECT * FROM users WHERE username='$username'"); |
注册功能的 INSERT 也使用了相同的 hash 算法,所以注册和登录一致。
关于 "weird signup"
挑战描述提到注册过程 "a bit
weird"。检查源码发现,在注册时会校验你输入的密码是否和你真实的 WeChall
账号密码一致——如果是,会拒绝注册(err_fool:不允许在这里使用你的真实
WeChall 密码)。但这不影响解题。