🐘代码&命令执行(PHP)

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!

1.7 🐘代码&命令执行(PHP)

  1. 引子:上一章对php中主要的文件操作函数做了介绍,并引出了由这些函数可能导致的文件操作漏洞。本章则同上一章,只不过介绍对象由文件操作函数转变为了实现代码&命令的函数。

  2. 代码执行
    代码执行指使用php所提供函数来直接或间接的执行php代码。本文所介绍能引起代码执行的函数为eval()、assert()、preg_replace()、create_function()等。
    直接引起代码执行的函数,eval() & assert():

    <?php
    // eval() 将所传入字符串视为php代码执行
    $c1 = $_GET['c1'];
    eval($c1);
    // http://192.168.2.106:81/execution/ExeDemo1.php?c1=phpinfo();
    
    // assert() 官方手册给出的解释是该函数往往被用于功能调试,
    // 但也可实现代码执行
    $c2 = $_GET['c2'];
    assert($c2);
    // http://192.168.2.106:81/execution/ExeDemo1.php?c2=system(%22calc%22);
    

    间接引起代码执行的函数,preg_replace() & create_function:

    <?php
    // preg_replace() 该函数能实现正则表达式的搜索和替换
    // 其较为完整的写法为:preg_replace($pattern, $replacement, $subject)
    // 实现的功能为:搜索$subject中匹配$pattern的部分,并以$replacement替换
    // 当$pattern采用/e修饰符时,preg_replace()会将替换结果再执行一次eval()
    
    // 本文测试版本为php5.6.9nts,php7后修复
    $pattern = "/sjjjer/e";
    $replacement = "system('calc');";
    $subject = "Hello sjjjer!";
    $new = preg_replace($pattern, $replacement, $subject);
    
    <?php
    // create_function() 通过执行代码字符串创建动态函数
    // 该函数于php7.2.0被废弃
        
    // 复现的过程中有点小问题,先知道有这么个函数吧。。。
    
  3. 命令执行
    命令执行指使用php函数直接或间接执行系统命令,这里的系统命令往往指能够在os终端(如win的cmd,linux的bash)执行的命令。常见能引起命令执行的函数有,system()、exec()、passthru()、popen()、proc_open()、shell_exec()等。
    system():

    <?php
    // system() 执行外部程序并显示输出
    system($_GET['x']);
    // http://192.168.2.106:81/execution/ExeDemo4.php?x=whoami
    // ʮ��\sj
    

    exec() & passthru():

    <?php
    // exec() 执行外部程序,并返回最后一行结果
    echo exec($_GET['x']);
    // http://192.168.2.106:81/execution/ExeDemo5.php?x=ipconfig
    //�����ض��� DNS ��׺ . . . . . . . :
    
    // passthru() 同exec(),但返回所有执行结果
    echo passthru($_GET['y']);
    // http://192.168.2.106:81/execution/ExeDemo5.php?y=whoami
    // ʮ��\sj
    

    popen() & proc_open():

    <?php
    // popen() & proc_open() 均为命令执行函数
    // 官方手册给出的区别是:proc_open() 相较于 popen()
    // 提供了更加强大的控制程序执行的能力
    
    // popen()以指定模式打开进程文件,并返回文件指针(文件句柄)
    $handle = popen('whoami', 'r');
    // 此时$handle的值为进程文件whoami的指针
    // 若要执行该进程文件,需使用文件读取函数
    echo fread($handle, 4096);
    pclose($handle);
    
    // proc_open()
    $descriptorspec = array(
        0 => array("pipe", "r"), // 标准输入
        1 => array("pipe", "w"), // 标准输出
    //    2 => array("pipe", "w")  // 标准错误
    );
    // 以des所描述的模式处理 whoami 进程文件,
    // 并分别将结果以指针保存至 $pipes 数组中
    $porcess = proc_open('whoami', $descriptorspec, $pipes);
    echo fread($pipes[1], 4096);
    proc_close($porcess);
    

    shell_exec() & `:

    <?php
    // shell_exec() 执行命令并将输出结果返回
    echo shell_exec($_GET['x']);
    // http://192.168.2.106:81/execution/ExeDemo7.php?x=whoami
    // ʮ��\sj
    
    // 执行运算符(``) 其效果与shell_exec()相同
    $c = $_GET['y'];
    echo `$c`;
    // 同上
    

    同样的,这些代码&命令执行函数所造成的安全问题往往为,由于所传参数的可控导致远程代码执行(RCE)。

至此,本章内容结束!

posted @   1999er  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示