浅谈php伪协议的运用

(133条消息) PHP Filter伪协议Trick总结_php伪协议rot13的用法_swtre33的博客-CSDN博客

php死亡exit()绕过 - xiaolong's blog (xiaolong22333.top)

0x00ctf中常见的伪协议种类

  1. CTF比赛中,常常会使用PHP伪协议来进行一些有趣的挑战。PHP伪协议是一种特殊的URL格式,用于在PHP代码中执行某些特定的操作。以下是一些常见的PHP伪协议:
  2. 1. `php://input`: 该伪协议允许将HTTP请求的主体作为输入流读取,通常用于读取POST请求的数据。
  3. 2. `php://filter`: 通过该伪协议可以对输入输出进行过滤。常见的用法是进行base64编码和解码,例如`php://filter/convert.base64-encode/resource=index.php`
  4. 3. `data://`: 该伪协议用于将数据嵌入到脚本中,常用于在代码中包含一些二进制数据或特定字符串。
  5. 4. `expect://`: 该伪协议可以用于执行代码。在一些CTF挑战中,可能会使用该伪协议来绕过某些过滤或实现代码执行。
  6. 5. `zip://`: 可以用来读取ZIP压缩文件中的内容,语法类似于`zip://path/to/file.zip#file_inside_zip.txt`
  7. 这些伪协议在CTF挑战中经常用于利用漏洞、绕过限制或进行特殊操作。然而,请注意在实际开发中避免使用这些伪协议,因为它们可能会引起安全风险。

0x01php://filter

在CTF比赛中,php://filter 是一个常用的PHP伪协议,用于在PHP代码中进行数据过滤和处理。它允许我们通过对输入输出进行过滤,利用PHP的输入输出流来执行一些有趣的操作。这在某些CTF挑战中可能会用到,通常是为了绕过限制、执行代码或读取敏感文件等,“php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取,获取源码”。

基本语法如下

  1. php://filter/<action>/resource
  • <action>:表示要对数据执行的过滤操作。常见的过滤操作有:

    • read: 读取资源数据,并对其进行过滤处理。
    • convert.<to_encoding>.<from_encoding>:对数据进行编码转换。
    • string.<operation>:对字符串执行特定操作,比如 base64 编码、URL 编码等。
  • <resource>:表示要进行过滤的资源,通常是文件路径或URL,resource是必选的选项

常用的php://filter读取姿势

  1. 1 php://filter/read=convert.base64-encode/resource=index.php
  2. 2 php://filter/convert.base64-encode/resource=index.php #有时候read被过滤
  3. 3 php://filter/read=string.rot13/resource=index.php #将字符用rot编码显示
  4. 4 php://filter/read=string.touppe/resource=index.php #将字符大写显示
  5. 5 php://filter/read=string.tolower/resource=index.php #将字符小写显示
  6. 6 php://filter/read=convert.iconv.*/resource=index.php

过滤器

字符串过滤器

以string开头对数据进行字符串对于的处理常见的有rot13touppertolowerstrip_tags.....

rot13(回转13)原理上来说是对26个小写字母以及26个大写字母进行操作,对原有字母的ASCII值 + 13或者ASCII-13,然后找到计算后的ASCII值对应的字母。通过这样的规则将一个字母替换为另一个字母,从而达到加密的目的。

而strip_tags是对数据流进行strip_tags函数的处理,该函数功能为剥去字符串中的 HTMLXML 以及 PHP 的标签,简单理解就是包含有尖括号中的东西。

rot13,与strip_tags常用于死亡绕过

转换过滤器

主要含有三类,分别是base64的编码转换、quoted-printable的编码转换以及iconv字符编码的转换。该类过滤器以convert开头。

 Quoted-printable可译为可打印字符引用编码,可以理解为将一些不可打印的ASCII字符进行一个编码转换,转换成=后面跟两个十六进制数,例如:
  1. file_get_contents("php://filter/read=convert.quoted-printable-encode/resource=data://text/plain,m1sn0w".chr(12));
  2. # 输出为m1sn0w=0C

iconv过滤器也就是对输入输出的数据进行一个编码转换,其格式为convert.iconv.<input-encoding>.<output-encoding>或者convert.iconv.<input-encoding>/<output-encoding>,表达的意思都是相同的,即将输入的字符串编码转换成输出指定的编码,例如:

  1. file_get_contents("php://filter/read=convert.iconv.utf-8.utf-16/resource=data://text/plain,m1sn0w".chr(12));

用php://filter进行死亡绕过写入后门

死亡绕过的常见种类

  1. 1 file_put_contents($filename,"<?php exit();".$content);
  2. 2 file_put_contents($content,"<?php exit();".$content);
  3. 3 file_put_contents($filename,$content . "\nxxxxxx");

第一种情况

这里有两个可控的变量,$filename和$content,发现在我们写入的后门会立刻被exit()函数退出,我们得想办法进行绕过,以下是一些常见的绕过方法

base64-decode绕过

这种绕过方法利用了base64的特性,我们在用base64编码时3个字符组,不足则使用=补足,而在解码时4个字符一组,同时base64在解码时会首先将不属于base64编码范围的字符置空再编码,

