SSRF绕过肯定要使用各种协议 今天主要学习的是gopher协议
定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它。
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议 限制:gopher协议在各个编程语言中的使用限制 注意:gopher协议中的curl低版本不支持 curl --version可以查看版本以及支持的协议
如果发起post请求,回车换行需要使用**%0d%0a**,如果多个参数,参数之间的&也需要进行URL编码
本地监听,Ubuntu发送请求 如果要在gopher中发送http的数据需要三步:
构造HTTP数据包URL编码、替换回车换行为%0d%0a发送gopher协议首先打开我们写的一个PHP代码
<?php echo "Hello ".$_GET["name"]."\n" ?>GET /php/ssrf/test.php HTTP/1.1 Host: 192.168.43.225
gopher编码后
curl gopher://192.168.43.225:80/_GET%20/php/ssrf/test.php%3fname=QLNU%20HTTP/1.1%0d%0AHost:%20192.168.43.225%0d%0A注意点:
1、问号(?)需要转码为URL编码,也就是%3f 2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a 3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束) POST包也和GET类似,主要就是编码问题 一般使用gopher协议来打redis,比如有一个redis未授权漏洞的话,dict协议就是一条一条的执行命令,而gopher协议则是一条命令就可以执行成功,不过gopher协议有很多的限制,在不支持gopher的情况下可以使用dict。
参考链接:https://zhuanlan.zhihu.com/p/112055947
