当前位置: 首页 > article >正文

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伪协议来列出当前目录下的文件。

绕过 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(分割不加后缀名)

http://www.kler.cn/a/328321.html

相关文章:

  • 无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
  • Django数据库迁移与反向迁移处理方案分析
  • 进程其他知识点
  • 量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
  • Jmeter 如何导入证书并调用https请求
  • django-ninja 实现cors跨域请求
  • 【优选算法】(第三篇)
  • IDEA 系列产品 下载
  • 前后端传参
  • Android 已经过时的方法用什么新方法替代?
  • 通信工程学习:什么是SMTP简单邮件传输协议
  • windows C++-计划组
  • 机器学习西瓜书——线性判别分析LDA
  • 使用PyTorch实现自然语言处理:从基础到实践
  • Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
  • QEMU使用Qemu-Guest-Agent传输文件、执行指令等
  • http增删改查四种请求方式操纵数据库
  • k8s 1.28.2 集群部署 ingress 1.11.1 包含 admission-webhook
  • Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
  • 开发微信小程序 基础03
  • scala 2.12 error: value foreach is not a member of Object
  • 低代码用户中心:构建高效便捷的用户管理平台
  • VUE 开发——AJAX学习(二)
  • 51单片机学习第五课---B站UP主江协科技
  • 【网络安全】消息鉴别
  • 五.海量数据实时分析-FlinkCDC+DorisConnector实现数据的全量增量同步