檔案引數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.測驗回應舉例:
POST /reqxml HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Referer: http://XXX/dist/src/market-data-analysis/index.html Cookie: H5Token=M0T5I0wcM1T5I0w5N2j0E5x2McD7Mb10N9T4Eaz8N6z1kbz2M2jbYawdM7jdM9z2 Connection: keep-alive Host: XXX:7781 X-Requested-With: XMLHttpRequest Content-Length: 205 tztWebdataEncrypt: 1 Accept: */* Origin: http://XXX:7781 Accept-Language: en-US Content-Type: application/x-www-form-urlencoded; MobileCode=null&channels=&Reqno=13800138000&ReqlinkType=2&newindex=1&action=51602&begindate=2020-10-05&enddate=2021-01-05&type=2$(../../../../../../../../../../../../bin/sleep 11)&tfrom=h5&cfrom=mobile
- 描述:將引數值設定為:[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回應),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/245549.html
標籤:其他
上一篇:生產性企業,應該如何部署服務器
