You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNION查询SQL注入遇阻:如何获取Users表管理员密码?

SQL注入UNION查询失败的问题分析与解决

核心问题1:UNION查询的列数与数据类型不匹配

UNION强制要求前后两个查询返回的列数完全一致,且对应列的数据类型兼容。你的原查询是Transactions表左连两个Accounts表,返回的列数远多于Users表的列数,直接用SELECT * FROM Users会导致数据库因列数不匹配报错,注入自然失败。

解决步骤:

  1. 先确定主查询的列数:
    输入注入语句ball%' ORDER BY 1 --,逐步增加数字(如ORDER BY 2、ORDER BY 3...),直到数据库返回报错,此时的数字减一就是主查询的列数。
  2. 构造匹配列数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:22:56