考点精讲
- 根本原因是用户输入未经过滤直接拼入 SQL 语句。Union 注入步骤:先用单引号、and 1=1 / and 1=2 探测是否存在注入;再用 order by 判断列数;接着用 union select 确定回显位;最后通过 information_schema 库依次查库名、表名、列名,读取数据。字符型注入还需先闭合引号。
记忆技巧
order by 判列数、union select 猜回显位
information_schema 是脱库
的「目录」
常见误区
- 以为注入只在数字型参数——字符型需先闭合引号
- 忽略 order by 在判断列数时的作用
- 以为 and 1=1 就是攻击——它其实是探测手段
真题思路
- 【示例】 Union 注入的完整步骤,正确的先后顺序是()
① 用 order by 判断列数
② 探测是否存在注入(单引号、and 1=1 / and 1=2)
③ 通过 union select 确定回显位
④ 通过 information_schema 查库名、表名、列名并读取数据
①②③④ ②①③④ ③②①④ ①③②④
答案:B
解析:先探测注入点,再用 order by 判列数,接着 union select 确定回显位,最后借助 information_schema 查库、表、列并读取数据。正确顺序为 ②①③④。
常见问题
Q:SQL 注入产生的根本原因是什么?
A:根本原因是用户输入未经过滤或转义,直接拼接到 SQL 语句中执行,导致攻击者可控的恶意 SQL 改变了原有查询逻辑。
Q:order by 在注入中有什么用?
A:order by 用于判断查询结果的列数,通过 order by N 逐次试探,当报错时的 N-1 即为列数,为后续 union select 做准备。
Q:information_schema 库能查什么?
A:information_schema 是 MySQL 的系统库,存放库名、表名、列名等元数据,注入时可依次从中查出数据库名、表名、列名,再读取具体数据。
Q:字符型注入和数字型注入有什么区别?
A:数字型参数直接拼入 SQL,无需闭合;字符型参数用引号包裹,注入时需先闭合引号再拼接 payload。区别在于是否需要闭合引号。
教材出处:第4章 Web 漏洞 SQL 注入原理与 Union 注入