我在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”。
我不知道怎么谷歌,所以我来这里。
3条答案
按热度按时间7gcisfzg1#
看上去不对。对于符合SQL标准的数据库,确定是否存在名为
users
的表的正确方法是请注意,表名区分大小写。根据数据库管理系统的不同,您可能还希望查询
users
。如果要确定是否存在一个包含
a
列的表users
,请使用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
。据推测,应用程序服务器会对该错误做一些事情(而不是将其原封不动地传递回罪犯),这比无错误的情况提供的信息要少。3wabscal3#
predicate
(SELECT 'a' FROM users LIMIT 1) = 'a'
在表users
中至少有一行时返回true。本质上,它是在检查用户的存在。