iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
Security

CTF 菜鳥修練日誌系列 第 8 篇

Day 08:【Web】Command Injection:當網頁輸入框變成 Terminal

  • 分享至 

  • xImage
  •  

前言

在前面幾天,我們討論的都是如何對「資料庫」發動攻擊(SQL Injection)。然而,如果網站的功能需要調用作業系統底層的指令(例如輸入 IP 進行 Ping 測試、圖片轉檔、壓縮檔案等),而開發者又沒有對使用者輸入進行嚴格過濾時,就會觸發比 SQLi 更致命的漏洞——Command Injection(作業系統命令注入)!

今天我們就來聊聊,攻擊者如何一步步將網頁上的普通輸入框,變成操控整台伺服器的 Terminal!


本日目標

透過 PicoCTF 實戰概念,掌握以下核心技能:

  1. 理解 Command Injection 的成因與作業系統 Command Chaining(命令連接)原理。
  2. 掌握常見的 Command 分隔符號(如 ;, |, &&, &, \n)。
  3. 透過實戰演練,學習如何利用命令注入在伺服器上翻找檔案並取得 Flag。

預備觀念:為什麼會發生 Command Injection?

許多 Web 應用程式為了方便,會直接調用系統內建的指令。以 PHP 為例,開發者可能會寫出類似這樣的程式碼來提供「Ping 伺服器」的功能:

<?php
  $target_ip = $_POST['ip'];
  // 直接將使用者輸入拼接進 system() 函數
  system("ping -c 1 " . $target_ip);
?>

拼接後的漏洞示範
正常情況: 使用者輸入8.8.8.8,系統執行 ping -c 1 8.8.8.8。

攻擊情況: 使用者輸入 8.8.8.8; ls -la。

因為 ; 在 Linux Shell 中代表「執行完第一條命令後,接著執行第二條命令」,最終伺服器執行的完整指令會變成:

ping -c 1 8.8.8.8; ls -la

伺服器不僅執行了 Ping,還順便印出了當前目錄下的所有檔案與權限!

必學:Linux / Windows 命令連接符(Command Separators)

在構造 Payload 時,我們常利用以下符號來串接自己的指令:

符號 說明 範例
; 無條件依次執行多個指令(Linux) ip; cat /flag.txt
&& 前者執行成功(回傳 0)才執行後者 ip && cat /flag.txt
|| 前者執行失敗才執行後者 invalid_cmd || ls
| 管道符(Pipe),將前者的輸出作為後者的輸入 ls -la | grep flag
& 將前面的指令放在背景執行,並接著執行後者 ip & whoami
%0a / \n 換行符號,在某些過濾黑名單時極有用 ip%0acat /flag.txt

picoCTF SQL Injection (SQLi) 通關紀錄與解題報告

本報告記錄了針對 picoCTF 關卡之完整解題過程、黑名單過濾機制演進,以及最終獲取 Flag 的繞過技術分析。


一、 實驗環境與目標

  • 題目類型:SQL Injection (SQLite)
  • 關卡數量:共 5 關 (Round 1 ~ Round 5)
  • 目標:繞過各關卡的 filter.php 黑名單檢查,成功以管理者 (admin) 身份登入並取得最終 Flag。

二、 逐關解題過程與繞過分析

🔹 Round 1

  • 黑名單條件:
    • or
      https://ithelp.ithome.com.tw/upload/images/20260922/20184211ImXMsoDY62.png
  • 解題思路:
    最基礎的 SQLi 繞過,直接利用單引號閉合 Username,並搭配註解符號 -- 將後續的密碼驗證邏輯註解掉。
  • Payload:
    • Username: admin'--
    • Password: (隨意輸入)

🔹 Round 2 & Round 3

  • 黑名單條件:
    • Round 2: or, and, like, =, --
      https://ithelp.ithome.com.tw/upload/images/20260922/20184211T66sdqjLVA.png
    • Round 3: or, and, =, like, >, <, --
      https://ithelp.ithome.com.tw/upload/images/20260922/20184211RGUkBHactC.png
  • 遇到問題:
    傳統的單行註解符號 -- 被加入黑名單,無法使用 admin'--。
  • 解題思路:
    由於黑名單未過濾區塊註解符號 /*,因此可以使用 /* 替換 -- 來將後續 SQL 查詢(包含密碼比對)註解掉。
  • Payload:
    • Username: admin'/*
    • Password: (隨意輸入)

🔹 Round 4

  • 黑名單條件:

    • or, and, =, like, >, <, --, admin
      https://ithelp.ithome.com.tw/upload/images/20260922/20184211g1BDgKlQ4c.png
  • 遇到問題:
    關鍵字 admin 被精確匹配並封鎖,直接輸入 admin'/* 會觸發防護。

  • 解題思路:
    利用 SQLite 支援的字串連接符 ||,將 admin 拆解為 'ad' 與 'min' 進行動態拼接,躲過黑名單的字串檢查。

  • Payload:

    • Username: ad'||'min'/*
    • Password: (隨意輸入)
  • 後端解析 SQL 語句:

    SELECT * FROM users WHERE username='ad'||'min'/* AND password='...'
    

    SQLite 將 'ad'||'min' 執行為 'admin',成功比對該帳號。

    🔹 Round 5

  • 黑名單條件:

    • or, and, =, like, >, <, --, union, admin
      https://ithelp.ithome.com.tw/upload/images/20260922/20184211tRArNGtBZV.png
  • 繞過分析:

    • 此關卡新增了 union 關鍵字,但由於前一關使用的 || 拼接法與 /* 區塊註解並未被攔截,因此維持相同的 Payload 即可順利通關。
  • Payload:

    • Username: ad'||'min'/*
    • Password: (隨意輸入)

三、 filter.php 源碼解析與最終 Flag

完成 Round 5 後,網頁導向源碼頁面,原始碼細節如下:
https://ithelp.ithome.com.tw/upload/images/20260922/20184211iUtuVBGiGP.png
取得 Flag:picoCTF{y0u_m4d3_1t_79a0ddc6}


上一篇
Day 07:【Web】SQL Injection 實戰 (二):使用 Union Based 撈出隱藏資料
下一篇
Day 09:【Forensics】檔案藏身術:ExifTool 詮釋資料與 Magic Bytes
系列文
CTF 菜鳥修練日誌 共 10 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言