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 = username
是 true
表达式等同于 1 = ''
- 如果
password = username
是 false
表达式等同于 0 = ''
在这两种情况下,''
是 implicitly converted 到比较之前的数字 0
。
在你的例子中,我怀疑 password = username
是 false
,所以 WHERE
子句等同于:
where username = 'admin' and 0 = 0;
或更简单:
where username = 'admin';
这不是真正的生产代码!这是在 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 = username
是true
表达式等同于1 = ''
- 如果
password = username
是false
表达式等同于0 = ''
在这两种情况下,''
是 implicitly converted 到比较之前的数字 0
。
在你的例子中,我怀疑 password = username
是 false
,所以 WHERE
子句等同于:
where username = 'admin' and 0 = 0;
或更简单:
where username = 'admin';