文件包含漏洞

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

前言:

我们上一次已经学过了web漏洞里的文件包含漏洞,不知道大家有没有理解。这次我再给大家简单讲解一下web基础漏洞里的一大漏洞--文件包含漏洞。当然,出题的时候是和其他漏洞相结合一起出的。

定义:

还是一样,我们先看一下文件包含漏洞的定义:文件包含漏洞就是在通过PHP的incluede、require等函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入,主要包括本地文件包含和远程文件包含两种形式。

危害:

攻击者利用此漏洞通过包含含有任意恶意代码的任意格式文件,比如图片文件、log文件等,可直接获取应用系统权限,如果开启了allow_url_fopen/allow_url_include等配置,可直接包含远程任意格式文件。

php文件包含函数:

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

他们的区别就在于:inclede在进行文件包含的时候如果出现错误,会发出警告,但程序会继续正常运行。而require在出现错误的时候直接报错并且直接中断程序。而include——once和require——once都是只包含一次,适用于脚本可能包含两次,而你只想让它包含一次的情况。他们两者之间的区别和Include与require的区别一样。

无限制包含文件漏洞

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

这个时候我们就可以包含文件,并且访问了。

session文件包含漏洞

首先有一个问题:session是什么东西。我们知道http协议是无状态的,客户端访问服务器多少次,他都不会记住你。那么当我们进入一个网站之后,输入了账号密码成功登陆以后。如果要在该网站进行一系列操作,准不能每个操作都要输入账号密码吧。这就是session诞生的原因。session通过session-id将http状态保存在服务器端。看到一个很有意思的比喻:医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。乍一看,这啥玩意,仔细一看,很有道理。大家想一下,一个病人假如有胃病,去看病。需要每隔一段时间就再去医院一趟复查。但医生怎么知道你的身体信息呢。所以就需要一个病历卡来记录病人的信息,这个就类似session——id。而病历档案就是病人的信息。

文件包含

攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。

session位置:

图片.png

session名字

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

然后在cookie中找到sessionid 但我的cookie请求没有cookie目前还未解决。。。

有限制本地文件包含漏洞绕过

%00截断 条件:magic_quotes_gpc = Off php版本<5.3.4 代码

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

路径长度截断 代码: <?php $filename = $_GET['filename']; include($filename . ".html"); ?>

条件:windows OS,点号需要长于256;linux OS 长于4096

点号截断

条件:windows OS,点号需要长于256

代码:

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

##远程文件包含漏洞

PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。 下面说一下allow_url_fopen和allow_url_include。

allow_url_fopen = On

是否允许将URL (如http: //或ftp: l/)作为文件处理。

allow_url_include = Off

是否允许include/require打开URL (如http://或ftp://)作为文件处理。