文件包含漏洞(总结)+常见的getshell+PHP伪协议

您所在的位置:网站首页 如花似玉写一句话 文件包含漏洞(总结)+常见的getshell+PHP伪协议

文件包含漏洞(总结)+常见的getshell+PHP伪协议

2024-07-07 09:12| 来源: 网络整理| 查看: 265

写在前边

  最近两天突然失去梦想,做题目全是知识盲区,就放弃思考了几天,想想还是写点什么,这里先总结一下什么是文件包含以及以PHP伪协议的文件包含利用,后续再更新CTF的实战

注意:所有实验必须要在php.ini中 allow_url_fopen =On 、allow_url_include = On

 

文件包含漏洞原理

  程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。在实际WEB应用中,当页眉需要更新时,只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

  开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,在文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

 

PHP常见文件包含函数

  include()、include_once()、require()、require_once()

  include()和require()区别 require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。 include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行

  演示一下,新建一个测试文件a.php,在同目录下有个home.php、upload.php、download.php这三个文件,我

  在同目录下有个home.php、upload.php、download.php这三个文件,只要根据不同的参数,我们就可以访问不同的文件

 

 

 

 

 

 

 

 

 

   此时,我们访问的当前目录下的文件,如果不限制参数,我们可以读取其他其他路径下的文件,这里有个绝对路径和相对路径的概念

  新建一个aaa.php,这里存放一个类

  再建一个aa.php,用来测试

 

  绝对路径:绝对路径是指文件在硬盘上真正存在的路径。如修改路径为 /var/www/html/web/aaa.php

include('/var/www/html/web/aaa.php')

 

  相对路径:就是相对于自己的目标文件位置 如 ./aaa.php,只要两个文件相对的路径不变,那么实际就是对的

include('./aaa.php');

 

 

   了解了什么是包含和路径,现在具体来看看文件包含漏洞

 

PHP文件包含漏洞

  文件包含漏洞利用的前提条件:   (1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;   (2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

  1、无限制本地文件包含漏洞

  依照刚刚所讲述的,我们利用filename这个参数控制我们访问的页面,再参照路径问题,当未对参数进行访问控制时,我们可以访问其他路径下的文件,我的服务器是在Linux上的

 

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

    测试代码:

     2.1   %00截断

      条件:magic_quotes_gpc = Off php版本

  (真实场景中绝对不可能出现这种代码,这里只是演示 ORZ )

  发现我们可以控制访问的文件和写入,这里我们通过传参修改一下user.php的内容(这里有个小BUG,第一次修改的时候不会显示修改的值,刷新才两次才更新,毕竟要先写入后再返回)

 

  如果我们输入的PHP代码呢?

 

   发现成功执行了phpinfo()这个函数,这样,我们可以修改相对应的文件进行getshell,这里就简单介绍一下利用代码执行函数和命令执行函数来getshell(一些奇怪的实战可能需要等刷到题),像这样文件包含和改写的在CTF中经常与序列化结合在一起,不了解序列化的可以去看一下 https://www.cnblogs.com/Lee-404/p/12771032.html

  这边还有一个session.php利用,实际上3利用方法一样的,前提是必须知道session.php的位置,phpinfo中可获取

 

一句话木马   文件包含获取 webshell 的条件:

  (1)攻击者需要知道文件存放的物理路径;   (2)对上传文件所在目录拥有可执行权限;   (3)存在文件包含漏洞;

  菜刀马的原理是调用了PHP的代码执行函数,常见的一句话菜刀马,就是调用了eval函数、assert函数。

  1、eval()

    eval() 函数把字符串按照 PHP 代码来计算。

    该字符串必须是合法的 PHP 代码,且必须以分号结尾。

    如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

  //菜刀密码为cmd

 

 

  改写成功,接下来连接,我这菜刀连接不上,可能本地防火墙原因,所以用hackbar连接

 

 

   2、assert()函数

    eval() 函数把字符串按照 PHP 代码来计算。

    该字符串必须是合法的 PHP 代码,且必须以分号结尾。

    如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

  //用法和eval一样,具体后续再分析

  

PHP伪协议   php://input(写木马)

  php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。  ——php.net

  简单说就是获取post数据。

  test.php

 

 

 

   php://filter(读文件)

   php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。    ——php.net

  简单说经常利用它进行base64编码,在CTF中,经常出现,我们利用

php://filter/read=convert.base64-encode/resource=xxx  //xxx是文件名

  测试代码

 

 

  以base64的方式输出,解码 https://base64.supfree.net/

 zip://,bzip2://,zlib:// (上传)

  zlib: 的功能类似 gzopen(),但是 其数据流还能被 fread() 和其他文件系统函数使用。 自 PHP 4.3.0 后这个不建议被使用,因为会和其他带“:”字符的文件名混淆; 请使用 compress.zlib:// 作为替代。compress.zlib://、 compress.bzip2:// 和 gzopen()、bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。ZIP 扩展 注册了 zip: 封装器。 自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。 字节流上下文(stream contexts)中使用 ‘password’ 选项设置密码。  ——php.net

   简单说就是直接访问压缩包里的文件。将phpinfo.txt压缩成zip,实战中可以改后缀为jpg绕过上传限制。

 

  data://伪协议

  数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行

   

  phar://伪协议

  这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。

  用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。   步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。

  

  在CTF中,可以利用这些伪协议来进行骚操作

 

防御方案 在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败 做好文件的权限管理 对危险字符进行过滤等等

 

 参考链接

  https://blog.csdn.net/nzjdsds/article/details/82461043

  https://www.freebuf.com/articles/web/182280.html

  https://www.cnblogs.com/fox-yu/p/9134848.html

如有错误请指出,谢谢


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3