PHP代码审计之命令执行【诶嘿嘿】

2017-01-12 10:04:55来源:oschina作者:i春秋学院人点击

PHP命令注入攻击漏洞是PHP应用程序常见漏洞之一。国内著名的PHP应用程序,如discuz!、dedecms等大型程序在网络中均被公布过存在命令注入攻击漏洞,黑客可以通过命令注入攻击漏洞快速获取网站权限,进而实施挂马、钓鱼等恶意攻击,造成的影响和危害十分巨大。同时,目前PHP语言应用于Web应用程序开发所占比例较大,Web应用程序员应该了解命令注入攻击漏洞的危害.PHP 执行系统命令可以使用以下几个函数:


Linux unix Wind ossystem、exec、passthru、·· 反引号、shell_exec、popen、proc_open、pcntl_exec string system ( string $command [, int &$return_var ] )
string exec ( string $command [, array &$output [, int &$return_var ]] ) void passthru (string command, int &return_var)
string shell_exec (string command) `` 反引号resource popen ( string $command , string $mode )resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )void pcntl_exec ( string $path [, array $args [, array $envs ]] )

然而create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。 那我就用这两个参数进行构造PHP文件进行演示。


<?php
$arg=$_GET['arg'];
$sorter='strnatcasecmp';
$databases=array('test','test');
$sort_function = 'return 1 * ' . $sorter . '($a["' . $arg . '"], $b["' . $arg . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>

下面我们一句一句进行分析


$arg=$_GET['arg'];

代码中$arg直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,我们可以直接写入注入代码. 我们测试代码注入,如果,不想造成任何破坏并且可以展示这个漏洞我们习惯的利用phpinfo();。我们来构造注入


"]);}phpinfo();/*

成功执行. 在具体分析细节之前,先说一下create_function()。create_function返回一个字符串的函数名, 这个函数名的格式是:"/000_lambda_" . count(anonymous_functions)++ 我们来看看create_function的实现步骤:1. 获取参数, 函数体;2. 拼凑一个"function __lambda_func (参数) { 函数体;} "的字符串;3. eval;4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错;5. 定义一个函数名:"/000_lambda_" . count(anonymous_functions)++;6. 用新的函数名替换__lambda_func;7. 返回新的函数。实际上,create_functions是一个ZEND_FUNCTION,它被定义在./Zend/zend_builtin_functions.c中。


eval_code = (char *) emalloc(eval_code_length);sprintf(eval_code, "function " LAMBDA_TEMP_FUNCNAME "(%s){%s}", Z_STRVAL_PP(z_function_args), Z_STRVAL_PP(z_function_code));eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC);retval = zend_eval_string(eval_code, NULL, eval_name TSRMLS_CC);

可以看到这里只是简单利用zend_eval_string来生成匿名函数 此处"function " LAMBDA_TEMP_FUNCNAME "(%s){%s}" 我们可以控制函数主体部分闭合前面的“{”,后面跟上我们的phpinfo()函数 将提交的参数 arg="]);}phpinfo();/*放到函数中去. 可以看到提交arg参数中的“}”闭合生成的匿名函数的“{” 所以这里的phpinfo()会被zend_eval_string执行。 下面我们测试别的注入。


更多安全技术、精品好文、白帽黑客大佬尽在:http://bbs.ichunqiu.com/portal.php

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台