当前位置: 首页 > news >正文

Python实战:利用fofa API高效搜索网络资产

1. 为什么需要fofa API自动化搜索

第一次接触网络安全资产搜索时,你可能和我一样,都是手动在fofa官网输入查询语句。但很快就发现三个痛点:一是重复查询效率低下,二是结果导出步骤繁琐,三是无法与其他工具联动。这些问题在批量资产收集时尤为明显。

fofa提供的API接口完美解决了这些问题。通过Python脚本调用API,可以实现:

  • 定时自动执行:设置计划任务定期收集目标资产
  • 结果自动处理:直接输出结构化数据供其他工具使用
  • 复杂查询组合:动态生成查询语句比手动输入更灵活

我去年参与某企业安全评估项目时,需要监控300多个关键组件的暴露情况。如果手动操作,至少需要2人天的工作量。改用API自动化后,只需1小时就能完成全量扫描和报告生成。

2. 准备工作与环境配置

2.1 获取API认证信息

使用fofa API需要两个关键凭证:

  1. 注册邮箱:个人资料页显示的联系邮箱
  2. API Key:在[个人中心]-[API管理]处获取

这两个参数相当于访问凭证,需要像保护密码一样妥善保管。建议:

  • 不要直接写在脚本里
  • 使用环境变量或配置文件存储
  • 设置访问权限限制

2.2 安装Python依赖库

核心需要三个库,用pip一键安装:

pip install requests base64

各库的作用:

  • requests:发送HTTP请求获取API数据
  • base64:对查询语句进行编码转换
  • sys(Python内置):处理命令行参数

我习惯用virtualenv创建隔离环境:

python -m venv fofa_env source fofa_env/bin/activate # Linux/Mac fofa_env\Scripts\activate.bat # Windows

3. 核心代码实现详解

3.1 API请求构造

fofa API的基础请求格式如下:

api_url = 'https://fofa.so/api/v1/search/all?email={}&key={}&qbase64={}&size={}'

关键参数说明:

参数名是否必填示例值说明
emailuser@example.com注册邮箱
key32位字符串API密钥
qbase64dGl0bGU9ImxvZ2luIg==Base64编码的查询语句
size100返回结果数量(1-10000)

3.2 查询语句编码处理

fofa要求查询语句必须经过Base64编码。这里有个坑要注意:需要先转为bytes类型再编码。

错误写法:

query = "title=\"admin\"" base64.b64encode(query) # 报错!

正确做法:

query = "title=\"admin\"" encoded = base64.b64encode(query.encode('utf-8')).decode('utf-8')

3.3 完整脚本示例

这是我优化后的增强版脚本,新增了错误处理和进度显示:

import requests import base64 import sys import time def search_fofa(query, email, key, max_results=1000): api_template = "https://fofa.so/api/v1/search/all?email={}&key={}&qbase64={}&size={}" try: encoded_query = base64.b64encode(query.encode()).decode() url = api_template.format(email, key, encoded_query, max_results) print(f"[*] 正在查询: {query}") start = time.time() response = requests.get(url, timeout=30) if response.status_code != 200: raise Exception(f"API请求失败: {response.status_code}") data = response.json() if not data.get("error"): results = data["results"] print(f"[+] 找到 {len(results)} 条结果 (耗时:{time.time()-start:.2f}s)") return results else: raise Exception(f"API返回错误: {data.get('errmsg')}") except Exception as e: print(f"[-] 发生错误: {str(e)}") return None if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python fofa_search.py '查询语句' [输出文件]") sys.exit(1) query = sys.argv[1] output_file = sys.argv[2] if len(sys.argv) > 2 else f"{query.replace(' ', '_')}.txt" # 从环境变量获取凭证 import os email = os.getenv("FOFA_EMAIL") key = os.getenv("FOFA_KEY") if not email or not key: print("请设置FOFA_EMAIL和FOFA_KEY环境变量") sys.exit(1) results = search_fofa(query, email, key) if results: with open(output_file, "w") as f: for item in results: f.write(f"{item[0]}\n") print(f"结果已保存到 {output_file}")

4. 高级使用技巧

4.1 批量查询实现

实际工作中经常需要执行多个关联查询。我们可以改造脚本支持批量操作:

