未加星标

PHP代码审计之命令执行

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
php命令注入攻击漏洞是PHP应用程序常见漏洞之一。国内著名的PHP应用程序,如discuz!、dedecms等大型程序在网络中均被公布过存在命令注入攻击漏洞,黑客可以通过命令注入攻击漏洞快速获取网站权限,进而实施挂马、钓鱼等恶意攻击,造成的影响和危害十分巨大。同时,目前PHP语言应用于Web应用程序开发所占比例较大,Web应用程序员应该了解命令注入攻击漏洞的危害.

PHP 执行系统命令可以使用以下几个函数: [PHP] 纯文本查看 复制代码 linux unix Wind os
system、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] 纯文本查看 复制代码 <?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));
?>

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

[PHP] 纯文本查看 复制代码 $arg=$_GET['arg'];

代码中$arg直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,我们可以直接写入注入代码.

我们测试代码注入,如果,不想造成任何破坏并且可以展示这个漏洞我们习惯的利用phpinfo();。我们来构造注入

[PHP] 纯文本查看 复制代码

"]);}phpinfo();/*

成功执行.


PHP代码审计之命令执行

在具体分析细节之前,先说一下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中。

[PHP] 纯文本查看 复制代码 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执行。

下面我们测试别的注入。


PHP代码审计之命令执行
这节课到此结束】

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: PHPLinux程序员FUTI黑客CTI单利
分页:12
转载请注明
本文标题:PHP代码审计之命令执行
本站链接:http://www.codesec.net/view/524402.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(70)