mysql 解释一下,`(SELECT“a”FROM users LIIMIT 1)=a`如何确认有一个名为“users”的表?

deyfvvtc  于 2023-05-05  发布在  Mysql
关注(0)|答案(3)|浏览(172)

我在portswigger网站和那里的play labs上学习盲SQLi。不幸的是,我不明白,如果没有任何列,名为“a”,SELECT "a" FROM users LIMIT 1如何返回列“a”(可能是我不明白什么)。为什么会有“LIMIT 1”(我知道它的作用,但在这种情况下不是)?完整代码:TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a(TrackingId=xyz'为true)。在实验的描述中,它没有说使用什么数据库,但它不是Oracle,因为在解决中使用了“SUBSTRING”。
我不知道怎么谷歌,所以我来这里。

7gcisfzg

7gcisfzg1#

看上去不对。对于符合SQL标准的数据库,确定是否存在名为users的表的正确方法是

SELECT count(*) FROM information_schema.tables
WHERE table_name = 'users'

请注意,表名区分大小写。根据数据库管理系统的不同,您可能还希望查询users
如果要确定是否存在一个包含a列的表users,请使用

SELECT count(*) FROM information_schema.columns
WHERE table_name = 'users'
  AND column_name = 'a'
gkl3eglg

gkl3eglg2#

整个查询可能包括另一个表(可能是CTE),它确实有一个列“a”。如果Users也有一个列“a”,则它解析为Users.a,否则解析为othertable.a。这些可能会导致可预见的不同结果,从而泄露信息。
如果没有LIMIT 1,PostgreSQL可能会给予错误ERROR: more than one row returned by a subquery used as an expression。据推测,应用程序服务器会对该错误做一些事情(而不是将其原封不动地传递回罪犯),这比无错误的情况提供的信息要少。

3wabscal

3wabscal3#

predicate (SELECT 'a' FROM users LIMIT 1) = 'a'在表users中至少有一行时返回true。
本质上,它是在检查用户的存在。

相关问题