2022-11-01 21:15:34407浏览
union 注入可以让我们在适当条件下,往 SQL 语句里夹带私货,把“沾亲带故”的数据从中套出来。
但是 union 注入的语句里面用到的数字都是哪里来的?
一、UNION 关键字的用法及注意点
SQL UNION 操作符合并两个或多个 SELECT 语句的结果。
👆这是官方对于 union 关键字的描述,引用自菜鸟教程,但是在这句话的后面,作者立刻给出了警告:
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
二、 重点在于这个需要注意的点
1. 我们在自己的 phpStudy 自带的 SQL front 里面测试一下这个关键字:
SELECT * FROM users union select 1,2,3,4;
这里我们给 union 后面的 select 提供了四个不明所以的数字,语句可以正常执行:
2. 然而,如果把语句里面的 4 去掉,就会收获一个错误:
这是因为 pikachu.users 这个表里面有四个字段,而 union 的语句却只给了三个,从而导致报错,这就是上面所说的
3. 有人可能会想到,前面用通配符 * ,那么如果在 union select 里面也是用通配符呢?
又是一个无情的报错。
这个报错说明,使用通配符的时候需要指定表名,我们进行练习的时候写表名,但在测试中我们还等着 union 给我们提供数据表信息嘞!
所以这里我们最好是使用相对稳妥的语句,不然多个错误叠加在一起会把问题变得更加复杂。
三、为什么是 1,2,3 ?
1 这里不应该写字段名吗?为什么写的是数字?
这是因为 union select 可以不查询具体的内容,你也可以输入自定义内容,它会把这些内容原样拼接到查询的结果里面去。
如果你试图写确切的字段,也是可以的,但是你必须保证数据表里面有这个字段,不然查询结果又是一个无情的报错:
2. 为什么写的是数字?只能写数字吗?
其实还可以是字符串的,不然我们就没法往里面“夹带私货”了。但是我们通常都使用数字,原因也很简单——数字比字符串短,1 和 '1' 孰长孰短总是很明显的。
3. 需要几个数字?
这里可以尝试不同数目的数字,因为不管 SQL 语句怎么变,查询的字段数目总归不会太离谱,换成不同的数目尝试几次一般就能够出来了。
还有有些时候你可以从网页的显示里面得到一些信息,比如一个表格有十列,那么你就可以从十个数字开始,往上寻找,因为接口可能会有一些不予显示的字段。
极少数情况下,显示的数据是从多个接口请求的数据组合而来的,这时候你可以从十个数字开始往下寻找。
四、用 sqli-labs 第一关试试
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,database()--+
这是结果:
👆成功地把数据库名字带出来了!
问题反馈