queries = [ 'title="管理后台"', 'body="admin"', 'port="8080"' ] for q in queries: results = search_fofa(q, email, key) if results: with open(f"{q.replace(' ', '_')}.txt", "w") as f: f.write("\n".join(r[0] for r in results))

4.2 结果去重处理

fofa可能返回重复结果,建议添加去重逻辑:

seen = set() unique_results = [] for item in results: if item[0] not in seen: seen.add(item[0]) unique_results.append(item)

4.3 异常处理与重试

网络请求不稳定时,建议实现自动重试机制:

max_retries = 3 retry_delay = 5 for attempt in range(max_retries): try: response = requests.get(url, timeout=30) break except requests.exceptions.RequestException as e: if attempt == max_retries - 1: raise print(f"请求失败,{retry_delay}秒后重试...") time.sleep(retry_delay)

5. 实战案例:监控暴露的Web服务

去年我帮某客户发现他们有一批测试环境的Jenkins服务暴露在公网。用这个脚本可以持续监控:

import schedule import time def job(): results = search_fofa('title="Jenkins" && port="8080"', email, key) if results and len(results) > 10: # 超过10个实例暴露 alert_admin(results) schedule.every(6).hours.do(job) while True: schedule.run_pending() time.sleep(60)

关键改进点:

  1. 使用schedule库定时执行
  2. 设置阈值自动告警
  3. 结果自动发送邮件通知

这个方案帮客户在3个月内将暴露服务减少了78%。自动化脚本的价值就在于把重复劳动转化为持续监控能力。

http://www.jsqmd.com/news/649253/

相关文章:

  • 终极指南:5步轻松永久备份你的QQ空间完整青春回忆 [特殊字符]
  • Jimeng LoRA保姆级教学:LoRA训练日志解析+关键指标(CLIP Score)可视化
  • KiCad核心算法解析:自动布线、DRC检查与3D渲染
  • 一键完整网页截图:Chrome扩展终极解决方案
  • 如何用 Coze Studio 快速构建 AI 智能体:一站式可视化开发完整指南
  • 2026届毕业生推荐的十大AI科研方案实测分析
  • Nunchaku FLUX.1 CustomV3完整指南:从镜像Pull→GPU驱动验证→ComfyUI访问→workflow加载
  • Devices.css维护与更新:如何保持项目长期稳定的完整策略
  • 如何3分钟将B站视频转为文字稿?这款免费工具让你效率提升10倍!
  • RimWorld模组管理终极方案:5分钟掌握RimSort高效管理技巧
  • Android实战进阶 - 单点登录与系统维护的全局拦截
  • 原神帧率解锁终极指南:轻松突破60帧限制,享受丝滑游戏体验
  • XML Notepad终极指南:3种免费安装方法+高效XML编辑技巧
  • 深入AMD Ryzen系统管理单元:SMUDebugTool技术架构与实战探索
  • Synology歌词插件:让群晖Audio Station秒变专业KTV系统
  • 自然语言处理设计思考
  • 14《深入解析CAN节点三大状态:主动错误、被动错误与总线关闭》
  • 保姆级教程:用Isaac Gym训练的双足机器人,如何无缝迁移到MuJoCo里跑起来(附完整代码)
  • 2026小红书数据采集实战:Selenium+API混合架构,含登录态维护与评论数据提取
  • 终极指南:如何用gumbo-parser快速打造专业的网页无障碍性检查工具
  • 终极PyTorch模型性能分析指南:THOP OpCounter实战教程
  • PotPlayer字幕翻译插件技术实现:基于百度翻译API的智能字幕处理架构
  • 飞书文档批量导出终极指南:三步搞定海量文档迁移
  • 3步快速备份你的QQ空间历史说说,让青春记忆永不丢失
  • git-cola深度体验:为什么这款Git GUI能成为开发者的首选工具
  • 革命性国际化库typesafe-i18n:彻底告别i18n类型错误
  • 2026最权威的十大AI科研助手推荐榜单
  • tao-8k Embedding实战:Python调用API生成向量并接入FAISS向量数据库
  • AI建站工具怎么选?一份给决策者的选型标准与对比指南
  • 如何快速重置JetBrains IDE试用期:专业开发者实战指南