ctf任意文件包含漏洞简单讲解含php伪协议及习题

先来看看什么是文件包含

在开发的过程中,遇到一些需要经常重复使用的代码,如果每次都重新写入,会造成很大的麻烦,所以,我们会将这些需要大量使用的重复代码写入一个文件中,在项目中通过函数引入这个文件,那么就可以做到代码的插入。

这些代码由几个函数引入

1.include()函数

include()函数,是临时加载的,在读到该函数时,才会包含里面的文件。include()在执行的时候如果:

"合法代码"
include('XXXX')  假如include读取的文件不存在,他的上下两个"合法代码"都会执行,只有它自己报错
"合法代码"

2.require()函数

require()函数是预先加载好了的,在读取该函数之前,就已经包含里面的文件内容,require()在执行的时候如果:

"合法代码"
require('XXXX')  require执行前会将读取文件中的代码提取出来和上下的代码拼接在一起执行,然后如果文件内的代码有错误则全局都错误
"合法代码"

3.include_once()

该函数和include()没有什么太大的区别,只是会去检查该文件是否已经进行过包含

4.require_once()

同理该函数和require()也没有太大的区别,同样也是会去检查该文件是否已经进行过包含.

php文件包含通常会和php伪协议挂钩我们来了解下php伪协议(只讲比较重要的常用的几个)

1.php://input

是个可以访问原始数据的只读流,可以在post中传入数据并当作代码执行,条件为allow_url_include=On
allow_url_fopen-Off/On   使用例子? file=php://input  POST:phpinfo();

2.php://filter

是一个原封装器,用于过滤读取的数据流,其中有几个参数,resource参数必选,用于选取读取的数据流,read和write可选,用于设定过滤器,说了那么多,简单点,条件allow_url_fopen=Off/On
allow_url_include=Off举例子?file=php://filter/read=convert.base64-encode/resource=phpinfo.php(因为该协议会把数据流当成php解析,所谓为了获得数据,在对php文件读取时,要采取base64编码)

3.zip://

大家看着zip就应当觉得是与压缩文件有关,该协议用于压缩流,条件:文件格式必须是压缩包格式,例子?file=zip:// /1.zip/phpinfo.php(绝对路径,文件中的文件名)

4.data://

数据流封装器,可以用来执行代码,和php://input差不多,但是当php被过滤时可以考虑;条件allow_url_fopen=On ,allow_url_include=On,举例:?file=data://,<?php phpinfo();
?file=data://text/plain,<?php phpinfo();
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

两者等价
(这里可能会有疑问,为什么少了?>,这个我也是翻了才知道,因为php中,写了;以后就默认结构完整,可以执行,加上也可以,但是可能会在进行base64编码的时候出现+导致报错,需要将其url编码成%2b)

讲解完了,接下来用ctfshow习题简单讲解下

1.

ctf任意文件包含漏洞简单讲解含php伪协议及习题

payload:?file=php://filter/convert.base64-encode/resource=flag.php,简简单单直接读取

2.ctf任意文件包含漏洞简单讲解含php伪协议及习题 

可以看到php会被替换掉,所以payload:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= 

上一篇:CTF练习题——社工-进阶收集,小明打了一局CTF追到了小美


下一篇:equalsIgnoreCase的使用