PHP代码审计(三)php中代码执行&&命令执行函数

简介: string system(string command,int &return_var)可以用来执行系统命令并直接将相应的执行结果输出system() 输出并返回最后一行shell结果。

正题开始之前,先做点准备,一般情况下,今天要看这些命令执行函数都是被禁止的。

那么首先我们将这些被禁止的函数去掉,打开php.ini,搜索exec,如下图所示:

image.png

将disable_functions部分的函数注释掉

一:PHP命令执行函数

这里只简单看下上边注释的函数中的一部分。

1、system

string system(string command,int &return_var)

可以用来执行系统命令并直接将相应的执行结果输出

system() 输出并返回最后一行shell结果。

php

复制代码

<?php
       system("ipconfig",$result);
       echo "<br>";
       echo "返回码:".$result;
       echo "<br>";
       echo "------------------------------------------------------------------";
       echo "<br>";
       system("ping guanchao.site");
?>

2、exec

string exec(string command,array &outpub,int &return_var)

command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。

bash

复制代码

// 执行命令,返回值存储至$result,返回状态码存至$code
    exec("ping guanchao.site",$result,$code);
    echo "<br>";
    // 输出返回值
    var_dump($result);
    echo "<br>";
    // 输出返回状态码
    echo "状态码".$code;
    echo "<br>";

注意:exec输出的是命令执行结果的最后一行内容。如果你需要获取未经处理的全部输出数据,请使用passthru()函数。

如果想要获取命令的输出内容,请确保使用output参数。

 3、passthru

void passthru(string command, int &return_var)

command是要执行的命令,return_var存放执行命令后的状态值。

php

复制代码

// 执行命令,直接输出返回值,返回状态码存至$code
    passthru("ping guanchao.site",$code);
    echo "
";
    // 输出返回状态码
    echo "状态码".$code;
    echo "
";


// 执行命令,直接输出返回值,返回状态码存至$code
    passthru("ping guanchao.site",$code);
    echo "<br>";
    // 输出返回状态码
    echo "状态码".$code;
    echo "<br>";

4、 shell_exec

string shell_exec(string command)

command是要执行的命令。shell_exec函数可执行但需要加echo才能显示结果

bash

复制代码

// shell_exec函数可执行但需要加echo才能显示结果
    echo shell_exec("ping guanchao.site");
    echo "<br>";

5、``运行符

PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。执行shell命令并返回输出的字符串。

bash

复制代码

$output = `ping guanchao.site`;
    echo "<pre>$output</pre>";

最开始遇见这个反引号是在数据的sql语句中,没想到这个在PHP中的作用这么强大

 6、ob_start&&ob_end_flush

