站在巨人的肩头才会看见更远的世界,这是一篇技术牛人对CTF比赛中文件包含的内容总结,主要是对一些包含点的原理和特征进行归纳分析,并结合实际的例子来讲解如何绕过,全面细致,通俗易懂,掌握这个新技能定会让你在CTF路上少走很多弯路,不看真的会后悔!

php伪协议的分类

伪协议是文件包含的基础,理解伪协议的原理才能更好的利用文件包含漏洞。

php://input

php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。

使用条件:include( )、include_once( )、file_get_contents( )

比较特殊的一点,enctype=”multipart/form-data”的时候 php://input 是无效的。

用法举例:

  • 使用file_get_contents函数的伪协议包含有个经典的例子;
  • 可以使用fputs文件输入流直接服务器某一存在的目录下写入文件。

php://output

php://output 是一个只写的数据流,允许你以print和echo一样的方式写入到输出缓冲区。

php://filter(重点)

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是作为一种过滤器,可以使用在数据流产生的地方。

在php文档中,标准的定义是这样的:

类似的过滤器还有string.rot13、string.strip_tags、zlib.deflate和zlib.inflate等等,目前只要知道convert.base64-encode就好了。

URL 中包含点的常见形式

?file = xxx 或者 ?file = xxx.php

allow_url_fopen和allow_url_include

在测试了包含点存在包含漏洞以后,并不是都可以使用filter伪协议包含出源码的,因为allow_url_fopen和allow_url_include会影响到fopen和include等函数对于伪协议的支持。

allow_url_include影响php://input的使用,若不打开则无法使用。

当allow_url_fopen打开时,可以包含任意url。

例如只打开allow_url_include时,只能包含远程文件和使用php://input

举个例子

题目链接:http://level3.tasteless.eu/

题目直接给出了源码:

根据提示,用php://input 伪协议读取php.ini

找到SERVER["DOCUMENT_ROOT"],也就是网站的根目录,可以找到当前脚本的目录,如下:

还可以看到一些文件包含的配置:

  • rfi是关闭的,也就是allow_url_fopen为Off;
  • allow_url_include开启,可以使用php://input伪协议来列出当前目录下的文件。

payload:

绕过 waf 的方法

字典绕过

在一些CTF中会对一些伪协议的关键词进行过滤,如read、resource等等,下面总结了几条绕过方法,在实战中作为字典来跑。

?f=php://filter/convert.base64-encode/resource=login.php(过滤了操作名read)
?f=php://filter/read=convert.base64-encode/resource=1.jpg/resource=./show.php(正则 /resource=*.jpg/i)
?f=data:text/plain,<?php phpinfo()?>
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

这里说一下第二条,这是2018 ISCC中的一道题目的绕过方法。

这里用正则匹配了resource=,我们就可以用重写的方法来绕过正则。

截断包含

截断

这里技巧现在应该是用的比较少了,因为利用截断要满足下面的两个条件:

  • php版本小于5.3.4
  • magic_quotes_gpc为off

./ 截断

点号和路径截断以及./截断,也就是填充大量的./使url长度超过最大值,来达到截断的目的。

具体可以看下面的文章:

https://blog.csdn.net/zvall/article/details/8951925

zip协议和phar协议

在实战过程中,若发现存在文件上传但是没有办法直接上传php文件,可以传zip压缩文件,我们就利用这两个协议,将php文件打包成zip文件来包含里面的php脚本。

phar://、zip://,都可以看到在phpinfo中有相应的描述。

例如脚本文件为1.php,打包成1.zip,然后再改名为1.jpg,上传之后包含1.jpg中的php文件即可。

zip://..(当前脚本的绝对路径).../1.jpg#1.php
phar://...(当前脚本的绝对路径).../1.jpg/1(分割不加后缀名)

实战经验丨CTF中文件包含的技巧总结的更多相关文章

  1. CTF中文件包含的一些技巧

    i春秋作家:lem0n 原文来自:浅谈内存取证 0x00 前言 网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应 ...

  2. PHP中文件包含的路径问题

    在程序中当前文件夹下文件路径可以表示为3种:1)绝对路径,2)相对路径,3)直接文件名 例如在/var/www下的a.php:1)/var/www/a.php 2)./a.php 3)a.php 在P ...

  3. 实战经验丨PHP反序列化漏洞总结

    又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞. 虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以 ...

  4. CTF PHP文件包含--session

    PHP文件包含 Session 首先了解一下PHP文件包含漏洞----包含session 利用条件:session文件路径已知,且其中内容部分可控. 姿势: php的session文件的保存路径可以在 ...

  5. CTF之文件包含的猥琐思路

    From: i春秋 百度杯”CTF 一: <?php include "flag.php"; //包含flag.php这个文件 $a = @$_REQUEST['hello' ...

  6. CTF中的EXP编写技巧 zio库的使用

    zio库没有提供文档 这个是官方给出的一个例子程序 from zio import * io = zio('./buggy-server') # io = zio((pwn.server, 1337) ...

  7. php学习笔记6--php中的文件包含 include,require,include_once,require_once

    php中的文件包含 include,require,include_once,require_once 文件包含:是指将一个文件的内容包含进另外一个文件,有利于代码的复用等.php中文件包含指令有4个 ...

  8. 2020/1/31 PHP代码审计之文件包含漏洞

    0x00 文件包含简介 文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校检,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...

  9. 【渗透测试学习平台】 web for pentester -7.文件包含

    Example 1 输入单引号,报错,得到物理路径 可通过../../../../etc/paaswd 读取敏感信息 可包含本地文件或远程文件 https://assets.pentesterlab. ...

随机推荐

  1. 在 Ubuntu 系统中部署 Git Server

    http://blog.csdn.NET/poisonchry/article/details/11849781 虽然有很多开源的Git仓库,不过并非所有都尽人意,譬如Github,Gitlab等,不 ...

  2. JAVA 第一张 使用记事本编写代码

    使用记事本开发JAVA程序的步骤

  3. 一天搞懂深度学习-训练深度神经网络(DNN)的要点

    前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...

  4. Lintcode400 Maximum Gap solution 题解

    [题目描述] Given an unsorted array, find the maximum difference between the successive elements in its s ...

  5. Maven手动添加jar包

    有的jar在Maven中找不到则需要手动添加(如ojdbc14.jar) 方法如下: 一.将你要添加的jar包放到指定目录(在该目录下打开命令窗口) 二.输入指令:mvn install:instal ...

  6. 【Java】运用泽勒一致性计算某天是星期几

    /** * Created by liangjiahao on 2017/2/26. * 运用泽勒一致性计算某天是星期几? * 公式: * h = (q + 26(m+1)/10 + k +k/4 + ...

  7. 正则表达式re模块小结

    re模块的常用方法 1.compile(pattern[,flags]) 创建模式对象,一般配合其他方法使用.例如: import re #导入re模块 text = 'All that doth f ...

  8. vue项目 构建 打包 发布 三部曲

    一.vue项目的创建 1.首先第一肯定是要有Node.js及npm这个不多说了2.安装脚手架 此时可以直接浏览-但是现在肯定有很多小白想将他发布到gitHub上并可以浏览,使用vue全家桶制作自己的博 ...

  9. servlet简介及生命周期

    Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...

  10. 一个原生input上传图片记录

    html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...