知识点:
文件包含漏洞:https://blog.csdn.net/Monsterlz123/article/details/93964916
文件包含定义: 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。造成方便的同时,也留下了隐患。
文件包含常用函数:
require()#函数出现错误的时候,会直接报错并退出程序的执行 require_once()#只包含一次 include()#在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行 include_once()#只包含一次
原理: 在进行文件包含的时候,没有对参数进行严格的过滤
<?php $filename = $_GET['filename']; include($filename); ?> 如上述例子 在引用filename函数时,没有过滤,直接引用了这个函数
文件包含分类: 本地包含:可以进行一些本地的文件读取 远程包含:可以对外网上的文件进行读取
远程文件包含: PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。
条件
allow_url_fopen = On(是否允许打开远程文件) allow_url_include = On(是否允许include/require远程文件)
php伪协议: php伪协议本来是方便使用的,但如果存在包含漏洞,攻击者可以充分利用读取或写入一些文件 这里介绍几个常用的
php://filter(本地磁盘文件进行读取) php://input file://伪协议 (读取文件内容)
php://filter用法
?php://filter/convert.base64-encode/resource=xxx.php
通过Base64解密后
成功读取
file://伪协议 (读取文件内容) 通过file协议可以访问本地文件系统,读取到文件的内容
php://input 可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data” 的时候 php://input 是无效的。 用法:?file=php://input 数据利用POST传过去。
php://input(写入木马) 条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),(不开启会报错)就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。 如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。
php://input(读取post数据) 碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项
php://input(命令执行) 条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行
修复方式
过滤../ ../ 配置php.ini文件 都关闭allow_url_fopen 和 allow_url_include 设置白名单
重定向第一次请求和第二次请求非同一个请求
什么是重定向?
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。
有关重定向的其他补充:
https://blog.csdn.net/weixin_39934520/article/details/107775580
打开靶场
发现什么都没有,之后查看页面源代码 ,发现 一个.php文件
查看PHP文件,再查看该页面的源代码
又发现一个.php文件
再次查看该PHP文件
发现直接结束了,没有flag,并且./action.php文件直接跳转到end.php文件,所以可以确定存在重定向。
为了拦截action.php,我们可以使用BrupSuite来抓包重放
首先进行抓包
intercept is on:为拦截状态 intercept is off:为非拦截状态
抓包成功后进行重放包
发现一个secr3t.php文件
访问该文件源代码,得到一个字符串,flag放在了flag.PHP里
这是代码审计,即将file赋值给flag.php(利用文件包含,通过include函数来执行flag.php页面)
访问flag.php文件及其源代码,并没有发现flag
考虑使用PHP伪协议过滤器filter再次访问
构造payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
在这个payload里,convert.base64-encode
就是一个过滤器,而flag.php就是要过滤的数据流,也就是要读取的文件。
出现一堆字符串考虑base64解码
最终得到flag