代码审计之-回调函数

首先来说一下, 什么叫回调函数, 关于回调函数, php里也提供了几个系统默认的回调函数, 这个回头再说, 先来说一下自定义的,回调函数就是把函数以参数的形式引入到调用函数中, 可以来看一个回调函数的例子。

计算加减法

function Calc($func)
{
  echo $func();
}
function sum($num1,$num2)
{
  return $_GET['num1'] + $_GET['num2'];
}
Calc('sum');

以上代码就是一个回调函数例子, 该例子的意思是, 使用定义的函数Calc去获取sum函数下的方法, 然后去以函数的形式去执行结果, sum函数下的方法定义的是获取以Get形式传入的num1和num2相加结果, 经过Calc函数的输出, 得出结果。

当Calc接收到字符串sum后, 因为Calc本身定义了一个变量形参, 于是这个时候 就变成了 $func = ‘sum’; 因为Calc函数体内输出的结果是变量函数 $func(), 于是就变成了 $func() = ‘sum’ , func会以函数的形式执行sum的结果。

一个回调函数漏洞演示例子

function ds($fu)
{
  echo $fu();
}
function mm($s)
{
  eval($_GET['s']);
}

ds('mm');

该例是, 通过定义的函数ds去获取一个字符串参数, 这个字符串参数是基是一个函数, 因为ds函数里本身提供了一个变量形参$fu, 于是, 当使用ds函数去获取mm时, 就变成了 $fu = ‘mm’,又因为最后ds获取的结果是以函数形式的结果, 于是, 这个时候表达式就变成了 $fu() = ‘mm’ $fu首先去寻找同名的函数执行, 没找到, 继续去寻找名字命名空间下的名称, 找到了mm,存在mm这个函数, 于是便以函数的方式执行了mm, 因为mm定义的是一个字符串参数, 而这个字符串参数是通过用户可控get获取的, 于是, 就造成了, 程序获取用户输入后以函数方式去执行的结果,最终造成漏洞。

php里也提供了几个回调函数, 说一下这个

call_user_func_array, 该函数的含义是, 用一个数组作为参数调用一个回调函数,最后执行结果,来看一个call_user_func_array漏洞的例子

function gf($s,$c)
{
  echo $s;
  echo "</br>";
  echo $c;
}
call_user_func_array('gf',array($_GET['s'],'3'));

该例是, 定义一个函数, 给两个形式参数 ,函数体内输出这两个参数的结果, 然后使用系统的call_user_func_array方法, 使用数组作为参数调用一个函数, 该方法被执行后, 会调用gf函数的功能以字符串的形式输出array的结果, 因为array里的第一个参数是用户可控的, 故这个时候有可能会发生各种问题。

类似的函数还有call_user_func。

此条目发表在php security分类目录,贴了, , , 标签。将固定链接加入收藏夹。