UNION查询SQL注入遇阻:如何获取Users表管理员密码?
SQL注入UNION查询失败的问题分析与解决
核心问题1:UNION查询的列数与数据类型不匹配
UNION强制要求前后两个查询返回的列数完全一致,且对应列的数据类型兼容。你的原查询是Transactions表左连两个Accounts表,返回的列数远多于Users表的列数,直接用SELECT * FROM Users会导致数据库因列数不匹配报错,注入自然失败。
解决步骤:
- 先确定主查询的列数:
输入注入语句ball%' ORDER BY 1 --,逐步增加数字(如ORDER BY 2、ORDER BY 3...),直到数据库返回报错,此时的数字减一就是主查询的列数。 - 构造匹配列数的UNION查询:
假设主查询是10列,就需要在SELECT中指定对应数量的字段,用NULL填充不需要的列(NULL可适配大多数数据类型)。例如:ball%' AND 1=2 UNION SELECT id, username, password, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM Users --
核心问题2:逻辑运算符优先级导致主查询结果干扰UNION输出
原拼接后的查询中,AND优先级高于OR,实际逻辑是(T.ownerAccountId=2 AND T.description LIKE '%ball%') OR 1=1,这会让主查询返回所有交易记录,大量结果会把Users表的数据挤到后面,甚至被前端分页隐藏,导致你看不到注入结果。
解决方法:
让主查询返回空结果,只显示UNION的内容。可以用AND 1=2让主查询条件永远不成立:
ball%' AND 1=2 UNION SELECT [匹配列数的字段] FROM Users --
注释写法优化
部分数据库要求--后面必须跟空格才能生效,或者可以用/* ... */注释块来更可靠地屏蔽后面的%':
ball%' AND 1=2 UNION SELECT [匹配列数的字段] FROM Users /*
内容的提问来源于stack exchange,提问作者Michael Bunton
相关产品推荐
相关产品推荐

