最近学习了PHP命令执行,内容比较多,把本身学到的总结下来,加深理解,水平有限,欢迎大佬斧正。php
Command Injection,即命令注入攻击,是指因为Web应用程序对用户提交的数据过滤不严格,致使黑客能够经过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。PHP命令注入攻击存在的主要缘由是Web应用程序员在应用PHP语言中一些具备命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而形成的。下面结合PHP语言的特性,对PHP命令注入作了一些简单的分析。程序员
与PHP命令注入攻击相关的函数有system函数、exec函数、passthru函数,shell_exec函数,接下来依次分析他们。shell
1、system函数网络
先来看一下php学习手册对这个函数的解释,如图函数
接下来若是咱们构造以下代码,目的是获取本地用户信息并输出学习
<? $dir = $_GET["dir"]; if(isset($dir)) { echo "<pre>"; system("net user".$dir); echo "</pre>"; } ?>
若是攻击者结尾再加上其余其余内容呢,好比想要查看开放了哪些端口,咱们能够构造以下URL测试
?dir=||netstat -ano
结果以下图,咱们获取了本地服务的全部开放端口spa
2、exec函数.net
也是先看一下php学习手册对exec这个函数的介绍3d
接下来仍是构造以下一段代码
<? $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,结果以下图
3、passthru函数
仍是先看一下php学习手册的介绍
能够构造以下代码
<? $cmd = $_GET["cmd"]; echo "<pre>"; passthru($cmd); echo "</pre>"; ?>
和上面一下,攻击者能够直接在参数cmd后面输入命令查看本身想要看到的数据,如查看目录,查看端口等
4、shell_exec函数
下面是php学习手册的介绍
构造以下测试代码
<? $cmd = $_GET["cmd"]; echo "<pre>"; shell_exec($cmd); echo "</pre>"; ?>
除了上面的一些函数,还有eval函数,eval函数的做用是将字符串看成php代码执行,这个函数至关的危险,由于它容许执行任意 PHP 代码,看到eval的第一眼是否是很熟悉?我们使用的php一句话木马就是使用的eval。
接下来构造以下代码
<? $cmd = $_GET["cmd"]; eval($cmd); ?>
接着在参数cmd后面接=phpinfo();,结果以下图
咱们发现咱们提交的字符串“phpinfo();”通过eval函数的处理后,能够按照PHP函数进行执行,并将结果反馈给咱们,那么执行相应的其余PHP函数,如写入文件,查询文件信息等功能的代码字符串时,一样能够执行。
可使用黑名单的形式,打开php.ini文件,找到disable_functions=,而后将上面那些函数添加进来就能够了。