在前面幾天,我們討論的都是如何對「資料庫」發動攻擊(SQL Injection)。然而,如果網站的功能需要調用作業系統底層的指令(例如輸入 IP 進行 Ping 測試、圖片轉檔、壓縮檔案等),而開發者又沒有對使用者輸入進行嚴格過濾時,就會觸發比 SQLi 更致命的漏洞——Command Injection(作業系統命令注入)!
今天我們就來聊聊,攻擊者如何一步步將網頁上的普通輸入框,變成操控整台伺服器的 Terminal!
透過 PicoCTF 實戰概念,掌握以下核心技能:
;, |, &&, &, \n)。許多 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,還順便印出了當前目錄下的所有檔案與權限!
在構造 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 關卡之完整解題過程、黑名單過濾機制演進,以及最終獲取 Flag 的繞過技術分析。
filter.php 黑名單檢查,成功以管理者 (admin) 身份登入並取得最終 Flag。or
-- 將後續的密碼驗證邏輯註解掉。admin'--
or, and, like, =, --
or, and, =, like, >, <, --
-- 被加入黑名單,無法使用 admin'--。/*,因此可以使用 /* 替換 -- 來將後續 SQL 查詢(包含密碼比對)註解掉。admin'/*
黑名單條件:
or, and, =, like, >, <, --, admin
遇到問題:
關鍵字 admin 被精確匹配並封鎖,直接輸入 admin'/* 會觸發防護。
解題思路:
利用 SQLite 支援的字串連接符 ||,將 admin 拆解為 'ad' 與 'min' 進行動態拼接,躲過黑名單的字串檢查。
Payload:
ad'||'min'/*
後端解析 SQL 語句:
SELECT * FROM users WHERE username='ad'||'min'/* AND password='...'
SQLite 將 'ad'||'min' 執行為 'admin',成功比對該帳號。
黑名單條件:
繞過分析:
Payload:
完成 Round 5 後,網頁導向源碼頁面,原始碼細節如下:
取得 Flag:picoCTF{y0u_m4d3_1t_79a0ddc6}