PHP代码审计之命令执行
来源:互联网 发布:网络防火墙是什么 编辑:程序博客网 时间:2024/06/13 13:08
PHP命令注入攻击漏洞是PHP应用程序常见漏洞之一。国内著名的PHP应用程序,如discuz!、dedecms等大型程序在网络中均被公布过存在命令注入攻击漏洞,黑客可以通过命令注入攻击漏洞快速获取网站权限,进而实施挂马、钓鱼等恶意攻击,造成的影响和危害十分巨大。同时,目前PHP语言应用于Web应用程序开发所占比例较大,Web应用程序员应该了解命令注入攻击漏洞的危害.
PHP 执行系统命令可以使用以下几个函数:
然而create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。 那我就用这两个参数进行构造PHP文件进行演示。
下面我们一句一句进行分析
代码中$arg直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,我们可以直接写入注入代码.
我们测试代码注入,如果,不想造成任何破坏并且可以展示这个漏洞我们习惯的利用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中。
可以看到这里只是简单利用zend_eval_string来生成匿名函数
此处"function " LAMBDA_TEMP_FUNCNAME "(%s){%s}"
我们可以控制函数主体部分闭合前面的“{”,后面跟上我们的phpinfo()函数
将提交的参数 arg="]);}phpinfo();/*放到函数中去.
可以看到提交arg参数中的“}”闭合生成的匿名函数的“{”
所以这里的phpinfo()会被zend_eval_string执行。
下面我们测试别的注入。
PHP 执行系统命令可以使用以下几个函数:
[PHP]纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
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]纯文本查看 复制代码
1
2
3
4
5
6
7
<?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]纯文本查看 复制代码
1
$arg
=
$_GET
[
'arg'
];
代码中$arg直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,我们可以直接写入注入代码.
我们测试代码注入,如果,不想造成任何破坏并且可以展示这个漏洞我们习惯的利用phpinfo();。我们来构造注入
[PHP]纯文本查看 复制代码
1
"]);}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中。
[PHP]纯文本查看 复制代码
1
2
3
4
5
6
7
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执行。
下面我们测试别的注入。
0 0
- PHP代码审计之命令执行
- php审计基础二:命令执行
- PHP代码审计之路——5.代码执行及一句话木马总结
- PHP代码审计之基础篇
- php代码审计之sql简单过滤
- PHP代码审计实战之XDcms
- PHP代码审计实战之MetInfo CMS
- PHP代码审计
- php代码审计工具
- 【转】PHP代码审计
- php代码审计
- php代码审计
- PHP代码审计
- PHP代码审计实战之盾灵CMS
- PHP代码审计学习总结
- php漏洞与代码审计
- php漏洞与代码审计
- php漏洞与代码审计
- maven搭建项目新建Source Folder的时候,提示信息The folder is already a source folder.
- Leetcode Move Zeroes
- Tomcat下部署多个项目
- Servlet
- HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交?
- PHP代码审计之命令执行
- JVM 新生代老年代
- 数据结构实验之链表四:有序链表的归并
- AJAX 同步请求的JS
- 【SSH网上商城项目实战21】从Demo中看易宝支付的流程
- 洛谷 P1303 A*B Problem
- 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
- angular js 路由导航补遗
- 发现一个好玩的R包