服务端漏洞——文件包含

160 阅读2分钟

本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。

服务端漏洞——文件包含

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

PHP中文件包含函数有以下四种:

include()              找不到文件会警告,脚本继续执行
include_once()         与include类似,只是代码若被包含,则不会再次包含
require()              找不到文件会产生致命错误,并停止脚本
require_once()         与require类似,只是代码若被包含,则不会再次包含

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

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

文件包含漏洞存在:include参数可控

  1. 执行任意文件代码(搭配文件上传,可执行a.jpg

  2. 任意文件读取(路径可控,若文件内无<?php标记)

  3. 真·任意文件执行

    错误配置:php.ini中allow_url_fopen与allow_url_include均开启
    
    远程文件包含
    http://[ip]/a.txt  //远程服务器
    

    没有远程服务器?

    data: text/plain,<?php echo "aaaa";?>
    data%3a+text/plain,<%3fphp+echo+"aaaa"%3b+%3f>
    
    php://input   //获取post数据
    
  4. 真·任意代码读取

    #将index.php内容进行base64编码后包含[将<等进行转义了]
    搭配php://filter伪协议
    php://filter/read=convert.base64-encode/resource=index.php
    
绕过上传文件:

若include限制,仅允许包含PHP后缀文件

<?php include($_GET['action'].".php")>

利用zip://phar://读取压缩包内php文件:

  1. 创建webshell文件a.php

  2. zip协议压缩a.php,得到a.zip

  3. 修改a.zip为a.jpg

  4. 上传a.jpg

  5. 获得a.jpg路径,进行包含

  6. zip://a.jpg%23a               #作为分隔符  %23  访问压缩包内的a
    phar://a.jpg/a                /为分隔符
    

PHP伪协议

file://:访问本地文件系统

http://:访问网址

php://:访问各个输入输出流

zip://:获取zip压缩包内内容

phar://:1.获取压缩包内内容 2 反序列化利用

REFERER