文件包含漏洞---php协议

一、原理

  1、概念:在php代码中,总会有一些代码我们会经常用到,这时引入了文件包含函数,可以通过文件包含函数把这些代码文件包含进来,直接使用文件中的代码,这样提高了我们的工作效率。

  2、文件包含函数:

    include():如果发生错误,会产生一个警告然后继续执行脚本

    include_once():与include()相同,如果文件之前被包含过则不再包含

    require():会停止执行代码

    require_once():如果文件之前被包含过则不再包含

  3、类型:本地文件包含、远程文件包含(url的形式进行)

        配置文件参数:allow_url_fopen:为ON时,能读取远程文件,

          Allow_url_include:为ON时,就可以使用include和require等方式包含远程文件

  4、利用方式——伪协议

    # file://  协议用户访问本地文件系统,使用方法:?file:// [文件的绝对路径和文件名]

    # php://input  可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行

    # php://filter  元封装器,读取源代码并以base64编码方式输出

    # zip://, bzip2://, zlib://   属于压缩流,可以访问压缩文件中的子文件,使用方法:zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

    # data://  类似于php://input,可以让用户来控制输入流

    其他利用方法:(绕过方式)

    #00截断:windows在读文件名的时候遇到00就会停止

    #长度截断(win:256,linux:4096)

    #包含日志文件:传入的参数值如果会保存到日志文件中,我们可以把木马传入到日志文件中,知道日志的路径就可以进行下一步操作

    #包含session

  5、防御

    #php中使用open_basedir配置限制访问在指定的区域

    #过滤 . (点) / (反斜杠) \(反斜杠)

    #禁止服务器远程文件包含

    #尽量不要使用动态包含,可以在需要包含的页面固定写上

二、利用LFI环境复现文件包含漏洞

  这是我在github上边下载的,有很多题目要做一些改动才可以实现,所以懂了原理就可以了,用PHP study本地搭建起来就可以复现,

因为我的路径和原本代码的路径不同,所以每复现一个之前都要把文件包含函数里面的路径修改一下,例如:

  # LFI-1 简单的文件包含

  观察源代码,这是一个简单的文件包含

  我现在网站根目录下传入一个phpinfo的文件,

  

  根据源码,框中传入的参数是page,我们可以构造payload,得到根目录下的文件内容

  

  根据实验,不管文件的后缀名是jpg、txt,都会以php代码执行,所以可知文件包含时与传入文件的类型无关

  

  # LFI-2 00截断绕过

  观察源码,

  这个参数传入之后构成的路径是:includes/文件.php,我们可以用%00把.php截断,然后利用相对路径进行绕过

  这个题可能是有很多限制,我把includes删除然后把php版本调到5.2.17然后把gpc设置为off才能实现。

  如果我们传入一个一句话,这时就可以用菜刀连接

  # LFI-3 点、斜杠绕过

  观察源码,源码当中取后四位即后缀名与.php比较,如果相同则输出不被允许查看源码的警告,若不同则读取文件内容。

  

  我们可以在url的末尾加.(点),因为,在文件命名时,后缀后面加点是会自动去掉的

  我们也可以加/.    因为在命名时,/(斜杠)是不允许出现的

  # 4 去后缀名绕过

  观察源码,

  

  addslashes()函数:是一个过滤函数

  

  参数传入之后构成的url是:includes/class_参数.php

  源码本身就是有.php的后悔,我们可以传参数时舍后缀

  #5 双写绕过

  观察源码,

  

  这段源码过滤了../,我们可以通过双写绕过,即:....//

  #6 文件包含写webshell

  观察源码,

  这个和第一个差不多,就是参数是以post的方式提交的,我们只要用post的方法提交参数,就可以发现文件包含

  此时,我们如果传入一个任意文件写入以下代码,执行之后就可以在文件的目录写入一个shell

  <?php fputs ( fopen(‘shell.php‘,‘w‘) , ‘<?php eval($_POST[shell])?>‘) ;?>

  这段代码的意思就是新建一个shell.php的文件,写入后面的一句话

  #7 用post的方式做00截断或舍去后缀  ../../../phpinfo.php%00

  #8 post方式做00截断或加./绕过

  #9 post方式做舍去后缀名绕过

  #10 post方式双写绕过

  #11 简单的post方式包含,有一个隐藏的输入框,用隐藏的参数

  #12 简单的get方式包含,有一个隐藏的输入框,用隐藏的参数

  #13 get方式双写绕过

  #14 post方式双写绕过

  注:可能是环境的问题,很多题不能实现,只要懂原理就可以

  #包含日志文件获取webshell  

  日志默认路径:

  1、apache+Linux日志默认路径:

    /ect/httpd/logs/access_log 或者 /var/log/httpd/wccess_log

  2、apache+Win2003日志默认路径

    D:\xampp\apache\logs\access.log

    D:\xampp\apache\logs\error.log

  3、IIS6.0+Win2003默认日志文件

    C:\WINDOWS\system32\Logfiles

  4、IIs7.0+win2003默认日志文件

    %SystemDrive%\inetpub\logs\LogFiles

  5、nginx日志文件默认路径

    日志文件在用户安装目录logs目录下

      例如安装路径伪/user/nginx,

      拿我的日志文件目录就是在/user/nginx/logs里

  利用方法:我们进行获取的时候首先要知道日志文件的路径,      

  既然我们申请访问的url会记录到日志中,我们可以在url中写入一句话然后提交,这时,我们就会在日志文件中写入一句话,

  但是一般的浏览器都会编码我们提交的url,

  我们可以用burpsuit抓包,在url中写入一句话进行提交,就能写入一句话并解析,这样就可以成功获取shell