bool ob_start([callback outputcallback[,intoutput_callback[,int outputcallback[,intchunk_size[,bool $erase]]])

ob_start() - 打开输出控制缓冲

ob_get_length() - 返回输出缓冲区的长度

ob_get_level() - 返回输出缓冲区的嵌套级别

ob_get_status() - 返回输出缓冲区的状态(数组形式返回,默认返回最顶层,参数为true时返回所有)

ob_get_contents() - 返回输出缓冲区的内容

ob_get_clean() - 以字符串格式返回当前输出缓冲区并关闭输出缓冲(图片处理时常用)

ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲

ob_get_flush() - 以字符串返回输出缓冲区内容并关闭缓冲

ob_end_flush() - 冲刷出(送出)输出缓冲区内容缓冲

php

复制代码

// 开启缓冲
    ob_start();
    echo 111;
    // 返回输出缓冲区的内容
    $buf2 = ob_get_contents();
    // 清空(擦除)缓冲区并关闭输出缓冲
    ob_end_clean();
    echo '<br/>';
    echo $buf2;

二:PHP代码执行函数

这部分函数在php.ini中是没有禁止的,这个需要格外的注意。

1:eval

eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

eval()里的引号必须是双引号,因为单引号不能解析字符串里的变量$str;

ini

复制代码

// 代码执行函数
    $str = 'system("ping guanchao.site");';
    eval($str);

2:assert

assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。

kotlin

复制代码

// assert 代码执行函数
    assert(fun());// 会报警告
    eval(fun());// 这个不会报警告
    function fun()
    {
        echo "12345";;
    }

3、preg_replace()

preg_replace 函数执行一个正则表达式的搜索和替换。

mixed preg_replace ( mixed pattern,mixedpattern , mixed pattern,mixedreplacement , mixed subject[,intsubject [, int subject[,intlimit = -1 [, int &$count ]] )

$pattern: 要搜索的模式,可以是字符串或一个字符串数组。

$replacement: 用于替换的字符串或字符串数组。

$subject: 要搜索替换的目标字符串或字符串数组。

$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。

$count: 可选,为替换执行的次数。

 

删除空格

ini

复制代码

$str = 'runo o   b';
    $str = preg_replace('/s+/', '', $str);
    // 将会改变为'runoob'
    echo $str;

4:create_function()

create_function()主要用来创建匿名函数,有时候匿名函数可以发挥它的作用。

这个函数已经被弃用,在php7.2中。但是,在PHP5中依然可以使用。

语法:

string create_function    ( string args  , string args   , string args  ,string code   )

代码注入例子:

bash

复制代码

//访问链接:http://127.0.0.1/index.php?id=2;}phpinfo();/*
    $id=$_GET['id'];
    $str2='echo  '.$a.'test'.$id.";";
    echo $str2;
    echo "<br/>";
    echo "==============================";
    echo "<br/>";
    $f1 = create_function('$a',$str2);
    echo "<br/>";
    echo "==============================";

5:array_map()

array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

ini

复制代码

// 代码注入
    // 访问链接:http://127.0.0.1/index.php?str=phpinfo();
    function cube($n)
    {
        eval($n);
    }
    $a = $_GET['str'];
    echo $a;
    $array[0] = $a;
    $b = array_map("cube", $array);
    // 使用array_map创建二维数组
    $a = array(1, 2, 3, 4, 5);
    $b = array("one", "two", "three", "four", "five");
    $c = array("uno", "dos", "tres", "cuatro", "cinco");
    $d = array_map(null, $a, $b, $c);
    echo "<pre>";
    var_dump($d);

6:call_user_func()

call_user_func — 把第一个参数作为回调函数调用

call_user_func将传入的参数作为assert函数的参数

ini

复制代码

// 访问链接:http://127.0.0.1/index.php?str=phpinfo();
    $str = $_GET["str"];
    call_user_func("assert",$str);

7:call_user_func_array()

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

将传入的参数作为数组的第一个值传递给assert函数

ini

复制代码

// 访问链接:http://127.0.0.1/index.php?str=phpinfo();
    $str = $_GET["str"];
    call_user_func("assert",$str);
    $array[0] = $_GET["str"];
    call_user_func_array("assert",$array);

以上大概就是PHP中常见的代码执行函数及命令执行函数。

有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site

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

目录
相关文章
|
7天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
9天前
|
PHP
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
本文介绍了解决PHP常见问题的步骤,包括定位和创建`php.ini`文件,以及解决`mb_strlen()`函数未定义和DLL模块加载错误的具体方法。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
|
9天前
|
存储 Java 数据库连接
php学习笔记-代码基本语法-day01
本文是关于PHP编程语言的基础语法学习笔记,内容包括PHP的介绍、注释风格、数据类型、命名规范、常量和变量的使用,以及变量和常量相关的常用函数。文中详细解释了PHP的基本语法元素和一些易混淆的概念,如传值赋值与传址赋值、可变变量,以及如何检查变量是否已定义或为空。
php学习笔记-代码基本语法-day01
|
9天前
|
存储 API PHP
php学习笔记-php数组的创建和使用,数组常用函数-day03
关于PHP数组的创建、使用以及常用函数的详细学习笔记。
php学习笔记-php数组的创建和使用,数组常用函数-day03
|
5天前
|
程序员 数据库连接 PHP
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第30天】在编程的世界里,错误和异常是不可避免的。本文将深入探索PHP中异常处理的机制,揭示如何通过有效的异常管理来增强代码的健壮性和可靠性。我们将从基础概念出发,逐步深入到高级应用,最后通过实际代码示例来巩固理论知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
19 6
|
1天前
|
Unix PHP 数据库
PHP日期和时间Date()函数获取当前时间
通过灵活运用 `date()`函数及其丰富的格式选项,PHP开发者可以轻松地在应用程序中处理和展示日期及时间信息。无论是需要精确到秒的完整时间戳,还是仅仅展示日期或时间的某一部分,`date()`函数都能胜任。理解并熟练应用这些格式化技巧,对于提升代码的可读性和维护性至关重要。
7 1
|
9天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
24 8
|
6天前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
8天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
7天前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
下一篇
无影云桌面