解决不同列数及数据类型的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
相关产品推荐
相关产品推荐