三、php伪协议

  #1 用php://filter获取flag

  这里bugku有一个经典的文件包含+php://filter的题目:flag在index里

  在页面上我们可以看到一个按钮链接,点击之后就会跳转到参数file的url

  

  这里由参数file可以猜到用php://filter伪协议来读取flag

  我们构造payload:?file=php://filter/read=convert.base64-encode/resource=index.php

  

  这里convert.base64-encode是将源码以base64编码,然后读取出来,我解码之后得到

  

  这里就能发现flag

  #2 命令执行获取webshell

  如果通过php://input实验发现存在漏洞,可以使用system命令dir查看目录,发现敏感的目录

  然后就可以通过<?php fputs ( fopen(‘shell.php‘,‘w‘) , ‘<?php eval($_POST[shell])?>‘) ;?>,写入一句话

  #3

  我们也可以用压缩协议,data协议进行绕过,也可以利用windows的特性,文件名字大于256时后面的内容就会舍弃,来进行绕过。

  php协议很常用很强大,这里只是我的一些浅见。

原文地址:https://www.cnblogs.com/qie-date/p/12253701.html

时间: 2024-10-24 12:28:35

文件包含漏洞---php协议的相关文章

文件包含漏洞

本实验是基于DVWA和sqli-labs的实验环境 实验平台搭建:下载Wamp集成环境,并下载DVWA和sqli-labs和压缩包解压至wamp\www的目录下.安装只要注意Wamp环境的数据库名和密码对应即可. 0x01:文件包含漏洞 服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的. 这也算官方的解释吧,用个人的话说,通过浏览器.url地址或者是一个参数的变量的内容,可以通过修改这些url

PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的一种攻击手段.本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细的分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. 1. PHP文件包含漏洞介绍 首先,我们来介绍下何为文件包含漏洞.严格来说,文件包含漏洞是“代码注入”的一种

文件包含漏洞利用

文件包含可以利用的方式 (1) 直接进行文件的遍历读取:(读取敏感信息) 在获悉中间件 IIS.apache与第三方集成包等程序默认安装路径的情况,可以直接利用文件包含结合目录遍历进行"配置文件的读取" include.php?file=../../../etc/pass include.php?file=../../../xampp/htdocs/config.php (2)解析符合php规范的任何文件:(本地包含配合文件上传) 可以利用文件包含函数可以解析任何符合PHP规范的文件的

网站安全(7) —— PHP文件包含漏洞介绍

其原理就是注入一段用户能控制的脚本或代码,并让服务端执行.文件包含漏洞可能出现在JSP.PHP. ASP等语言中,原理都是一样的,本文只介绍PHP文件包含漏洞. 要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件: 1. Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件 (文件包含函数还有 include_once().require().require_once()) 2. 用户能够控制该动态变量 现在来看一段简单的文件包含代码: ? 1 2 3 <?ph

10_文件包含漏洞(属于任意代码执行)

一.背景介绍 随着网站业务的需求,web脚本可能允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式. 二.漏洞成因 文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入.当被包含的文件在服务器本地时,就形成的本地文件包含漏洞.被包含的文件在第三方服务器时,就形成了远程文件包含漏洞. 本地到

文件包含漏洞进阶篇

前言: 文件包含漏洞虽然在前面已经说过,但是感觉还不到火候.这次在度 深入了解. 目录: 本地文件包含漏洞的进阶 远程文件包含漏洞 正文: 进入之后选择文件包含漏洞,如下图所示 [图一] 进去一看,明显的文件包含漏洞. 尝试包含本地存在的phpinfo.php 使用file协议进行包含 使用php协议进行base64编码读取 windows特别多毛病 php输入 url编码 原来:/etc/passwd 编码之后:%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd

文件包含漏洞总结

前言: 本人(九世)正式从博客园:迁移到:http://hackhat.net.会进行同步更新 正文: 漏洞来源: 文件包含漏洞,得从文件包含说起.一般写代码的人都知道,完成一个项目里面有很多的文件调用和引用 而文件包含漏洞,因为文件包含的时候没有做对应的防御措施导致引用的文件变成攻击者所指定的文件. PHP中提供了四个文件包含的函数 函数名称 特点 include 遇到错误,仍会执行 include_once 遇到错误,仍会执行 require 遇到错误,不会执行 require_once 遇

百度杯”CTF比赛 2017 二月场 没错!就是文件包含漏洞。

题目源码: 文件包含漏洞的话,看一下 你么可以使用php://input 伪协议,执行代码(参考了大佬WP)这里使用了POSTMAN, 目录下还有一个dle345aae.php文件,呢么用cat命令打开,并且输出文件内容(反单引号在linux中表示命令) 还有一种方法是用php://filter直接读取dle3456aae.php的源码,然后再base64解码 原文地址:https://www.cnblogs.com/BOHB-yunying/p/10610515.html

php文件包含漏洞(allow_url_include=Off)的绕过方法

分享几个当allow_url_include = Off时的文件包含漏洞的绕过方法. 假设服务端的php代码(aaa.php)如下图所示: 第1种:smb协议 Payload:http://127.0.0.1/aaa.php?path=\\43.5*.**.74\ica\abc1238.htm 这种方法只适用于Windows类型的网站服务器,不能用于Linux服务器. 首先在VPS上搭建Samba服务,然后添加一个无需认证即可访问的共享目录,配置信息如下图所示: 然后在/home/share目录