SQL 多列相等

SQL multiple column equality

这不是真正的生产代码!这是在 Google CTF 中介绍的,用于查找和了解应用程序漏洞以及如何防范这些漏洞

我试图理解我在 Google CTF 上看到的一种奇怪的 SQL 语法。假设我们像这样设置 table:

create table users (
username varchar(20), 
password varchar(20) );

insert into users (username, password) 
values ('admin', 'supersecretrandompassword');

现在,如果我们 运行 以下查询:

select * 
from users 
where username = 'admin'
and password = username = '';

它将检索 admin 用户的用户名和密码! 但是,它在执行 password = username = 9(或任何其他数字)时不起作用。

所以我的问题是,最后一个子句是如何计算的,为什么它适用于字符串而不适用于数字?

谢谢!

布尔表达式password = username = ''从左到右求值,如:

(password = username) = ''

所以:

  • 如果 password = usernametrue 表达式等同于 1 = ''
  • 如果 password = usernamefalse 表达式等同于 0 = ''

在这两种情况下,''implicitly converted 到比较之前的数字 0

在你的例子中,我怀疑 password = usernamefalse,所以 WHERE 子句等同于:

where username = 'admin' and 0 = 0;

或更简单:

where username = 'admin';