等价于

preg_replace('/[^a-zA-Z0-9+/=]/i'," ",$content)

对<?php exit();进行解码后只剩下了phpexit这里只有7个字符,base64以4个为一组的解码方式我们需要再$content的首部加一个占位符防止后面的base64出现乱码payload如下

  1. $filename=php://filter/write=convert.base64-decode/resource=shell.php
  1. $content=aPD9waHAgcGhwaW5mbygpOz8+
  1. file_put_contents($filename,"<?php exit();".$content);
    写入如下:

string.rot13绕过

此绕过的缺点是无法去掉<? ;>等特殊字符  

成功写入

局限:如果开启了短标签的话,前面内容就会解析,导致代码错误

过滤器嵌套绕过

  1. 1 $filename = "php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";
  2. 2 $content = "?>PD9waHAgcGhwaW5mbygpOz8+";

strip_tags先把php标签过滤掉,再用convert.base64-decode对我们的输入解码写入后面

限制:string.strip_tags在php7.3.0以上的环境下会发生段错误,从而导致无法写入,php5则不受影响

第二种情况

  1. file_put_contents($content,"<?php exit();".$content);

这种情况下我们输入的文件名和拼接的内容是相同的,在这种情况我们可以利用php//filter在遇到不认识的协议后只出现警告,进行写入,由于base64解码需要特定的字节数所以无法用base64绕过

rot13绕过:

浅谈php伪协议的运用的更多相关文章

  1. 浅谈传输层协议TCP和UDP

    在当今因特网的层次结构中,传输层的协议主要有两种,其一为Transmission Control Protocol,即TCP:其二为User Datagram Protocol,即UDP. 1.TCP ...

  2. 测试那些事儿—浅谈TCP/IP协议

    TCP/IP协议是一系列网络协议的总和,是构成网络通信的核心骨架. TCP/IP的工作原理通俗的讲就是一个主机的数据要经过哪些过程才能发送到对方的主机上. TCP/IP协议采用四层结构,分别为应用层, ...

  3. 浅谈MySQL压缩协议细节--从源码层面

    压缩协议属于mysql通讯协议的一部分,要启用压缩协议传输功能,前提条件客户端和服务端都必须要支持zlib算法,那么,现在有个问题,假如服务端已经默认开启压缩功能,那原生客户端在连接的时候要如何才可启 ...

  4. 浅谈基于WOPI协议实现跨浏览器的Office在线编辑解决方案

    如今,基于Web版的Office 在线预览与编辑功能已成为一种趋势,而关于该技术的实现却成为了国内大部份公司的技术挑战,挑战主要存在于两方面: 其一:目前国内乃至微软本身,还没有相对较为完善的解决方案 ...

  5. 浅谈 TCP、IP、DNS 和 HTTP 的关系

    一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...

  6. 浅谈HTTPS以及Fiddler抓取HTTPS协议

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  7. 【转】 浅谈Radius协议

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  8. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  9. 浅谈通信网络(三)——TCP/IP协议

    简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...

  10. 浅谈HTTPS以及Fiddler抓取HTTPS协议(摘抄)

    一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...

随机推荐

  1. scrapy框架简介

    一.安装scrapy环境 -mac或linux:pip install scrapy -windows: 1.pip install wheel 2.pip install twinsted 3.pi ...

  2. MySQL WorkBench更换界面成中文的方法

    菜单页面更换 文章目录 菜单页面更换 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 总结 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 具体安装 ...

  3. 大米cms爆破后台及支付逻辑漏洞

    又找到个网站挖洞,我来康康. 大米手机是个什么鬼手机??看一下吧 这个支付页面好熟悉,可能存在支付逻辑漏洞,咱们用burp改个包看看. 先支付一个看看 把包里那个=1改成0试试~ 证实确实存在支付逻辑 ...

  4. 2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨

    2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨 ...

  5. 2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error... func main() { var m sync.Mute

    2022-07-10:以下go语言代码输出什么?A:A,B:B:A,C:A,fatal error:D:fatal error- func main() { var m sync.Mutex fmt. ...

  6. SQL Server:User, group, or role 'iemis' already exists in the current database.

    --最新的解决方法 --先创建用户帐户,不进行授权,然后通过下面的SQL语句将该用户帐户关联至对应的数据库用户.优点是避免了重新授权的操作. USE tempdbEXEC sp_change_user ...

  7. EL表达式访问JavaBean

    前景提要 刚才有个朋友问我,赵大哥这个实验怎么做?我说哪个实验,给我发了几张截图.我一看,嗷,原来是今天,有个Java实验啊,他说大哥,能不能教教我,我说可以.我一说 他 啪的就站起来了, 很快啊 , ...

  8. # 代码随想录算法训练营Day31 贪心算法| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

    代码随想录算法训练营 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 ...

  9. 使用ptrace将标准输出重定位到文件

    首先使用PTRACE_SYSCALL获取到系统调用号,如果是write则将文件描述符从标准输出变为我们打开的文件 #include <stdio.h> #include <fcntl ...

  10. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...