🐘代码&命令执行(PHP)
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!
1.7 🐘代码&命令执行(PHP)
-
引子:上一章对php中主要的文件操作函数做了介绍,并引出了由这些函数可能导致的文件操作漏洞。本章则同上一章,只不过介绍对象由文件操作函数转变为了实现代码&命令的函数。
-
代码执行
代码执行指使用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被废弃 // 复现的过程中有点小问题,先知道有这么个函数吧。。。
-
命令执行
命令执行指使用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)。
至此,本章内容结束!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!