Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Befehlsinjektion dedecms Remote-Schreiben von Datei-Link-Beispielfreigabe

PHP-Befehlsinjektion dedecms Remote-Schreiben von Datei-Link-Beispielfreigabe

小云云
小云云Original
2018-03-12 11:59:082523Durchsuche

Die Schwachstelle bei PHP-Befehlsinjektionsangriffen ist eine der häufigsten Skriptschwachstellen in PHP-Anwendungen wie Discuz!

Command Injection, also ein Command-Injection-Angriff, bezieht sich auf die Tatsache, dass Webanwendungen die von Benutzern übermittelten Daten nicht streng filtern und Hacker spezielle Befehlszeichenfolgen erstellen können. Übermitteln Sie Daten an eine Webanwendung und verwenden Sie diese Methode, um externe Programme oder Systembefehle auszuführen, um Angriffe durchzuführen, illegal Daten oder Netzwerkressourcen abzurufen usw.
Der Hauptgrund für PHP-Befehlsinjektionsangriffe besteht darin, dass, wenn Webanwendungsprogrammierer einige Funktionen mit Befehlsausführungsfunktionen in der PHP-Sprache verwenden, der vom Benutzer übermittelte Dateninhalt ohne strenge Filterung in die Funktion übertragen wird. Wenn der von einem Hacker übermittelte Dateninhalt beispielsweise darin besteht, eine PHP-Datei in das Website-Verzeichnis zu schreiben, kann der Befehl verwendet werden, um die Angriffslücke in eine PHP-Backdoor-Datei einzuschleusen und dann weitere Penetrationsangriffe durchzuführen.
Die Sicherheitslücke bei einem PHP-Command-Injection-Angriff bringt ernsthaften Schaden und Auswirkungen mit sich. Die folgenden Methoden können verwendet werden, um Schwachstellen bei Command-Injection-Angriffen zu verhindern:
1. Versuchen Sie, keine externen Anwendungen oder Befehle auszuführen.
2. Verwenden Sie benutzerdefinierte Funktionen oder Funktionsbibliotheken, um die Funktionen externer Anwendungen oder Befehle zu implementieren.
3. Bestimmen Sie den Parameterinhalt, bevor Sie Funktionen wie System und Eval ausführen.
4. Verwenden Sie die Escapeshellarg-Funktion, um relevante Parameter zu verarbeiten. Die Escapeshellarg-Funktion maskiert alle Zeichen, die das Ende von Parametern oder Befehlen verursachen. Beispielsweise wird das einfache Anführungszeichen „'“ als „‘“ maskiert, das doppelte Anführungszeichen „“ wird als „““ maskiert und das Semikolon „;“ wird als „;“ maskiert, sodass escapeshellarg den Parameterinhalt auf ein Paar einfache oder doppelte Anführungszeichen beschränkt und die in den Parametern enthaltenen einfachen Anführungszeichen oder doppelten Anführungszeichen maskiert, sodass die aktuelle Ausführung nicht abgeschnitten werden kann Prävention Der Zweck von Command-Injection-Angriffen.
5. Verwenden Sie „safe_mode_exec_dir“, um den Pfad der ausführbaren Datei auszuführen. Setzen Sie „safe_mode“ in der Datei „php.ini“ auf „Ein“, legen Sie dann die ausführbare Datei in ein Verzeichnis ab und verwenden Sie „safe_mode_exec_dir“, um den Pfad der ausführbaren Datei anzugeben. Wenn das entsprechende externe Programm ausgeführt werden muss, muss sich das Programm auf diese Weise in dem durch „safe_mode_exec_dir“ angegebenen Verzeichnis befinden, bevor die Ausführung zulässig ist, andernfalls schlägt die Ausführung fehl.
Die Schwachstelle bei PHP-Befehlsinjektionsangriffen ist eine der häufigsten Schwachstellen in PHP-Anwendungen. Es wurde berichtet, dass berühmte inländische PHP-Anwendungen wie Discuz!, Dedecms und andere große Programme Sicherheitslücken bei Befehlsinjektionsangriffen im Internet aufweisen. Hacker können durch Sicherheitslücken bei Befehlsinjektionsangriffen schnell Website-Berechtigungen erhalten und dann böswillige Angriffe ausführen B. Pferdewerbung und Phishing. Die Auswirkungen und der verursachte Schaden sind enorm. Gleichzeitig wird die PHP-Sprache derzeit in einem großen Teil der Webanwendungsentwicklung verwendet. Programmierer von Webanwendungen sollten die Gefahren von Schwachstellen bei Befehlsinjektionsangriffen verstehen, die Schwachstellen beheben, die von Hackern im Programm ausgenutzt werden können, und die Sicherheit von Programmen schützen Netzwerkbenutzer. Angegriffen durch Schadcodes wie Trojaner und Phishing

Nutzung von Befehlsausführungsfunktionen

In PHP können Sie externe Programme ausführen oder Funktionen Die Befehlsausführungsfunktion umfasst die folgenden 5 Funktionen.

2.1 Die Systemfunktion

