核心原理:
构造数据库操作命令的语句:
select * from admin where user=‘$name’ and password=‘$pwd’
当提交用户名admin,密码123456时:
select * from admin where user=‘admin' and password=‘123456’
当提交用户名admin,密码1’ or ‘1’=‘1时:
select * from admin where user=‘admin’ and password=‘1’or ‘1’=‘1’
当AND和OR运算符同时出现时,先进行AND运算,再进行OR运算, 而‘1’=‘1’恒成立
因此只要数据库中有记录,返回的结果集一定不为空,即登录必然成功。
同一条SQL语句中同时出现and和or,and 执行的优先级比 or 高
这里列出3种比较经典的万能密码
1、Brute Force下的结果及原因
1.1、结果
图一,这里显示不能登录
图二登录成功
1.2、原因
在Brute Force源码中用红笔括号起来的代码表示从数据库中得到的结果只有一条才符合条件
而在数据库中查询图一中的username有不止一条结果符合,查询到超过一条结果,所以图一错误
在数据库中查询图二中的username只有一条结果符合,所以图二正确
2、login.php登录界面的结果及原因
2.1、结果
这里显示能登录
2.2、原因
在login.php源码中用红笔括号起来的代码表示从数据库中得到的结果只要非0就符合条件
3、总结
不同的网站有不同的过滤机制,像这里dvwa的登录界面和Brute Force的过滤机制就不一样了。虽然都是通过
mysql_num_rows这个函数查询数据库结果并返回但是一个是==1 一个是!==0,这就导致结果存在差异。
还有其中的admin or 1 or 1会查询所有结果,而admin or 1=1 admin or 1只返回admin一个结果。