file协议
中文意思:
本地文件传输协议
定义:
File协议主要用于访问本地计算机中的文件。
File协议基本的格式如下:
1 | file:///C:/file.txt //访问c盘下的file.txt文件 |
基本格式这里可以借助http网址来理解
http网址基本格式:
1 | http://ip地址:端口号/文件路径 |
因为file协议访问的是文件,并没有主机地址,所以就省去了host那部分就变成了最终上面的部分.
1 | file协议: |
curl支持file协议,我们接下来将借助curl工具讲解file协议的用法
首先在/etc目录下创建文件file.txt
1 | echo "hello file" >/etc/file.txt |
通过file协议访问
1 | curl file:///etc/file.txt |

Dict协议
定义:
词典网络协议,在RFC 2009中进行描述。它的目标是超越Webster protocol,并允许客户端在使用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。(摘自百度百科)
使用dict协议可以获取内网主机开放端口
通过dict协议,可以看出目标端口的指纹信息,通过返回的指纹信息,判断开启的服务.
1 | curl dict://192.168.159.131:80 探测目标主机80端口是否开放及其对应服务 |

dict协议的使用:
1 | 1. dict://serverip:port/命令:参数 |
php中filter协议
定义
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;
参数介绍:
名称 | 描述 | 备注 |
---|---|---|
resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
read参数值
1 | string.strip_tags: //将数据流中的所有html标签清除 |
示例
这里我们通过皮卡出靶场的ssrf漏洞题目进行讲解
看到题目打开的url
1 | http://192.168.159.132/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php |

我们可以通过php://filter协议来查看源文件内容;
首先我们在靶机当前目录下创建filter.php
内容为echo “Hello phpFilter”

然后我们通过构造payload远程访问filter文件
1 | http://192.168.159.132/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=filter.php |

返回一串编码,这串编码就是我们base64编码后的文件内容,
解码验证

当然我们可以通过filter协议构造恶意的payload访问服务器的隐私数据.
0x01:SSRF 漏洞描述
1 | SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的 |
SSRF漏洞原理
1 | SSRF 的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。 |

SSRF漏洞防御
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果 web 应用是去获取某一种类型的 - 文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。 - 禁用不需要的协议,仅仅允许 http 和 https 请求。可以防止类似于 file://, gopher://, ftp:// 等引起的问题 - 设置 URL 白名单或者限制内网 IP(使用 gethostbyname()判断是否为内网 IP) - 限制请求的端口为 http 常用的端口,比如 80、443、8080、8090 - 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
借鉴:实训讲义