文件包含漏洞及绕过方法(以php为例)

一,文件包含漏洞的由来
简单的来说,为了减少“重复造轮子”引入了文件包含函数,可以直接使用文件中的文件和代码。当通过动态获文件时,或者需要引用网络上其他文件时,用户通过对变量值的修改访问规定的文件,但是未对变量值进行校验,导致有了可乘之机,一般在php中常见。
include()只能将php语言写的以php方式打开,无论后缀为什么,但其他语言只会将源代码输出来。

<?php
$file = $_GET('file');
include($file);#当使用该函数文件包含时,只有执行到该函数才能将文件包含进去,发生错误警告,继续向下执行。
?>

除此之外还有:
Include_once();区别在于重复调用函数时只调用一次
require();与incluse()区别在于,当发生错误时,函数会输出错误信息,并且终止脚本
require_once();同理,只执行一次
highlight_file(); 函数对文件进行语法高亮显示,同样也可以使文件输出
show_source();是higlight_file()的别名
file_get_contents();把整个文件读入一个字符串中
fopen_file();打开文件

除了可以执行文件,还有读取文件内容,这些对于信息收集有很大帮助。

二,文件包含利用方式

  1. 通过上传恶意代码,利用文件包含漏洞显示出来
  2. 读取服务器中其他内容
  3. 只能上传图片文件时,将代码写入图片中getsell

三,文件包含绕过方式

  1. 简单的文件包含漏洞
    用户只需输入地址,便可以访问到服务器上的数据,要求是明白文件的位置。访问特殊文件:
    windows特殊文件:
    C:\boot.ini
    C:\windows\System32\inetsrv\MetaBas.xml
    C:\windows\repair\sam
    C:\program Files\mysql\my.ini
    C:\program Files\mysql\data\mysql\user.MYD
    c\windows\php.ini
    C\windows\my.ini
    ---------------------------------------------o----------------
    linux特殊文件:
    /root/.ssh/authorized_keys
    /root/.ssh/id_rsa
    /root/.ssh/id_ras.keystore
    /root/.ssh/known_hosts
    /etc/passwd
    /etc/shadow
    /etc/my.cnf
    /etc/my.cnf
    /etc/httpd/conf/httpd.conf
    /root/.bash_history
    /root/.mysql_history
    /proc/self/fd/fd*
    /proc/mounts/porc/config.gz

在一些网站中可以直接引用某些文件,例如,showimage.php网页,它引入图片显示出来,我们可以显示网站中的源代码,如果不显示,或者显示未知图片,我们将另存为,再打开就可以获得页面。
在这里插入图片描述

  1. 文件后加入特殊字符绕过
    利用工具,将访问路径后加入%00,可以绕过后缀检查。
    或者后面加一些特殊字符例如 斜杠 点之类。

  2. 省略后缀
    有些程序会将传入参数指引到其他位置,或者修改后缀名,先访问文件判断,例如不需要写后缀名。

  3. 双写绕过
    当写入文件时,发现删除某些特殊字符,我们可以判断是删除了其中字符,例如”php",“…/”,只需再增加一个使其删除后得到我们需要的,需要注意绝对路径与相对路径。

  4. nginx目录解析漏洞
    当判断到中间件是nginx时,我们可以利用nginx目录解析,当我们只能上传.jpg文件时,我们无法利用,只能原文读取出来,但是发现在shell.jpg后加/xxx.php,他就能以php方式读取文件,这就是目录解析漏洞。

  5. 包含日志文件

当我们访问不存在目录时,例如:http://lfi.cn/LFI-1/<?php phpinfo();?>
它会将错误路径保存在日志中。不同的中间件有不同的路径。
日志文件名字为access_log,access.log,error.log,Logfiles等

  1. 伪协议包含
    当不能直接访问目录下文件时,可以选择利用伪协议来访问文件,伪协议有以下几种:(allow_url_fopen和allow_url_include)都为On
    (1)page=file://[绝对路径]
    当页面有file1,file2……后台会判断是否已file开头,我们可以使用此协议。
    (2)php:// 访问各个输入/输出流(I/O streams)
    php://filter用于读取源码
    php://input用于执行php代码,或者直接将代码写入执行。
    (3)zip://[绝对路径], bzip2://[绝对路径], zlib://[绝对路径]协议,都属于压缩楼,访问压缩文件中的子文件,不需要指定后缀
    phar:// 可以查找指定压缩包内的文件,相对路径与绝对路径都可以写
    (4)data: text/plain,<?php 执行内容 ?>与input类似,当我们想查看源代码时,可以将其先转换为base64文件在传到页面上就不会执行PHP了
    (5)http协议
    也可以传入外部链接,自己服务器的钓鱼网站。

四、总结
程序员为了代码的复用,或者直接引入其他服务器的代码,说实话是非常方便的,但是却经不起推敲,当黑客任意访问文件时,服务器就沦陷了。一般读取根目录下index文件,看看其中有什么有价值的东西,
懂得攻就知道如何防:

  1. 在网站配置中,利用open_basedir配置访问的区域。
  2. 过滤点,斜杠和反斜杠。
  3. 当需要远程包含文件时,可以下载到本地
  4. 不要选择动态包含,将文件位置固定,直接访问。

所以,我们知道这样做,别人也知道,这些漏洞大多数网站是用不了的。

我们学会了屠龙技巧,却发现这个世界上没有龙。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值