代码执行

php中有eval()这个函数, 把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾. 意思就是说把里面的字符串按照php代码来执行。

1
2
3
4
$a = 'aaa';
$b = 'bbb';
eval('$a=$b;');
var_dump($a);

类似的还有assert(),preg_replace(),call_user_func(),call_user_func_array(),array_map(),create_function(),array_filter(),usort(),uasort(),unserialize(),${}等

  1. preg_replace()

preg_replace 函数执行一个正则表达式的搜索和替换

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

$pattern参数中正则表达式存在/e(可执行模式,此为PHP专有参数)时,$replacement的值会被当作php代码来执行,在php7.0之后不在支持/e

在过滤没这么严格的时候如果$replacement可控,则会产生代码执行漏洞。

1
preg_replace("/\[(.*)\]/e","\\1",$_GET['str']);  //php7.0之后不在支持/e
  1. create_function 创建匿名函数,该函数php7.2已被弃用,但是非常有意思, 该函数的代码。

作为一个字符串返回一个独特的功能名称,或错误返回FALSE。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$id=$_GET['id'];

$code = 'echo $name. '.'的编号是'.$id.'; ';

$b = create_function('$name',$code);
//实现
function niming($name){
echo $name."编号".$id;
}
$b('sd');

向id参数传入构造的payload

1
?id=2;}phpinfo();/*

传入后,代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$id=$_GET['id'];

$code = 'echo $name. '.'的编号是'.$id.'; ';

$b = create_function('$name',$code);
//实现
function niming($name){
echo $name.编号2;
     }phpinfo();/*
}

后面的代码就被注释了

在php中函数是可以直接由字符串拼接,也就是动态函数

1
$_GET['a']($_GET['b']);

其他语言这样写肯定报错,但是php没事

代码执行例子

zzzphp V1.6.1 远程代码执行漏洞分析

Thinkphp5.1 ~ 5.2 全版本代码执行

命令执行

命令执行漏洞概念:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

能产生这个漏洞的函数有 system(),exec(),shell_exec(),passthru(),pcntl_exec(),popen(),proc_open(),反引号,

1
system('ls');
1
popen('whoami >>D:/2.txt','r');

例子

白帽子挖洞—命令执行(Commnd Execution)篇

深入浅出LD_PRELOAD & putenv()

利用PHP内核变量绕过disable_functions(附完整代码)