PHP命令执行学习总结

时间:2022-07-25
本文章向大家介绍PHP命令执行学习总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

最近学习了PHP命令执行,内容比较多,把自己学到的总结下来,加深理解,水平有限,欢迎大佬斧正。

什么是PHP命令注入攻击?

Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。下面结合PHP语言的特性,对PHP命令注入做了一些简单的分析。

与PHP命令注入攻击相关的函数有system函数、exec函数、passthru函数,shell_exec函数,接下来依次分析他们。

命令执行函数利用

一、system函数

先来看一下php学习手册对这个函数的解释,如图

接下来如果我们构造如下代码,目的是获取本地用户信息并输出

<?
$dir = $_GET["dir"];
if(isset($dir))
{ 
echo "<pre>";
system("net user".$dir);
echo "</pre>";
}
?>

如果攻击者结尾再加上其他其他内容呢,比如想要查看开放了哪些端口,我们可以构造如下URL

?dir=||netstat -ano

结果如下图,我们获取了本地服务的所有开放端口

二、exec函数

也是先看一下php学习手册对exec这个函数的介绍

接下来还是构造如下一段代码

<?
$cmd = $_GET["cmd"];
$output = array();
echo "<pre>";
exec($cmd,$output);
echo "</pre>";
foreach($output as $key=>$value)
{
echo $value."<br>";
}
?>

如果攻击者想要查看目录只需要在参数cmd 后面接上=dir就可以,如下图

想要查看开放的端口,只需要在参数cmd后接=netstat -ano,结果如下图

三、passthru函数

还是先看一下php学习手册的介绍

可以构造如下代码

<?
$cmd = $_GET["cmd"];
echo "<pre>";
passthru($cmd);
echo "</pre>";
?>

和上面一下,攻击者可以直接在参数cmd后面输入命令查看自己想要看到的数据,如查看目录,查看端口等

四、shell_exec函数

下面是php学习手册的介绍

构造如下测试代码

<?
$cmd = $_GET["cmd"];
echo "<pre>";
shell_exec($cmd);
echo "</pre>";
?>

eval注入攻击利用

除了上面的一些函数,还有eval函数,eval函数的作用是将字符串当作php代码执行,这个函数相当的危险,因为它允许执行任意 PHP 代码,看到eval的第一眼是不是很熟悉?咱们使用的php一句话木马就是使用的eval。

接下来构造如下代码

<?
$cmd = $_GET["cmd"];
eval($cmd);
?>

接着在参数cmd后面接=phpinfo();,结果如下图

我们发现我们提交的字符串“phpinfo();”经过eval函数的处理后,可以按照PHP函数进行执行,并将结果反馈给我们,那么执行相应的其他PHP函数,如写入文件,查询文件信息等功能的代码字符串时,同样可以执行。

防御建议

可以使用黑名单的形式,打开php.ini文件,找到disable_functions=,然后将上面那些函数添加进来就可以了。