我们先尝试随意输入用户名 123 和密码 123 登录:
从错误页面中我们无法获取到任何信息。
看看后台代码如何做验证的:
实际执行的操作时:
select * from users where username='123' and password='123'
当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。
按照第一个实验的思路,我们尝试在用户名中输入 123' or 1=1 #
, 密码同样输入 123' or 1=1 #
:
为什么能够成功登陆呢?因为实际执行的语句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):
select * from users where username='123' or 1=1
由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:
我们尝试在用户名中输入 123' or '1'='1
, 密码同样输入 123' or '1'='1
(不能少了单引号,否则会有语法错误):
实际执行的 Sql 语句是:
select * from users where username='123' or '1'='1' and password='123' or '1'='1`
看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。
还有很多其他 Mysql 语句可以巧妙的绕过验证,同学们可以发散自己的思维进行尝试。