kann verwendet werden, um eine externe Anwendung auszuführen und die entsprechenden Ausführungsergebnisse auszugeben. Der Funktionsprototyp lautet wie folgt: String-System (String-Befehl, int &return_var) Unter diesen ist command der auszuführende Befehl, und return_var speichert den Statuswert nach der Ausführung des Befehls. Nach den Vorstellungen von PHP-Programmierern besteht die Hauptfunktion der Befehlsausführungsfunktion darin, über die Befehlsausführungsfunktion mit der Webanwendung zu interagieren und externe Programme oder Systembefehle über die Webanwendung auszuführen B. die IP-Adresse über die Systemfunktion und andere Informationen, dann kann er dies erreichen, indem er den folgenden Code erstellt. Im folgenden Code wird eine Variable namens $action definiert, deren Wert der erhaltene cmd-Wert system($action)); ist, wobei $action der Parameter von system ist, also der auszuführende Befehl. Wenn wir PHP debuggen und var_dump oder print_r zum Drucken von Daten oder Arrays verwenden, werden auf der HTML-Seite keine Zeilenumbrüche angezeigt und es ist schwierig, sie vor der Ausgabe zu finden, um sie automatisch zu formatieren Zeilenumbrüche zur Anzeige.
Geben Sie „http://localhost/test.php?cmd=ipconfig“ in die Adressleiste des Browsers ein. Wenn der Wert von cmd ipconfig zugewiesen wird, gibt die Systemfunktion die IP-Adressinformationen aus =

2.2 Die Exec-Funktion

kann zum Ausführen einer externen Anwendung verwendet werden. Der Funktionsprototyp lautet wie folgt:

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

Wobei „command“ der auszuführende Befehl ist, „output“ die Zeichenfolge für jede Ausgabezeile des ausgeführten Befehls ist und „return_var“ den Statuswert nach der Ausführung des Befehls speichert.

2.3 Durchgangsfunktion

kann verwendet werden, um einen Systembefehl auszuführen und die Originalausgabe anzuzeigen, wenn die Ausgabe des Systems erfolgt Der Befehl ist binär. Wenn die Daten direkt an den Browser zurückgegeben werden müssen, muss die Passthru-Funktion verwendet werden, um die System- und Exec-Funktionen zu ersetzen. Der Prototyp der Passthru-Funktion lautet wie folgt:

void passthru (string command, int &return_var),


wobei command der auszuführende Befehl ist und return_var den Statuswert nach der Ausführung des Befehls speichert. Sie können es testen, indem Sie den folgenden PHP-Code erstellen.

2.4 Shell_exec-Funktion

führt den Shell-Befehl aus und gibt den Funktionsprototyp wie folgt zurück:

string shell_exec (string command),

Befehl
ist der auszuführende Befehl.

2.5 "Backticks

haben die gleiche Funktion wie shell_exec, führen den Shell-Befehl aus und geben die Ausgabezeichenfolge zurück.

2.6 Popen-Funktion

Die Funktion popen() öffnet den Prozessdateizeiger, das heißt, sie öffnet eine Pipe, die auf den Prozess zeigt, der von ausgeführt wird Abgeleiteter Befehl Befehl. Gibt einen Dateizeiger zurück, der jedoch nur zum Lesen oder Schreiben verwendet werden kann und mit pclose() geschlossen werden muss. Wenn ein Fehler auftritt, lautet der Funktionsprototyp wie folgt: popen( string $command, string. $mode), wobei command den auszuführenden Befehl angibt, mode den Verbindungsmodus angibt, r schreibgeschützt ist und w schreibgeschützt ist 2.7 proc_open-Funktion

wird verwendet, um einen Befehl auszuführen und den Dateizeiger für die Eingabe/Ausgabe zu öffnen, aber proc_open() bietet leistungsfähigere Funktionen zur Programmsteuerung Der Funktionsprototyp lautet wie folgt: resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )


2.8pcntl_exec-Funktion

Die pcntl_exec-Funktion führt das angegebene Programm im aktuellen Prozessbereich aus. Sie gibt FALSE zurück, wenn ein Fehler auftritt, und gibt nicht zurück, wenn dort ein Fehler auftritt ist kein Fehler. Der Funktionsprototyp lautet wie folgt: void pcntl_exec ( string $path [, array $ args [, array $envs ]] ), wobei path ein ausführbarer Binärpfad oder ein Skript sein muss, das im ersten einen ausführbaren Pfadheader angibt Zeile der Datei; args ist eine Zeichenfolge, die an das Programm übergeben werden soll. Array; envs ist eine Zeichenfolge, die als Umgebungsvariablen an das Programm übergeben werden soll. Dieses Array hat das Format key => value Der Name der zu übergebenden Umgebungsvariablen und der Wert stellen den Wert der Umgebungsvariablen dar. >

Verteidigungsfunktion

Wenn die vom Benutzer eingegebenen Daten verwendet werden Als Funktionsparameter können Sie die Funktion escapeshellarg() oder escapeshellcmd() verwenden, um die vom Benutzer eingegebenen Daten zu filtern, um zu verhindern, dass das System beliebige Befehle ausführt >

3.1 Die Funktion escapeshellcmd()

entfernt spezielle Symbole in der Zeichenfolge und maskiert alle Zeichen in den Befehls-Shell-Metazeichen, um die Aufgabe zu erledigen. Zu diesen Metazeichen gehören: # & ;``,| * ? ~ 42a8a424210188cf3ae517f89cd4faf9,便可以自动格式化换行显示。
在浏览器地址栏输入”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为需要被转码的参数。

Das obige ist der detaillierte Inhalt vonPHP-Befehlsinjektion dedecms Remote-Schreiben von Datei-Link-Beispielfreigabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn