iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
Security

仿生人是否會夢見網頁山羊? 資安小白的30天Webgoat闖關紀錄系列 第 7

[DAY7]仿生人是否會夢見網頁山羊?--SQL UNION SELECT以及 JOIN

  • 分享至 

  • xImage
  •  

今天,我們就要來正式進入SQL Injection(advanced)了!,老實說感覺從這裡開始,難度就飆升了,要比喻的話就是感覺以前至少還算是一個坡,但現在變成了一面峭壁之類的

總而言之,讓我們進入今天的內容 UNION SELECTJOIN吧!

為甚麼會有UNION SELECT和SELECT

有時候,我們在查詢資料庫的時候,會發現想要資料並不在同一張資料表格裡,當我們需要查詢不同表格中相互關聯的資料,或是必須把相同結構的表格合併時,我們總不可能都一筆一筆地用SELECT查詢再用人力比對吧? 所以我們需要有方法來幫我們省心省力的處理這些表格,UNION SELECT和JOIN就這樣誕生了

UNION SELECT

通常用於將同樣結構的表格合併,有UNION和UNION ALL這種細項,前者會幫忙去除掉完全相同的項目,後者則是全部輸出,作用方式很像把兩張同樣大小的表格上下黏起來

例子

假設我們有兩個資料表格,一個叫SHOP1另一個叫SHOP2
SHOP1: name salary
小明 50000
小美 40000
SHOP2: name salary
小明 50000
小黃 46000

在用UNION SELECT或UNION ALL SELECT整合後

SELECT name, salary FROM SHOP1
UNION (ALL) SELECT name, salary FROM SHOP2;

會變成: name salary
小明 50000
小美 40000
小黃 46000

如果用UNION ALL SELECT的話,小明會被重複輸出,總計四筆資料

需要注意的是,雖然UNION SELECT很方便,但還是需要注意兩點

1. 必須確保橫列數一樣
2. 必須確保資料類型一樣

JOINS

通常用來連接兩張資料之間有相互關連的表格,連接後資料的列數通常會變多,要比喻運作方式的話,類似用圖釘把兩個表格中重疊的部分釘起來,例如相同的userid,這樣我們就能看到和他相關的所有資訊了,細項比較多,有INNER JOIN, RIGHT JOIN, LEFT JOIN和FULL JOIN

例子

假設我們有兩個表格,一個departments,另一個是employees
departments: department_id department_name||employees: employee_name department_id
1 研發 小明 1
2 行銷 小美 2
8 行政 大黃 9

SELECT employees.employee_name, departments.department_name 
FROM employees
(INNER/RIGHT/LEFT/FULL) JOIN departments ON departments.department_id = employees.department_id;

在透過INNER JOIN, RIGHT JOIN, LEFT JOIN, FULL JOIN後,分別會產生以下結果

INNER JOIN

會比對確認全部都有比對到的才會輸出
employee_name department_name
小明 研發
小美 行銷

RIGHT JOIN

以後面輸入的表為主,前面的表沒的就補NULL
employees_name department_name
小明 研發
小美 行銷
NULL 行政

LEFT JOIN

和RIGHT JOIN相反,以前面輸入的表為主,後面的表沒的就補NULL
employees_name department_name
小明 研發
小美 行銷
大黃 NULL

FULL JOIN

全部都列出來
employees_name department_name
小明 研發
小美 行銷
大黃 NULL
NULL 行政

接下來,讓我們進入實戰

Webgoat SQL Injection (advanced) 號碼3(第一題)

https://ithelp.ithome.com.tw/upload/images/20260920/20184109B4sbqoT2sM.png

這題可以看到,已經提示我們要用UNION或者用另一條指令達成
但是,我們會碰到一個難關

https://ithelp.ithome.com.tw/upload/images/20260920/20184109gVk7PozPTT.png

剛剛說過了,要用UNION SELECT其中一個條件就是橫列的數量要一樣
所以,我們需要自己幫user_system_data把橫列補齊,以便UNION SELECT結合

' UNION SELECT userid, user_name, password, cookie, 'a', 'b', 1 from user_system_data;--

至於為甚麼是'a', 'b', 1呢,我們可以看user_data對於user_system_data來說多出來的三項

https://ithelp.ithome.com.tw/upload/images/20260920/20184109Y5RHA9x2Rd.png

可以看到剛好是字串,字串,數字的排列方式,而又因為我們使用UNION SELECT時的第二個條件是
必須確保資料類型一樣
因此我們才必須這麼填

https://ithelp.ithome.com.tw/upload/images/20260920/20184109ctF4qM0hzO.png

題外話,關於另外一個解,我原先以為要使用JOIN,但試過好幾次都沒辦法成功執行
在今天翻之前我寫的文章時才想到有另外一種應該可行的方法

'; SELECT * FROM user_system_data WHERE userid = '1' OR '1' = '1

https://ithelp.ithome.com.tw/upload/images/20260920/20184109dbOBqmqOZK.png

沒錯, 這題也能用Query chainning來解!!!
不得不說這題真的滿棒的,能夠學新東西,也能拿來當複習題

明日內容: SQL Blind injection


上一篇
[DAY6]仿生人是否會夢見網頁山羊?--SQL injection基本原理
下一篇
[DAY8]仿生人是否會夢見網頁山羊?--SQL Blind injection
系列文
仿生人是否會夢見網頁山羊? 資安小白的30天Webgoat闖關紀錄9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言