文件包含漏洞利用

文件包含

文件包含漏洞给是“代码注入”的一种,“代码注入”这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务器执行

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节 省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接

常见文件包含函数

文件包含可能会出现在JSPPHPASP等语言中,常见的导致文件包含的函数:

PHP中常见的文件包含函数:

  • require()
  • require_once()
  • include()
  • include_once()

JSP/Servlet常见的文件包含函数:

  • ava.io.File()
  • java.io.FileReader()

ASP常见的文件包含函数:

  • include file
  • include virtual

includerequire区别主要是,require_once()在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行

include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题

漏洞产生原因

当使用include_once()includerequire_once()require_once()这些函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核不会在意该被包含的文件的什么类型,不管包含的.txt文件,图片文件,远程URL,也都会作为PHP代码执行

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,


    include($_GET['xvbinyv']);
?>

当这个txt文件包含了可执行的PHP代码时:
文件包含漏洞利用_第1张图片再执行漏洞URL,发现代码被执行了
文件包含漏洞利用_第2张图片要想成功利用文件包含漏洞,需要满足下面两个条件

  • include()等函数通过动态变量的方式引入需要包含的文件:
  • 用户能够控制该动态变量

$_GET['xvbinyv']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['xvbinyv']的值,执行非预期的操作

常见的敏感信息路径:

Windows系统

  • c:\boot.ini // 查看系统版本
  • c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
  • c:\windows\repair\sam // 存储Windows系统初次安装的密码
  • c:\ProgramFiles\mysql\my.ini // MySQL配置
  • c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
  • c:\windows\php.ini // php 配置信息

Linux/Unix系统

  • /etc/passwd // 账户信息
  • /etc/shadow // 账户密码文件
  • /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
  • /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
  • /usr/local/app/php5/lib/php.ini // PHP相关配置
  • /etc/httpd/conf/httpd.conf // Apache配置文件
  • /etc/my.conf // mysql 配置文件

本地文件包含漏洞

能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞

无限制本地文件包含漏洞

开发者在开发中没有为包含文件设置特定前后缀(.php.html等扩展名),从而导致攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码

小试牛刀

我们通过一段PHP代码带大家更深入了解一下无限制本地文件包含


    $xvbinyv = $_GET['xvbinyv'];
    include($xvbinyv);
?>

在本地搭建好环境,我们可以构建payload测试一下(这个博主在kali下搭建的)
文件包含漏洞利用_第3张图片可以看到我们构建的payload成功显示出来了/etc/passwd目录信息,于是我们可以判断这个存在文件包含漏洞,我们尝试利用无限制本地文件包含来进行测试
文件包含漏洞利用_第4张图片

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

代码中为包含文件设置了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含路径长度截断文件包含点号截断文件包含这三种

%00截断

%00截断在上一章中文件上传已经详细讲解了,这里博主就简单说一下

系统在对文件名进行读取时,如果遇到%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤

在PHP5.3之后的版本中完全修复了00截断

小试牛刀

在原来的基础上我们引入html,进行测试


    $xvbinyv  = $_GET['xvbinyv'];
    include($xvbinyv.".html");
?>

文件包含漏洞利用_第5张图片

通过web进行访问该php文件,在URL结尾的位置输入%00
文件包含漏洞利用_第6张图片

路径长度截断

利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的

  • Windows下目录最大长度为256字节,超出最大长度之后的部分将全部丢弃
  • Linux下目录最大长度为4096字节,超出的部分会被丢弃。

如何构造出这么长的目录?通过“../”的方式即可,比如:

../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../xvbinyv

或者

/xvbinyv

或者

../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/
小试牛刀

利用上面的代码,进行测试



    $xvbinyv  = $_GET['xvbinyv'];
    include($xvbinyv.".html");
?>

文件包含漏洞利用_第7张图片通过web访问该文件,在URL后面构建较长的字符
文件包含漏洞利用_第8张图片

远程文件包含漏洞

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

  • allow_url_fopen = On(打开远程文件)
  • allow_url_include = On(include/require函数可以加载远程文件)

无限制远程文件包含漏洞

无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码

小试牛刀

将allow_url_fopen与allow_url_include打开,配置好环境开始进行测试


    $xvbinyv  = $_GET['xvbinyv'];
    include($xvbinyv);
