首页 > 编程语言 >浅谈php伪协议的运用

浅谈php伪协议的运用

时间:2023-07-30 21:48:26浏览次数:36  
标签:编码 convert resource 浅谈 base64 filter 运用 php

浅谈php伪协议的运用

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

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

0x00ctf中常见的伪协议种类

在CTF比赛中,常常会使用PHP伪协议来进行一些有趣的挑战。PHP伪协议是一种特殊的URL格式,用于在PHP代码中执行某些特定的操作。以下是一些常见的PHP伪协议:

1. `php://input`: 该伪协议允许将HTTP请求的主体作为输入流读取,通常用于读取POST请求的数据。

2. `php://filter`: 通过该伪协议可以对输入输出进行过滤。常见的用法是进行base64编码和解码,例如`php://filter/convert.base64-encode/resource=index.php`。

3. `data://`: 该伪协议用于将数据嵌入到脚本中,常用于在代码中包含一些二进制数据或特定字符串。

4. `expect://`: 该伪协议可以用于执行代码。在一些CTF挑战中,可能会使用该伪协议来绕过某些过滤或实现代码执行。

5. `zip://`: 可以用来读取ZIP压缩文件中的内容,语法类似于`zip://path/to/file.zip#file_inside_zip.txt`。

这些伪协议在CTF挑战中经常用于利用漏洞、绕过限制或进行特殊操作。然而,请注意在实际开发中避免使用这些伪协议,因为它们可能会引起安全风险。

0x01php://filter

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

基本语法如下

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

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

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

1 php://filter/read=convert.base64-encode/resource=index.php
2 php://filter/convert.base64-encode/resource=index.php   #有时候read被过滤
3 php://filter/read=string.rot13/resource=index.php  #将字符用rot编码显示
4 php://filter/read=string.touppe/resource=index.php   #将字符大写显示
5 php://filter/read=string.tolower/resource=index.php   #将字符小写显示
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字符进行一个编码转换,转换成=后面跟两个十六进制数,例如:
file_get_contents("php://filter/read=convert.quoted-printable-encode/resource=data://text/plain,m1sn0w".chr(12));
# 输出为m1sn0w=0C

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

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

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

死亡绕过的常见种类

1 file_put_contents($filename,"<?php exit();".$content);
2 file_put_contents($content,"<?php exit();".$content);
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如下

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

string.rot13绕过

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

成功写入

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

 过滤器嵌套绕过

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

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

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

第二种情况

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

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

rot13绕过:

 

 

 

 

标签:编码,convert,resource,浅谈,base64,filter,运用,php
From: https://www.cnblogs.com/Curitaos/p/17590034.html

相关文章

  • 浅谈 dijkstra 与其它文章并没有谈到的一些问题
    讲一个小故逝今天做到了一道很典的题目P1875,我发现我其实并不太会,然后在我看完了题解剽题解的屑以后,我发现我对dijkstra的理解仅仅停留在它的过程,而没有深入挖掘dijkstra的正确性以及它的本质等等。所以这篇文章会从另一个角度来看看dijkstra。也许这是dijkstra的本质吧,还......
  • 浅谈SQL注入及其防御方法
    昨晚跟学生们在群里讨论到什么是SQL注入的时候,硬挤出来了一个比喻.码字不易,特整理记录如下.  首先,电脑里面的语言分两种,编译型,解析型(脚本型).比如PHP就是解析型,C就是编译型.由于SQL语句可以在这两类语言下执行,所以为了充分明白是什么导致了SQL注入漏洞,我......
  • PHP调用API接口的方法及实现
    随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方法及实现过程。一、API接口简介API(Applica......
  • PHP调用API接口的方法及实现
    随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方法及实现过程。一、API接口简介API(Appl......
  • PHP8的数据类型-PHP8知识详解
    在PHP8中,变量不需要事先声明,赋值即声明。不同的数据类型其实就是所储存数据的不同种类。在PHP8.0、8.1中都有所增加。以下是PHP8的15种数据类型:1、字符串(String):用于存储文本数据,可以使用单引号或双引号来定义字符串。2、整数(Integer):用于存储整数值,可以是正数、负数或零。3、浮点数(F......
  • 浅谈数据库分库分表
    目录1.分库分表是什么2.为什么进行分库分表3.有哪些解决方案4.总结本文主要介绍数据库分库分表相关的基础知识,包括分库分表是什么,为什么要分库分表,以及有哪些解决方案。1.分库分表是什么数据库分库分表,用英文表示是"databasesharding"or"databasepartitioning"。分库分表......
  • PHP8的标记风格-PHP8知识详解
    欢迎来到PHP服务网学习PHP8的知识详解系列教程,本文学习的是PHP8的标记风格,本文教程纠正了很多网站的错误知识,补充了很多教程网站的遗漏之处,虽然很多网站的文章标题也是PHP标记风格。但是很多教程却不适合PHP8的版本了。当PHP8解析一个文件时,PHP8会寻找起始标记和结束标记,也就是<?......
  • PHP8的注释-PHP8知识详解
    欢迎你来到PHP服务网,学习《PHP8知识详解》系列教程,本文学习的是《PHP8的注释》。什么是注释?注释是在程序代码中添加的文本,用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理,而是用于帮助程序员理解代码。在大多数编程语言中,注释以特定的语法结构或......
  • WEB漏洞—反序列化之php&java(上)
    PHP反序列化原理:---未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。---其实跟文件解析差不多,都是由于传递的恶意参数被执行(序列化和反序列化相当于加解密过程)---在反序列化的过程中自动触发了某些魔术方......
  • PHP8开发工具VS Code的安装-PHP8知识详解
    作为PHP8的开发工具有很多,具有IDE功能的有phpstorm、VisualStudioCode、SublimeText、NetBeans、Eclipse、Codelobster、PHPDesigner等,当然还有很多轻量的工具,比如Notepad、Editplus等。本文给你介绍的是万能编辑器VisualStudioCode,简称VSCode。我为什么选择VisualStudioC......