天天看點

AppScan-檔案參數Shell指令注入

檔案參數Shell指令注入

1.問題資訊

可能會在web伺服器上運作遠端指令,未對使用者輸入正确執行危險字元清理,存在作業系統指令注入的至少以下兩種子類型:

應用程式計劃使用外部提供的輸入作為參數,執行受其控制的單個固定程式。例如,使用nslookup指令探測DNS域傳送漏洞,appscan工具官方描述:程式可能使用 system("nslookup [HOSTNAME]") 來運作 nslookup,并允許使用者提供 HOSTNAME 以用作參數。攻擊者無法阻止 nslookup 執行。但是,如果程式不從 HOSTNAME 參數中除去指令分隔符,攻擊者就可以将分隔符放置到參數中,進而能夠在 nslookup 完成執行後執行其自己的程式。

應用程式接受輸入,将完整指令重定向至作業系統。appscan工具官方描述:例如,程式可能使用“exec([COMMAND])”來執行使用者提供的 [COMMAND]。如果 COMMAND 受到攻擊者的控制,那麼攻擊者可以執行任意指令或程式。值得注意的是,如果指令是使用 exec() 和 CreateProcess() 之類的函數執行的,攻擊者可能無法将多個指令組合到同一行中。這些變體代表兩種不同類型的程式設計錯誤。在第一個變體中,程式員清楚地表明來自不可信方的輸入将作為要執行的指令中的部分參數。在第二個變體中,程式員不希望指令可供任何不可信方通路,但未考慮到惡意攻擊者可提供輸入的所有方式。示例

open(FILE,"/bin/ls") - 打開檔案 /bin/ls

open(FILE,"/bin/ls|") - 運作檔案 /bin/ls

2.測試響應舉例:

描述:将參數值設定為:[originalValue]$(../ (12 times) /bin/sleep [timeout])

差異:以下更改已應用到原始請求,已将參數“type”的值設定為“2$(../../../../../../../../../../../../bin/sleep 11)”

推理:AppScan 接收到“逾時”響應,訓示注入的“Sleep”指令已成功

3.解決方法

建立并使用庫調用,庫調用是建立在系統調用上,通常用于為應用程式提供更加友善的功能,這些過程調用可以分為4類:程序管理、檔案管理、目錄與檔案系統管理和雜項。

沙盒安全機制,為運作中的程式提供的隔離環境。可以有效限制軟體可通路特定目錄中的哪些檔案或執行哪些指令,例如,網絡通路、對輸入裝置的讀取、控制程式可使用資源(檔案描述符、記憶體、磁盤空間)。具體表現:(參考百科)

軟體監獄:限制網絡通路、受限的檔案系統名字空間。最常用于虛拟主機上。

基于規則的執行:通過按照一系列預設規則給使用者及程式配置設定一定通路權限,完全控制程式的啟動、代碼注入及網絡通路。也可控制程式對于檔案、系統資料庫的通路。

虛拟機:運作于真實硬體,模拟完整的宿主系統。

主機本地沙盒:建立一個模拟真實桌面的環境,研究人員就能觀察惡意軟體是如何感染一台主機。

線上判題系統:程式設計競賽中用來測試參賽程式的線上系統。

安全計算模式:Linux核心内置的一個沙盒。啟用後,seccomp僅允許write()、read()、exit()和sigreturn()這幾個系統調用。

庫或架構:例如,java防止js注入使用ESAPI進行編碼。

輸入驗證:使用嚴格黑白名單根據請求中參數的預期值來限制字元集。适當的輸出編碼、轉義和引用是防止作業系統指令注入的最有效解決方案,例如,調用郵件程式時,可能需要允許主題字段包含在其他情況下很危險的輸入(如“;”和“>”字元),這些輸入需要轉義或以其他方式進行處理。

Asp.Net:提供多種方法在打開檔案前對檔案名進行驗證。

J2EE:檔案路徑驗證、輸入資料驗證(必須字段、字段資料類型(預設情況下,所有 HTTP 請求參數都是“字元串”)、字段長度、字段範圍、字段選項、字段模式、cookie值、HTTP響應)。

用于伺服器端驗證的Java架構:Jakarta Commons Validator、JavaServer Faces。

PHP:檔案路徑驗證,輸入資料驗證(必須字段、字段資料類型(預設情況下,所有 HTTP 請求參數都是“字元串”)、字段長度、字段範圍、字段選項、字段模式、cookie值、HTTP響應)。   

繼續閱讀