Web攻防系列教程之浅析PHP命令注入攻击

CracerCracer 2016-3-27 渗透测试 650 0 2

摘要:PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。本文描述了常见的PHP命令注入攻击漏洞存在形式和利用方法,结合漏洞实例进行分析和漏洞利用,并针对如何防范PHP命令注入攻击漏洞给出了可行的方法和建议。
PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。本文描述了常见的PHP命令注入攻击漏洞存在形式和利用方法,结合漏洞实例进行分析和漏洞利用,并针对如何防范PHP命令注入攻击漏洞给出了可行的方法和建议。

Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。命令注入攻击最初被称为Shell命令注入攻击,是由挪威一名程序员在1997年意外发现的,他通过构造命令字符串的方式从一个网站删除网页,就像从硬盘中删除一个文件一样简单。下面我们结合PHP语言的特性,对PHP命令注入攻击进行简要的分析和描述。

PHP命令注入攻击:

PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施进一步的渗透攻击。

在PHP中,可以实现执行外部程序或函数的命令执行函数包括以下5个函数。

1.System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:

string system(string command, int &return_var)

其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。

按照PHP程序员的想法,命令执行函数的主要作用是可以通过命令执行函数与Web应用程序进行交互,通过Web应用程序执行外部程序或系统命令,如Web应用程序员想通过system函数获取指定目录的文件内容,那么他可以通过构造如下代码实现。
Web应用程序员可以通过提交不同的dir内容来获取不同目录下的文件信息,但是黑客可以通过使用下列URL来进行命令注入攻击:

file.php?dir=|cat /etc/passwd

结果system函数执行的命令就变成如下内容:

System(“ls –al|cat /etc/passwd”);

这个命令就会将/etc/passwd文件中的内容反馈给黑客。

同样,构造PHP代码如下:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

system($cmd);

echo "</pre>";

?>


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

string exec (string command, array &output, int &return_var)

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

可以通过构造如下PHP代码进行测试:

<?

$cmd = $_GET["cmd"];

$output = array();

echo "<pre>";

exec($cmd,$output);

echo "</pre>";

while(list($key,$value)=each($output))

{

echo $value."<br>";

}

?>

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

void passthru (string command, int &return_var)

其中,command是要执行的命令,return_var存放执行命令后的状态值。

可以通过构造如下PHP代码进行测试:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

passthru($cmd);

echo "</pre>";

?>


4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:

string shell_exec (string command)

其中,command是要执行的命令。

可以通过构造如下PHP代码进行测试:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

shell_exec($cmd);

echo "</pre>";

?>

5. ``运算符:与shell_exec功能相同,执行shell命令并返回输出的字符串。

可以通过构造如下PHP代码进行测试:

<?

$cmd = $_GET["cmd"];

$output = `$cmd`;

echo "<pre>";

echo $output;

echo "</pre>";

?>

 

转载请注明来自Cracer,本文标题:《Web攻防系列教程之浅析PHP命令注入攻击》

喜欢 (2) 发布评论
发表评论


Top