SSRF4 SSRF-gopher 协议扩展利用-向内网发起 GET/POST 请求
一.Gopher简介
Gopher在HTTP协议前是非常有名的信息查找系统,但是WWW万维网出现之后 Gopher逐渐
没落,但是在SSRF漏洞中Gopher协议让洞利用更加灵活,利用此协议可以对
ftp,memcache,mysql,telnet,redis,等服务进行攻击,可以构造发送GET,POST请求包。
二.Gopher协议语法的格式
gopher://<host>:<port>/<gopher-path>/_后面接 TCP 数据流,这里千万注意这个标红的下划
线,为什么呢我们进行一个小实验就知道了:
准备两台kali:我一台:192.168.112.155 另一台:192.168.112.128
首先用192.168.112.128进行监听4444端口:
然后用192.168.112.155发送gopher协议请求:
curl gopher://192.168.1.53:4444/abcd
然后我们查看192.168.112.128所接收到的数据:
发现只有bcd,可我们传递的明明是abcd,a为什么不见了?
因为默认"/"后的第一个字符无效,所以不能在第一个字符那里传递数据。
一般我们可以在"/"后面添加一个下划线"_"代替舍去。
三.Gopher 发送 GET 请求
首先我们写一个简单的get页面:
我们访问:
http://192.168.112.12/get.php
下面我们用burpsuite 获取 get 请求数据包:
我们只需要提取前两行:
GET /get.php?name=free HTTP/1.1
Host: 192.168.112.12
进行URL编码:GET%20%2Fget.php%3Fname%3Dfree%20HTTP%2F1.1%0AHost%3A%20192.168.112.12
注意我们在URL编码时有以下规则:
1.我们要在前面加上"_",我们上面已经提到过第一个字符会被吃掉。
2.空格以及冒号换行等特殊字符需要转换为 URL 编码,注:/不要进行 URL 编码,换行符通过
工具在进行 URL 编码时会被编码成%0A,但是在 HTTP 请求中正确的换行符应该是%0D%0A,所
以工具编码后需要手工替换%0A 为%0D%0A,并且在 HTTP 请求也需要以%0D%0A 来作为结
尾。
所以经过以上规则加工后的gopher请求为:
然后我们用kali:
curl gopher://192.168.112.12:80/GET%20%2Fget.php%3Fname%3Dfree%20HTTP/1.1%0D%0AHost%3A%20192.168.112.12%0D%0A
就可以看到完整的get请求了。
四.Gopher 发送 POST 请求
首先创造post请求页面
依旧访问http://192.168.112.12/post.php
可以看到一切正常:
然后我们依旧利用burpsuite 获取 post 请求数据包。
POST 数据包必须要有的 5 行配置,GET 只需要前两行,但是为了方便我们就全部把POST都编
码了,这里我们用一个python脚本进行编码:
import urllib.parse
req =\
"""POST /post.php HTTP/1.1
Host: 192.168.1.53
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
name=free
"""
#对空格、冒号、换行等特殊符号进行url编码
xuegod = urllib.parse.quote(req)
#将换行符替换为%0D%0A
new = xuegod.replace('%0A','%0D%0A')
#result = '_'+urllib.parse.quote(new)
#在结果前面添加_gopher会吃掉第一个字符。
result = '_'+new
#打印编码后的请求
print(result)
我们把他放在kali里:注意将我们bp抓到的post请求体放在"""后面:
然后python gopher.py就得到编码后的了:
然后我们进行拼接
gopher://192.168.112.12:80/****
再在kali中进行curl gopher://192.168.112.12:80/****
然后我们就得到了一个完整的请求头和结果。