文件包含

参考资料:
文件包含漏洞简介
利用phpinfo条件竞争
PHP文件包含漏洞利用思路与Bypass总结手册

1. 概述

什么是文件包含:文件包含函数所加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他文件或恶意代码,导致信息泄露或代码注入。

要求:包含的文件路径攻击者可控,被包含的文件web服务器可访问。

1.1 常见的引发漏洞的函数:

  1. include()执行到include时才包含文件,文件不存在时提出警告,但是继续执行
  2. require()只要程序运行就会包含文件,文件不存在产生致命错误,并停止脚本
  3. include_once()require_once()只执行一次,如果一个文件已经被包含,则这两个函数不会再去包含(即使文件中间被修改过)。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),其中的文本内容都会直接作为php代码进行解析。

1.2 利用条件

  • 包含函数通过动态变量的方式引入需要包含的参数。

  • PHP中只要文件内容符合PHP语法规范,不管是什么后缀,都会被解析。

1.3 分类和利用思路

文件包含通常按照包含文件的位置分为两类:本地文件包含(LFI)和远程文件包含(RFI),顾名思义,本地文件包含就是指包含本地服务器上存储的一些文件;远程文件包含则是指被包含的文件不存储在本地。

本地文件包含

  1. 包含本地文件、执行代码
  2. 配合文件上传,执行恶意脚本
  3. 读取本地文件
  4. 通过包含日志的方式GetShell
  5. 通过包含/proc/self/envion文件GetShell
  6. 通过伪协议执行恶意脚本
  7. 通过phpinfo页面包含临时文件

远程文件包含

  1. 直接执行远程脚本(在本地执行)

远程文件包含需要在php.ini中进行配置,才可开启:

allow_url_fopen = On:本选项激活了 URL 风格的 fopen 封装协议,使得可以访问 URL 对象文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。(出于安全性考虑,此选项只能在 php.ini 中设置。)

allow_url_include = On:此选项允许将具有URL形式的fopen包装器与以下功能一起使用:include,include_once,require,require_once。(该功能要求allow_url_fopen开启)

2. 利用方法

2.1 配合文件解析漏洞来包含

http://target.com/?page=../../upload/123.jpg/.php

2.2 读取系统敏感文件(路径遍历)

include.php?file=../../../../../../../etc/passwd

Windows:

​ C:\boot.ini //查看系统版本
​ C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
​ C:\Windows\repair\sam //存储系统初次安装的密码
​ C:\Program Files\mysql\my.ini //Mysql配置
​ C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
​ C:\Windows\php.ini //php配置信息
​ C:\Windows\my.ini //Mysql配置信息

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/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz

2.3 包含http日志文件

通过包含日志文件,来执行夹杂在URL请求或者User-Agent头中的恶意脚本

  1. 通过读取配置文件确定日志文件地址

    默认地址通常为:/var/log/httpd/access_log/var/log/apache2/access.log

    1568647706502

  2. 请求时直接在URL后面加上脚本即可http://www.target.com/index.php<?php phpinfo();?>,之后去包含这个日志文件即可。

  3. 注意:日志文件会记录最为原始的URL请求,在浏览器地址栏中输入的地址会被URL编码,通过CURl或者Burp改包绕过编码。

apache+Linux 日志默认路径
/etc/httpd/logs/access_log
/var/log/httpd/access_log
xmapp日志默认路径
D:/xampp/apache/logs/access.log
D:/xampp/apache/logs/error.log
IIS默认日志文件
C:/WINDOWS/system32/Logfiles
%SystemDrive%/inetpub/logs/LogFiles
nginx
/usr/local/nginx/logs
/opt/nginx/logs/access.log

通过包含环境变量/proc/slef/enversion来执行恶意脚本,修改HTTP请求的User-Agent报头,但是没复现成功

版权声明:本文为ph1sh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ph1sh/p/13054769.html