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

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

目录
相关文章
|
1月前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
2月前
|
安全 程序员 PHP
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第8天】在编程的世界中,错误和异常是不可避免的。它们就像路上的坑洼,可能会让我们的程序“跌倒”。但是,如果我们能够正确地处理这些异常,就可以让我们的程序更加稳健,就像我们学会了如何在坑洼的路上稳稳地行走一样。本文将介绍PHP中的异常处理机制,以及如何使用它来提升我们的代码质量。
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
26天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
24 1
|
1月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
39 6
|
29天前
|
PHP 开发者 UED
探索PHP中的异常处理:提升代码的健壮性
在PHP开发中,优雅地处理错误和异常是确保应用稳定性和用户体验的关键。本文将通过深入浅出的方式,介绍如何在PHP中实现有效的异常处理机制,包括异常的基本概念、如何抛出和捕获异常,以及最佳实践。准备好让你的代码变得更加健壮和可靠吧!
20 2
|
1月前
|
关系型数据库 MySQL 数据库连接
PHP内置函数
PHP内置函数
28 5
|
1月前
|
PHP 开发者
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第40天】在PHP编程中,异常处理是确保应用稳定性的关键。本文将引导你理解异常处理的重要性,掌握如何在PHP中捕获和处理异常,以及如何通过自定义异常类来增强代码的错误管理能力。我们将一起探索如何利用PHP的异常处理机制,打造一个更加健壮和可靠的应用程序。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。