26、文件包含

2023-12-14 16:06:05

一、文件包含

1.1 概念

??把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数。这一调用文件的过程被称为包含

1.2 PHP文件包含原理

??文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

??几乎所有的脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,这是有些语言设计的弊端。在PHP中经常出现文件包含漏洞,但并不意味着其他语言不存在。
??主要讲PHP文件包含。

1.3 文件包含重要函数

  • include():找不到被包含文件时会产生警告(E_WARNING),后续代码会执行。
  • include_once():与include()类似,代码已经被包含则不会再次被包含。
  • require():找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),后续代码不会被执行。
  • require_once():与require()类似,代码已经被包含则不会再次包含。

1.4 文件包含利用条件

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

注意:只要文件内容符合PHP语法规范,任何扩展名均可被PHP解析。故在文件上传绕过白名单时,可以使用文件包含漏洞来绕过白名单限制。

二、文件包含漏洞利用

2.1 文件包含分类

??文件包含漏洞可以分为LFI (Local File Inclusion,本地文件包含)和RFI(Remote File Inclusion,远程文件包含)。区分二者最简单的方法就是查看php.ini中是否开启了allow_url_include,如果开启就有可能包含远程文件

远程文件包含需要php.iniallow_url_include=Onallow_url_fopen=On。在php.ini中,allow_url_fopen默认是on,而allow_url_include从php5.2之后默认为Off。
在这里插入图片描述

2.2 常见敏感文件

就是说通过文件包含漏洞,可以查看系统敏感信息。

(1)Windows系统敏感信息

在这里插入图片描述
(2)Linux系统敏感信息

在这里插入图片描述

2.3 包含Apache日志文件

思路:找到Apache路径,利用文件包含漏洞包含日志文件获取webshell。
Apache两个日志文件:

  • access.log,用户发起请求时,请求会写入access,log。
  • error.log,当发生错误时将错误写入error.log。

??当发现网站存在文件包含漏洞,但无webshell文件包含,也没有上传点?如果先访问127.0.0.1/include/<?php phpinfo();?>,再访问access.log,php解释器将会解析php探针(phpinfo())。
注意:

  1. 当访问不存在的资源时,apache日志也会记录;
  2. 需要使用burp抓包,将经过URL编码的符号改回去。
    在这里插入图片描述

2.4 常见中间件的日志路径

  • Apache+linux组合的日志默认路径/etc/httpd/logs/access_log或者/var/log/httpd/access log
  • Apche+Windows组合的日志默认路径
    • XAMPP套件:xampp\apache\logs\access.log
    • phpstudy套件:phpstudy\Apache\logs\access.log
  • IIS6默认日志路径:C:WINDOWS\system32\Logfiles
  • IIS7默认日志路径:%SystemDrive%\inetpub\logs\LogFiles
  • Nginx,Nginx日志文件再用户安装目录的logs目录下,如安装目录为/usr/local/nginx,则日志记录就在/usr/local/nginx/logs里。也可通过其配置文件nginx.conf,获取到日志路径(/opt/nginx/logs/access.log)

2.5 包含其他日志文件

??不仅可以包含apahce日志文件,也可以包含其他日志文件。与apache日志文件的效果一样。

2.5.1 SSH日志文件

??把用户名改为<?php phpinfo();?>,ssh登录日志就会把此次登录行为记录到日志中。
在这里插入图片描述

2.5.2 Session文件

(1)session简介
??Cookie存在客户端,Session存在服务端,cookie用来保存用户的账户信息,session一般用来跟踪会话。
(2)利用场景
??一般存在登陆点位置注册用户。
(3)Session文件路径

  • 通过phpinfo()页面获取:session.save_path参数
    在这里插入图片描述
  • 常见的Session存储位置
    • /var/lib/php/sess_[PHPSESSID]
    • /tmp/sess_[PHPSESSID]

    PHPSESSID获取,可以通过burp抓包查看。然后利用文件包含漏洞包含session文件。
    在这里插入图片描述

三、PHP封装伪协议

3.1 常用的伪协议

在这里插入图片描述

3.2 php流input

??利用php中流的概念,将原本的include的文件流重定向到用户可控制的输入流中。也就是说原本必须是包含某个服务器端的文件,现在可以自定义POST内容给include()函数且这个内容能被php解析。
条件allow_url_include:onallow_url_fopen不做要求
在这里插入图片描述

include()函数会直接包含POST数据,就是解析POST中的php代码。

3.3 php流filter

作用:读取文件
条件:allow_url_includeallow_url_fopen均不做要求
基本格式:?page=php://filter/read=convert.base64-encode/resource=xxx.php,通过指定xxx.php,可以读取经过base64编码后的文件源码,之后再base64解码。虽然不能直接获取webshell,但是能读取敏感文件。
在这里插入图片描述

其他姿势:?page=php://filter/convert.base64-encode/resource=xxx.php效果与前面的一样,仅少了read关键字。再绕过一些waf时或许有用。

3.4 zip协议

基本格式:?page=zip://<zip文件路径>%23<被压缩的文件名>
在这里插入图片描述
??先将要执行的PHP代码写好文件名为test.txt,将test.txt进行zip压缩,压缩文件名为test.zip,如果可以上传zip文件便直接上传,若不能,将test.zip重命名为test,jpg后再上传。

注:

  1. 使用zip协议需要指定绝对路径,使用相对路径会包含失败。
  2. #编码为%23
  3. zip文件的文件名不影响zip协议。

3.5 data协议

??条件:php版本大于等于5.2,allow_url_includeallow_url_fopen都为On
??基本格式:?page=data://test/plain,<?php phpinfo();?>?page=data://test/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
在这里插入图片描述

3.6 phar协议

??假如有个文件test.txt,打包成zip压缩文件,指定绝对路径(或相对路径)
?page=phar://<文件路径>/test.zip/test.txt
在这里插入图片描述

3.7 PHP伪协议总结

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_55202378/article/details/134904399
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。