?>

通过远程文件包含漏洞,包含http://192.168.78.19/baohan/one.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析
文件包含漏洞利用_第9张图片

有限制远程文件包含漏洞绕过

有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码

小试牛刀
 
	include($_GET['xvbinyv'].".html"); 
?>

代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀
文件包含漏洞利用_第10张图片

问号绕过

http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt?
文件包含漏洞利用_第11张图片

#号绕过

http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt%23# 要进行ASCII编码)
文件包含漏洞利用_第12张图片

空格绕过

http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt%20(空格要进行ASCII编码)
文件包含漏洞利用_第13张图片

本地上传技巧

远程文件包含漏洞之所以能够执行命令,就是因为攻击者能够自定义被包含的文件内容,因此本地文件包含漏洞想要执行命令,也需要找到一个攻击者能够控制内容的本地文件

给大家带来几种常见的技巧

  • 包含用户上传的文件
  • 包含 data:// 或 php://input 等伪协议
  • 包含Session文件包含
  • 包含日志文件
  • 包含/proc/self/environ文件
  • 包含上传临时文件

Session文件包含

当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session内容可控

  • Session的存储位置可以获取
  • Session内容可控
  • session文件格式: sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到
    文件包含漏洞利用_第14张图片

通过phpinfo的信息获取session的存储位置:session.save_path为E:\phpstudys\PHPTutorial\tmp\tmp
文件包含漏洞利用_第15张图片


     session_start();
    $xvbinyv  = $_GET['xvbinyv'];
     $_SESSION['lover']=$xvbinyv;
?>

此代码的$xvbinyv变量的值可以通过GET型参数传入。PHP代码将会获得GET型xvbinyv变量的值存入Session中。攻击者可以利用GET型xvbinyv参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代码
文件包含漏洞利用_第16张图片http://192.168.78.19/baohan/redamancy.php?xvbinyv= 在xvbinyv后面写入,xvbinyv会将该php语句写入session中,打开文件目录可以查看该内容

文件包含漏洞利用_第17张图片xvbinyv后面跟session的存储位置+文件名,就可以成功触发Session文件包含漏洞

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

这推荐大家看一下暮秋初九老师的Session文件包含漏洞讲解的十分详细

包含/pros/self/environ

proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。

  • php以cgi方式运行,这样environ才会保持UA头。
  • environ文件存储位置已知,且environ文件可读

包含上传文件

很多网站通常会提供文件上传功能,比如:上传头像、文档等,这时可以上传一句话图片木马的方式进行包含,包含上传文件博主在上一章已经详细讲解过了不懂的可以进行学习文件上传

包含临时文件

文件包含漏洞利用_第18张图片php中上传文件,会创建临时文件。其目录在php.ini的 upload_tmp_dir中定义,一般默认为空,在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

该临时文件的文件名是随机的,攻击者必须准确猜测出的该文件名的才能成功。PHP在此处并没有使用安全的随机函数,因此可以进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名

包含日志

WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码

Apache运行后一般默认会生成两个日志文件,Windos下是access.log(访问日志)和error.log(错误日志),Linux下是access_log和error_log,访问日志文件记录了客户端的每次请求和服务器响应的相关信息

大家可以通过百度搜索常见的日志文件可能会存在以下地方有哪些

这里给大家提一下metasploit中包含了一个脚本自动化完成包含日志文件的攻击详细过程大家可以参考吴翰清老师的白帽子将web安全

包含PHP伪协议

php://input

碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;


    echo file_get_contents("php://input");
?>

文件包含漏洞利用_第19张图片没有学习过PHP伪协议的同学可以先去学习一下,不止能包含php://input也可以有

  • file://
  • zip://
  • data://
  • phar://

当然博主后面会出详细的教程

参考文献

文件上传
PHP Session | 菜鸟教程 (runoob.com)
web安全原理-文件包含漏洞 - 笑花大王 - 博客园 (cnblogs.com)
CTF文件包含漏洞总结
Session文件包含漏洞

本文章借鉴了各路大神的手笔,博主也是学生难免会有些错误和理解不到位的地方,欢迎讨论与指正!!!

你可能感兴趣的:(PHP安全,常见漏洞攻防,php,web安全,安全,网络安全)