文件包含漏洞及绕过方法(以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
    评论
文件上传漏洞是一种常见的Web安全漏洞,攻击者通过绕过文件头检测机制,上传恶意文件到服务器上,从而执行任意代码或者获取敏感信息。文件头绕过是指攻击者通过修改文件的内容或者文件名来欺骗服务器的文件类型检测机制,使得服务器无法正确判断文件的真实类型。 为了绕过文件头检测机制,攻击者可以采取以下几种方法: 1. 修改文件内容:攻击者可以在文件的开头添加一些特殊字符或者修改文件的二进制内容,使得文件头部的标识符不再符合服务器的文件类型检测规则。 2. 修改文件扩展名:攻击者可以将恶意文件的扩展名修改为服务器允许上传的合法文件类型的扩展名,从而欺骗服务器认为该文件是合法的。 3. 使用双重扩展名:攻击者可以将恶意文件的扩展名修改为两个或多个扩展名的组合,例如将`.php`文件修改为`.jpg.php`,这样服务器可能只会检测到第一个扩展名,从而误判文件类型。 4. 使用特殊编码:攻击者可以使用特殊编码对文件进行编码,使得文件头部的标识符被隐藏或者混淆,从而绕过文件类型检测。 为了防止文件上传漏洞的文件头绕过,开发者可以采取以下几种措施: 1. 文件类型检测:在服务器端对上传的文件进行类型检测,可以通过检查文件的魔术数字、文件扩展名、MIME类型等方式来判断文件的真实类型。 2. 文件名过滤:对上传的文件名进行过滤,只允许合法的文件名字符,避免使用特殊字符或者路径分隔符。 3. 文件内容检测:对上传的文件内容进行检测,可以通过解析文件内容或者使用杀毒软件等方式来检测文件是否包含恶意代码。 4. 文件权限设置:限制上传文件的存储路径的访问权限,避免攻击者通过上传恶意文件获取服务器的敏感信息或者执行任意代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值