概述
一、任意文件读取/删除
1、漏洞描述
很多网站由于业务需求,往往需要提供文件下载、读取、删除等功能块,但是如果对下载的文件没有做限制,直接通过绝对路径、相对路径对其文件进行读取,那么,用户就可以利用这种方式读取服务器的敏感文件、获取网站源代码、进行SSRF漏洞攻击。
2、产生原因
- 存读取文件的函数
- 读取文件的路径用户可控,且未校验或校验不严
- 输出了文件内容
3、文件读取函数
- show_source() 高亮显示文件内容
- highlight_file() 高亮显示文件内容(别名)
- readfile() 读取文件内容并输出
- file_get_contents() 将文件读取为字符串
- file() 将文件安行读取为数组
4、利用方式
- 读取web源码
- 读取数据库文件
- 读取服务器配置文件
- 读取日志文件
- 读取proc文件系统
二、文件包含
1、漏洞描述
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的内容,将之当成PHP脚本来执行。而由于包含的文件名没有经过合理的校验,从而包含了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入,主要包括本地文件包含和远程文件包含两种形式。
2、产生原因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。
3、文件包含函数
- require() 、require_once()、 include() 、include_once()
- include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
- include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
PHP中文件包含函数特点:文件包含不需要考虑文件名是否为PHP
三、文件包含利用
1. 本地文件包含LFI
指能打开并包含文件的漏洞,大部分情况下遇到的文件包含漏洞都是LFI。
2. 本地文件包含利用
1、包含本地文件,读取敏感文件
2、将shell写入日志,包含日志文件getshell
3、将shell写入session文件,包含session文件getshell
4、结合文件上传getshell
5、结合php伪协议getshell
6、远程文件包含getshell
四、PHP伪协议
PHP 带有很多内置 URL 风格的封装协议,可用于类似 file() 、show_source() 、 fopen()、 copy()、 file_exists() filesize() 等等的文件系统函数,以及文件包含函数。在PHP的官方手册中,共有12种伪协议。
PHP默认配置:
allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
allow_url_include=Off(php5.2之后默认为Off) 规定是否允许include/require远程文件
五、文件包含防御
1. 配置文件
- 在配置文件中限制访问的文件目录,比如PHP中php.ini配置open_basedir
- 尽量关闭allow_url_include配置
2. 特殊字符过滤
- 检查用户输入,过滤或转义含有“…/”、“…”、“http”、“%00”,“…”,“.”,“#”等跳转目录或字符终止符、截断字符、url的输入
3. 合法性判断
- 严格过滤用户输入字符的合法性,比如文件类型、文件地址、文件内容等
4. 白名单
白名单限定访问文件的路径、名称及后缀名
最后
以上就是高兴红牛为你收集整理的文件包含漏洞的全部内容,希望文章能够帮你解决文件包含漏洞所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复