文件包含的小总结

一.初步了解

1.原理

通过PHP的函数的一些函数,比如include()引入文件时,由于传入的文件名没有经过合理的校验,从而有可能引入并操作了预想之外的文件,就有可能导致意外的文件泄露,甚至是代码注入。

2. 满足条件

1. include()等函数通过动态变量的方式引入需要包含的文件
2. 用户能够控制这个动态变量

3. 本地文件包含

能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。
在这里插入图片描述
比如在这段代码中,用户能够控制参数file,当file的值为“…/…/etc/passwd\0”时。在这里include函数救护就会暴露password文件中的内容,造成密码的泄露.

4. 远程文件包含

如果php.ini的配置选项allow_url_include为ON的话,文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行任意命令。

5. 包含小诀窍

  1. 远程文件包含:包含的文件不能是php文件,是因为浏览器请求192.168.0.102/phpinfo.php,得到的是php代码解析后的结果,是从远端的服务器进行解析的。
    例如:远程文件包含参数http://192.168.0.102/phpinfo.php,是在192.168.0.102服务器上解析的html(是不包含php代码的)。而以txt文件作为包含参数的http://192.168.0.102/phpinfo.txt,返回内容是<?php phpinfo();?>,目标服务器上包含的代码也是这个代码,目标服务器包含的是php代码,所以攻击成功。

  2. 文件包含的时候,无视文件格式,只要文件中有php代码,就会被执行。
    举例:假如说文件包含漏洞 包含的是一张图片,只要图片中包含php代码就可以解析成功(图片马 ---- 文件上传漏洞中上传的图片马)

6. 包含危险参数

在PHP中,可以造成文件包含漏洞的函数有很多,以下几个函数是重点关照对象:
Include(),require(),include_once(),require_once()
还有一些其他对文件进行操作的其他函数,比如fileopen,fileread等等,都有可能导致文件包含漏洞的产生

7. 漏洞危害

敏感信息泄露
获取Webshell
任意命令执行

二. PHP伪协议

1. 分类

PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数。
File协议:file:///c:\windows\system32\drivers\etc\hosts
http协议:http://192.168.1.1/1.txt
在这里插入图片描述

2. 包含读文件

原理:
在PHP开发中文件包含漏洞常出现在Include/Require系列语言结构上,由于需要包含的文件是可以被用户设置的,从而导致包含任意文件及代码执行。通常在开发中需要设置白名单、过滤危险字符、设置文件目录、关闭危险配置等操作来避免漏洞的发生。
payload:
http://192.168.1.1/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php

3. 包含写文件

原理:
只有在allow _url_include为on的时候才可以使用,
如果想查看回显结果那必须在C:\php\php-5.2.14-Win32下找到php-apache2handler.ini打开,查找display_funtions=proc-open,oppen,exec,system…….删掉system重启apache。
payload:
http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input
并且提交post数据为:
<?php system('net user');?>
小要点:
表单数据是你要攻击的最终目的,可以使用burp suite抓包在repeater模块添加表单数据,也可以使用火狐插件Max HacKBar里的Post Data添加表单数据。

4. 常见的敏感信息路径

Windows系统:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件

5. 包含日志文件

当某个PHP文件存在本地包含漏洞,而却无法上传正常文件,这就意味这有包含漏洞却不能拿来利用,这时攻击者就有可能会利用apache日志文件来入侵。
​ Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中
例如:http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=…/…/…/…/Apache-20\logs\access.log

6. 截断包含

这种方法只适合于magic_quotes_gpc=off的时候,在PHP的老版本中也是存在着一些其他的截断问题,不过现在已经很难见到了,比如:index.php?file=info.txt//…………超过一定数据的/。

三. 防御措施

1. 设置白名单:

代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
在这里插入图片描述

2. 过滤危险字符:

由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”…/…/”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。
在这里插入图片描述

3. 设置文件目录:

PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件
在这里插入图片描述

4. 关闭危险配置:

PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
在这里插入图片描述

5. 防御总结:

任意文件包含漏洞的主要出现在能够解析处理脚本文件的函数上,没有对输入的变量进行过滤,导致任意文件包含,进而导致恶意代码执行。在开发处理这类功能函数上,一定要遵循编程规范;在代码核心处,对变量进行过滤限制,设置文件路径或者白名单,避免执行任意文件包含。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值