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

解决不同列数及数据类型的SQL UNION注入转换报错问题

绕过UNION SELECT注入的类型匹配报错方案

你的核心问题是UNION要求前后查询的对应列类型必须兼容:原SELECT *从LOGIN表返回的第一列是INT类型,而HASH表的PSWDHASH是VARCHAR类型,直接执行UNION会触发类型转换失败。以下是具体的绕过方案:

1. 补全匹配类型的列,调整对应关系

因为LOGIN表有2列,UNION查询必须返回相同数量的列。你需要给HASH表的查询补一个INT类型的列,用来匹配LOGIN表的ID列,同时让HASH的PSWDHASH对应LOGIN的PASSWORD列:

  • 注入语句示例:' UNION SELECT 0, pswdhash FROM hash --
    这里用0(INT类型)填充第一列,和LOGIN的ID列类型匹配;第二列用HASH表的PSWDHASH,和LOGIN的PASSWORD(VARCHAR)类型兼容,不会触发转换报错。
  • 如果不想显示固定数字,也可以用NULL(NULL可兼容INT和VARCHAR类型):' UNION SELECT NULL, pswdhash FROM hash --

2. 强制类型转换(局限性较大)

如果一定要用HASH表的字段填充第一列,可以尝试将VARCHAR类型的PSWDHASH转换为INT,但仅当PSWDHASH内容为纯数字时有效,否则仍会报错。示例:
' UNION SELECT CAST(pswdhash AS UNSIGNED), NULL FROM hash --
此方法优先级低于补全列的方案。

关于ORDER BY的说明

ORDER BY本身无法解决类型匹配问题,它仅用于结果排序。不过你可以用ORDER BY N来探测原查询的列数(比如' ORDER BY 1--、' ORDER BY 2--,直到报错即可确认总列数),但最终还是要通过调整UNION的列类型来解决报错。


内容的提问来源于stack exchange,提问作者corkeygo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:04:57