PHP代码审计学习之命令执行漏洞挖掘及防御

PHP代码审计学习之命令执行漏洞挖掘及防御

【1】可能存在命令执行漏洞的函数:

00x1:常用的命令执行函数:exec、system、shell_exec、passthru

00x2:常用的函数处理函数:call_user_func、call_user_func_array、file_get_contents.....更多函数处理函数传递门:http://www.php.net/manual/zh/book.funchand.php

       函数处理函数的使用:<?php $a = "phpinfo()";call_user_func($_GET['id'],$a); ?>访问:127.0.0.1/1.php?assert即可看到效果


【2】如何预防命令执行漏洞:

00x1:escapeshellcmd()//该函数过滤的是整条的命令

00x2:escapeshellarg()//用来保证传入的命令执行函数里面的参数确实是以字符串参数的形式存在的不能被注入!


实例挖掘一个程序的命令执行漏洞。


我随便搜索了一个命令执行函数(PS:网站程序是老古董了):

PHP代码审计学习之命令执行漏洞挖掘及防御

随笔点开了一个文件,在文件的35行处找到命令执行函数system,两个参数,看看有没有进行过滤。

PHP代码审计学习之命令执行漏洞挖掘及防御

从35行很清楚的看到,其使用了一个tex_filter_get_cmd的函数,那么我们找一下这个函数,看下是如何写的。该文件中没有找到定义该函数的,那么必然是被包含了,被包含了两个文件夹,一个是lib.php一个是config.php那么势必是lib.php了,因为config.php是配置文件。

PHP代码审计学习之命令执行漏洞挖掘及防御

找到lib.php打开lib.php以后找到这个tex_filter_get_cmd函数,函数内部情况如下所示:

PHP代码审计学习之命令执行漏洞挖掘及防御

其实也可以很明显的看到$texexp函数有使用escapeshellarg函数过滤然后赋值给$texexp变量,但是$pathname并没有任何过滤就直接带入44行以及47行执行了。由此导致本次的命令执行漏洞。

PHP代码审计学习之命令执行漏洞挖掘及防御

在42行他判断了系统是否为windows如果是windows就执行43到44行的代码。

44行的$executable变量是由40行的赋值而来的,那么我们再来看看tex_filter_get_executale函数。该函数在这个文件当中。其结构如下所示:

 PHP代码审计学习之命令执行漏洞挖掘及防御

总体的来说就是调用了16行的exe

那么构造好的EXP就应该是:texed.php?formdata=foo&pathname=foo"+||+ver||+echo+

PHP代码审计学习之命令执行漏洞挖掘及防御

防御:

    使用escapeshellcmd($pathname);过滤掉$filename

  PHP代码审计学习之命令执行漏洞挖掘及防御