php://filter?
利用条件: 只是读取,所以只需要开启allow_url_fopen,对于allow_url_include不做要求 实现效果: 将文件中得数据进行base64加密之后再输出 用法: index.php?file(这里的file是传参)=php://fileter/read=convert.base64-encode/resource=xx.php
php://input
利用条件: 需要开启allow_url_include=on,对allow_url_fopen不做要求 用法: burp抓包,把GET请求修改为POST请求(右键数据包Change request method) index.php?file(这里的file是传参)=php://input 再在数据包最下面空白处接上要执行的代码例如<?php phpinfo(); ?> 原理: 当在页面中输入php://input此时需要读的就是在POST包中的请求体
(以上两种都是文件包含,第二种已经可以直接进行代码执行)
data:text/plain
条件: allow_url_include,allow_url_fopen参数都需要开启 用法一:?file(这里的file是传参)=data:text/plain<?php+执行内容?> 用法一在burp中使用的时候空格要使用+号,因为空格相当于是截断这个http协议
用法二:?file(这里的file是传参)=data:text/plain;base64,编码后的php代码 注意base64加密后的代码,不能有+号,否则会和url种的+编码冲突 (这里比如在base64编码<?php phpinfo();?>后出现的编码内带有+号,可以在可以加空格的地方加空格加到没有+号的存在,{比如phpinfo();和?之间加空格},再在burp中加入编码后的php代码发包 || 或者是在burp中直接将base64编码后的+经过url编码换成%2b)
zip://伪协议
条件: 使用zip协议,需要将#编码为%23,所以需要PHP的版本>=5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23 用法: ?file(这里的file是传参)=zip://压缩文件路径+压缩文件名#压缩文件内的子文件名 file(这里的file是传参)=zip://./1.zip%231.txt file(这里的file是传参)=zip://C:\phpstudy\WWW\haha\1.zip%231.txt 既可以用绝对路径,也可以用相对路径(上面第一条./是执行文件,但是我测试不加好像也可以) 另外:上面zip://后不一定要zip格式,把zip改成jpg使用同样的方法(文件后缀也要改) 思路:如果使用黑名单/白名单,可以通过找到文件包含的点尝试这种方式
修改后缀使用同样可以?
file://伪协议
file://可以用来访问本地文件系统,而且不受allow_url_fopen与allow_url_include的影响
用法:?file(这里的file是传参)=file://文件绝对路径
通过文件包含Getshell
1.首先找到日志文件存放位置
2.让日志文件插入PHP代码
3.包含日志文件
使用条件:
?httpd.conf文件注释CustomLog"logs/access.log" common
我们登录网页时会产生日志文件,下面以phpstudy_pro为例
向日志中写入<?php phpinfo();?> 后的效果
那么我们如何把phpinfo写入日志中,我们可以通过burp把?<?php phpinfo();?>写入日志文件中
这里又出现一个有意思的事情,这里成功写入日志,但是之前我们记得直接写空格会被截断。
这里的区别是,之前写的空格是交给服务器,服务器认为这里是协议需要截断,而这里写入是直接写入日志中,因此可以成功(大概是这个意思)
上面方法优点:不需要找到文件上传的点
缺点:需要找到日志文件存储路径
Session包含
利用条件:
session的存储位置可以获取。
1.通过phpinfo的信息可以获取到session的存储位置
过程:
创建一个session.php文件,写入:
<?php
session_start();
$_SESSION['a'] = 'haha.cn';
?>
尝试访问,抓包分析
那么PHPSESSID=cmh5itdmglieocec6l5nrmfu86,PHPSESSID后面这段内容是什么东西呢
实际上是一个临时文件,内容如下:
那么如果session可控,我们可以将php代码写入到session中
假如修改session.php代码
<?php
session_start();
$SESSION['a'] = $GET['input'];
?>
那么session的值会随着get请求的值发生变化
尝试在修改后的session中写入phpinfo
接下来不能直接访问sess_cmh5itdmglieocec6l5nrmfu86,找到之前文件包含的点
存在文件包含的文件为2.php
代码如下:
<?php if (isset($GET['page'])){ include $GET['page']; }else{ include "home.php"; } ?>
用之前的伪协议(因为sess_cmh5itdmglieocec6l5nrmfu86不能直接访问)
可以成功
session文件包含总结:
1.知道session存储位置
2.有一个可控的session参数位置
3.有一个文件包含的点
%00截断
文件上传中有%00截断,文件包含也有
/etc/passwd%00
需要magic_quotes_gpc=off(在php.ini中)
PHP小于5.3.4有效
复习
文件包含定义:
如果说使用文件包含的路径是攻击者可控的话,此时我们可以通过控制参数变量从而能包含本不在开发者意愿之内的文件,从而能包含本不在开发者意愿之内的文件
文件包含相关的函数:
include? ? ? ? include_once? ? ? ? reqquire? ? ? ? require_once
incluede和require的区别?
include当发现文件无法包含或者是不存在该文件时,会抛出错误但是可以继续执行下面的代码
require当发现文件无法包含或者是不存在该文件时,此时会抛出致命错误,从而后面代码无法执行
分类的话??
本地文件包含:包含服务器端的文件
远程文件包含:包含远程url的文件
? ? ? ? 远程文件包含需要开启allow_url_fopen、allow_url_include
?文件包含的利用:
1.配合文件上传漏洞进行getshell
2.包含日志getshell
3.包含session? getshell
4.读取配置文件
? ? ? ? php://filter输出的内容会以base64编码的形式输出
? ? ? ? php://input把请求包中的请求内容部分全部执行
? ? ? ? data:text/plain,<?php 代码?>
? ? ? ? data:text/plain;base64,base64编码后的代码
? ? ? ? zip协议 php>=5.3.0
? ? ? ? zip://路径(绝对和相对都可以)%23文件名
? ? ? ? file协议
? ? ? ? file://绝对路径? ? ? 多个/也可以
????????
文件包含修复办法
PHP中使用open_basedir配置限制访问在指定的区域
过滤.(点)/(反斜杠)\(反 斜杠)? ../../../
禁止服务器远程文件包含(allow_url_fopen,allow_url_include,off)
包含的参数值不要用户可控
|