
1. 從“搜不到”到“精準定位”為什么你需要掌握FOFA語法做安全研究、資產測繪或者網絡運維的朋友肯定都遇到過這樣的場景你想找某個特定版本的Web服務器或者想批量發現使用了某個有漏洞組件的網站。用通用搜索引擎搜出來的結果要么是廣告要么是無關的論壇討論真正能用的資產信息寥寥無幾。這時候一個專業的網絡空間搜索引擎就顯得至關重要而FOFA正是這個領域的佼佼者。FOFA不像百度、谷歌那樣索引網頁內容它爬取和索引的是互聯網上設備的“指紋”。簡單來說它能看到一個IP地址開放了哪些端口跑著什么服務比如是Nginx 1.18還是Apache Tomcat 9.0網站標題是什么用了什么框架比如ThinkPHP、Spring Boot甚至返回的HTTP響應頭里有什么特殊字段。這些信息構成了網絡資產的“畫像”。但FOFA的強大之處不止于此真正讓它從“好用”變成“神器”的是其一套強大而靈活的搜索語法。這套語法就像給你的偵察任務配上了一把高精度狙擊槍而不是一把霰彈槍。很多人剛開始用FOFA可能就只會搜個“title‘后臺管理’”這當然有用但效率極低會混入大量無關結果。掌握語法后你可以進行極其復雜的組合查詢例如“查找所有在中國境內、使用ThinkPHP 5.0框架、且標題中包含‘管理’二字的網站同時排除掉某個特定云服務商的IP段”。這種精準度是傳統搜索無法想象的。接下來我就結合自己多年的使用經驗為你系統梳理FOFA最核心、最實用的搜索語法并分享一些能直接提升效率的實戰技巧和避坑指南。2. FOFA搜索語法的核心組件與邏輯解析FOFA的搜索語法可以理解為一種“聲明式”查詢語言你通過組合不同的“字段”和“運算符”來告訴搜索引擎你的精確需求。理解其核心組件是寫出高效查詢語句的第一步。2.1 基礎字段你要搜索什么“屬性”FOFA將網絡資產的各種特征抽象為不同的字段。以下是最常用、最核心的一批字段你需要像背單詞一樣熟悉它們主機/網絡相關字段host 搜索指定域名或主機名。例如hostfofa.info會搜索包含該域名的主機。支持通配符如host*.example.com。ip 搜索指定IP地址或CIDR網段。這是進行區域或特定網絡范圍搜索的關鍵如ip220.181.38.0/24或ip192.168.1.1。country/region/city 按國家、地區、城市進行地理定位搜索。例如countryCN搜索中國的資產cityBeijing搜索北京的資產。這里有一個關鍵點FOFA的地理位置數據主要基于IP的GeoIP數據庫對于使用了CDN如Cloudflare、阿里云CDN的網站其地理位置信息可能是CDN節點的位置而非真實服務器位置。在追蹤特定目標時需要注意這一點。asn 按自治系統號搜索。這對于追蹤屬于某個特定ISP、云服務商或大型企業網絡的資產非常有效。例如asnAS45102阿里云。服務與協議相關字段port 搜索開放特定端口的服務。例如port80找HTTP服務port443找HTTPS服務port3389找可能開放的遠程桌面。protocol 搜索使用特定協議的服務如protocolftp。banner 這是極其強大的一個字段。它搜索服務連接后返回的標識信息通常是TCP/UDP服務建立連接后發送的第一條消息。例如SSH服務的banner會包含“SSH-2.0-OpenSSH”FTP服務會返回“220 (vsFTPd 3.0.3)”。通過banner字段你可以找到特定軟件及其版本例如bannerApache/2.4.41。Web應用特征字段title 搜索HTML頁面title標簽中的內容。這是最直觀的搜索方式之一例如title登錄、titleDashboard。header 搜索HTTP響應頭中的內容。很多應用框架、服務器、安全設備會在HTTP頭中留下特征。例如headerThinkPHP、headerWAF/2.0。body 搜索HTTP響應正文即網頁HTML源碼中的內容。可以用它來搜索特定的字符串、注釋、JS路徑等。例如bodyPowered by WordPress。server 搜索HTTP響應頭中Server字段的值。這直接指明了Web服務器類型和版本如servernginx/1.18.0。cert 搜索SSL/TLS證書中的信息。證書里包含了域名、組織名稱、地理位置等豐富信息。例如certGoogle可以找到使用Google簽發證書的資產cert*.alibaba.com可以找到阿里云相關子域。2.2 核心運算符如何組合你的條件掌握了字段下一步就是學習如何用運算符將它們連接起來構建復雜的邏輯。等于 (): 精確匹配。title管理員登錄只匹配標題完全等于該字符串的資產。正則匹配 (~): 使用正則表達式進行模糊匹配功能強大但需謹慎使用性能開銷較大。例如title~管理.*系統可以匹配“管理系統”、“管理后臺系統”等。包含 (like): 字符串包含匹配。title~login會匹配標題中包含“login”這個詞的所有資產不區分大小寫。這是最常用的模糊匹配方式。不等于 (!) / 不包含 (!~): 排除邏輯。當你需要過濾掉大量無關結果時非常有用。例如title~管理 title!~登錄可以找到標題含“管理”但不含“登錄”的資產。邏輯與 (): 必須同時滿足所有條件。port80 title~后臺表示找80端口開放且標題包含“后臺”的資產。邏輯或 (||): 滿足任意一個條件即可。server~nginx || server~apache查找使用Nginx或Apache的服務器。括號(): 改變運算優先級構建復雜邏輯。例如(title~admin || title~manage) countryUS查找在美國且標題包含admin或manage的資產。2.3 特殊語法與高級技巧除了基礎字段和運算符FOFA還提供了一些“語法糖”和高級功能能讓你事半功倍。domain字段 這是一個聚合字段當你搜索domainsina.com.cn時FOFA會自動幫你搜索與該主域名相關的所有子域名、IP上的資產。這比單純用host字段更全面。is_honeypot字段 用于判斷資產是否為蜜罐。is_honeypottrue可以篩選出被標記為蜜罐的資產在攻防演練或敏感搜索時用于規避風險。但請注意蜜罐識別并非100%準確此字段僅供參考。before/after 時間范圍搜索。用于查找在特定時間點之前或之后被FOFA收錄的資產。例如after2023-01-01 before2023-12-31查找在2023年被發現的資產。這在追蹤新暴露的資產或進行歷史分析時有用。is_ipv6 篩選IPv6資產。is_ipv6true。os 操作系統篩選。如oswindows或oslinux。這個字段的準確性依賴于FOFA對資產指紋的識別能力。3. 實戰場景從基礎查詢到復雜狩獵理解了語法我們來看如何在實際工作中應用。下面我將通過幾個由淺入深的場景展示如何構建查詢語句。3.1 場景一快速資產普查與統計假設你是一名安全工程師需要對你公司example.com的互聯網暴露面進行一次快速普查。基礎普查domainexample.com這條語句會列出所有與example.com主域名相關的資產包括www.example.com、mail.example.com、oa.example.com等各種子域名以及這些域名解析到的服務器IP上的其他服務如果FOFA爬取到了的話。這是了解資產廣度的第一步。細化分析找官網和主要業務host*.example.com (title~公司名 || title~首頁)。 通過標題過濾出可能的主站。找后臺管理系統domainexample.com (title~管理 || title~admin || title~login || title~后臺)。 注意這里用domain而不是host是為了不漏掉那些可能部署在獨立子域名或IP上的后臺。識別技術棧domainexample.com server~nginx查看有多少資產用了Nginx。domainexample.com header~ThinkPHP查看有多少用了ThinkPHP框架。domainexample.com body~vue.js查看前端是否使用了Vue。統計與導出 在FOFA的搜索結果頁面你可以利用其統計功能快速查看domainexample.com下各個端口port、服務器類型server、地理位置country的分布情況。這個功能對于生成一份快速的資產報告非常有幫助。3.2 場景二漏洞影響范圍評估與應急響應這是安全從業者的高頻場景。當某個開源組件例如Apache Log4j2, Spring Framework爆出高危漏洞CVE-XXXX-XXXX時你需要快速評估自己單位或客戶資產是否受影響。假設漏洞影響Spring Framework特定版本其特征是在HTTP響應頭或錯誤頁面中包含Spring Framework及版本號。基礎影響面搜索headerSpring Framework body5.3.0。 這里結合header和body來精確鎖定版本。但版本信息可能出現在不同地方所以更穩妥的是(header~Spring || body~Spring) (body~5.3.0 || body~5.3.1) 將受影響的版本號用||連接。結合資產歸屬細化 如果你手里有公司的IP段列表可以進一步精確(ip203.0.113.0/24 || ip198.51.100.0/24) header~Spring。 這樣結果只限于你關心的網絡范圍。排除干擾項 有時候一些WAF或云防護產品會在響應頭里添加“Spring”字樣雖然不常見。為了更精確可以嘗試搜索更具體的指紋。例如Spring Boot Actuator端點通常有固定路徑body~/actuator body~spring-boot。 通過多個特征組合能有效提高準確率。一個非常重要的經驗在漏洞應急時不要只依賴一個搜索語句。應該根據漏洞POC或EXP中暴露出的獨特指紋如特定的URL路徑、參數、錯誤信息、Jar包文件名來構建多個不同的查詢語句交叉驗證確保沒有遺漏。例如對于Log4j2漏洞除了搜索JndiLookup.class還可以搜索${jndi:ldap://這類在日志或頁面中可能被記錄的字符串特征盡管實際利用中可能看不到。3.3 場景三紅隊演練中的信息收集與目標定位在授權攻防演練中信息收集的深度直接決定后續攻擊的廣度。FOFA是前期“網絡空間測繪”階段的核心工具。定位目標組織資產方法A通過證書。大公司通常使用統一的SSL證書。certTarget Corp或cert*.target.com可能會發現大量未在公開域名列表中備案的資產如內部系統對外測試環境。方法B通過ASN。如果目標主要業務托管在某個云服務商或擁有自己的IP段asnASxxxx是地毯式搜索的利器。方法C通過特定技術棧。如果知道目標公司偏愛用某款CMS如WordPress或中間件如WebLogic可以bodyPowered by WordPress countryCN regionShanghai結合地理信息縮小范圍。尋找薄弱點入口常見管理入口title~登錄 port443找HTTPS的管理登錄頁。title~dashboard server~nginx。未授權訪問接口 搜索一些常見的未授權訪問路徑。例如Redis未授權port6379 bannerredis Jenkins未授權titleDashboard [Jenkins]或bodyJenkins Docker API未授權port2375 bannerHTTP。老舊版本與組件serverApache/2.4.1或servernginx/1.0.0直接搜索已知存在漏洞的舊版本服務。bodyStruts 2.0尋找老舊的Struts2框架。構建組合查詢精準狩獵 假設你想找可能存在的致遠OA系統并且希望是在北京地區、非云WAF防護的資產以增加攻擊測試的成功率。(title致遠互聯 || body/seeyon/) countryCN cityBeijing header!~cloudflare header!~WAF ip!10.0.0.0/8 ip!172.16.0.0/12 ip!192.168.0.0/16這個查詢的邏輯是(title致遠互聯 || body/seeyon/) 核心指紋識別致遠OA。countryCN cityBeijing 地理定位。header!~cloudflare header!~WAF 排除帶有Cloudflare和常見WAF標識的資產這些資產通常有額外的防護。ip!10.0.0.0/8 ip!172.16.0.0/12 ip!192.168.0.0/16 排除私有IP地址段這些通常是內網穿透或錯誤配置的結果并非真正的公網目標。4. 高效使用FOFA的避坑指南與性能優化即使語法熟練如果不注意一些細節也容易陷入低效查詢或結果不準的困境。下面分享一些實戰中積累的經驗和教訓。4.1 避免性能陷阱讓你的查詢更快更準慎用body字段的全模糊搜索body~test這種查詢會觸發全表掃描速度慢且消耗積分多。盡量結合其他條件縮小范圍例如port80 body~specific_keyword。更好的方式是先通過title、header、server等字段定位到一批資產再對這批資產進行body字段的二次篩選如果FOFA客戶端支持的話。正則表達式是“性能殺手”~運算符雖然強大但極其消耗資源。除非必要否則優先使用精確匹配或~包含匹配。例如想找版本號5.x用body~5.比body~5\.[0-9]性能好得多。明確搜索意圖避免過度寬泛 搜索port80會返回數億結果這沒有實際意義。永遠嘗試從最特異的指紋開始。例如先搜bodyApache Struts 2 Showcase如果結果太少再逐步放寬條件如header~Struts。合理使用“排除”邏輯 當你發現搜索結果里混入了大量干擾項例如搜某個OA系統結果里全是云WAF的攔截頁面使用!~或!排除它們能顯著提升結果質量。但注意排除條件本身也會增加查詢復雜度需權衡。4.2 結果準確性研判別被表象欺騙理解“數據新鮮度” FOFA的數據不是實時的。它有一個爬取和更新周期。你搜到的資產可能在一小時前已經下線或者端口已經關閉。反之一個剛上線的新資產可能需要幾小時甚至一兩天才會被FOFA收錄。對于需要實時性的任務如0day漏洞利用后的緊急排查FOFA只能作為輔助必須結合其他主動掃描手段。“蜜罐”標識僅供參考is_honeypottrue是FOFA基于規則和算法的判斷并非絕對準確。一些精心偽裝的蜜罐可能無法被識別而一些配置特殊的真實業務可能被誤判。在針對高價值目標進行深入測試前務必通過其他手段如流量分析、行為判斷進行人工復核。注意“端口與協議”的對應關系port80搜到的不一定都是HTTP服務也可能是其他TCP服務誤開在80端口。同樣protocolhttp的服務也可能跑在8080、8000等非標準端口。最可靠的方式是結合banner和header字段判斷。例如port8080 banner~HTTP header~Server:可以較準確地識別出HTTP服務。“證書”字段的陷阱cert*.abc.com會搜索證書主題或備用名稱中包含*.abc.com的資產。但很多CDN或云服務使用泛域名證書如*.cloudfront.net這會導致大量無關資產被搜到。此時需要結合host或domain字段進行過濾。4.3 積分策略與高級功能使用查詢復雜度與積分消耗 FOFA的積分消耗與查詢的復雜度和返回結果數量有關。一個簡單的titletest消耗積分較少而一個涉及多個、||和模糊匹配的復雜查詢即使結果很少也可能消耗較多積分。在編寫復雜查詢前可以先用簡單條件測試一下結果數量做到心中有數。善用“統計”和“導出”功能 對于大型資產普查或數據分析不要只盯著結果列表。先進行一個寬泛的搜索如domainxxx.com然后利用FOFA的統計功能從“端口分布”、“網站標題”、“地理位置”等多個維度進行聚合分析這能幫你快速把握全局態勢比一條條看結果高效得多。API的自動化集成 對于需要持續監控或批量處理的任務一定要學習使用FOFA的API。你可以編寫腳本定期執行特定的搜索語法將新發現的資產、特定版本的組件出現等情況自動通知到你的辦公軟件如釘釘、飛書、Slack實現安全監控的自動化。這里有一個實用技巧在API查詢中使用after2024-01-01這樣的時間條件可以讓你每次只獲取新增的資產避免重復處理老數據節省資源和時間。掌握FOFA搜索語法本質上是在培養一種“網絡空間測繪思維”。它要求你不僅知道語法規則更要理解網絡協議、服務指紋、資產關聯背后的邏輯。從生硬的語法記憶到靈活的組合運用再到對查詢結果的批判性分析這是一個不斷實踐和積累的過程。我個人的習慣是每當遇到一個新的漏洞預警或看到一個有趣的技術特征都會下意識地去想“這個特征能用FOFA語法怎么描述” 久而久之這套語法就成了你延伸的感官能讓你在浩瀚的網絡空間中更快、更準地找到你想要的那片“拼圖”。