前言
FOFA 作为一个网络空间测绘的搜索引擎,使用语法进行查询是一切的基础。但是 FOFA 的语法有很多,筛选语法用的时候好像又没有生效,不知道原因。所以今天想和大家分享一些可能不知道的语法搜索小技巧。
正文
我们可以设定一个场景,然后把搜索过程进行拆分,并详细讲解语法的使用以及为什么。Bot 收到命令,要搜 ThinkPHP 的资产,同时甲方爸爸有自己的要求。
仅需要状态码为 200 的资产数据;
需要中国的,但是要排除掉港澳台地区的资产数据;
需要近一个月更新的数据;
1. FOFA规则的运用
首先,可以在 FOFA 的搜索框直接输入 ThinkPHP 的字样。那搜索联想就会直接推荐出FOFA拥有的规则。
当然,还有另外一种快速展现形式,你也可以直接点击全局搜索 "thinkphp"。就可以在搜索结果页看到关键词相关规则的推荐。
app="ThinkPHP"
我们可以看到,近一年内的 ThinkPHP 全球资产有 814,958 条。
注:在使用 FOFA 规则的时候,有些工程师直接用 app+ 关键词进行搜索,会显示错误,这种使用方法是错误的。因为规则的命名是 FOFA 本身进行命名的,所以更推荐使用上面的两种方式获取规则。
2. 资产响应状态筛选
第一个要求,仅需要状态码为200的资产。可以通过 FOFA 的语法表知道,使用 status_code 语法就行,但是有的同学总说筛不全,还是会冒出来奇怪的状态数据。那在完成这件事情之前,我们需要先了解到一些基础的逻辑。我们可以看到,FOFA 对这个语法的解释,查询网站类型的数据。什么是网站类型的数据?FOFA 对其实对数据类型进行了区分,分为网站数据和协议数据,因为:
数据分类 | 区别 |
协议数据 | http/https 协议不包含 html 源代码 |
网站数据 | http/https 抓包,包含 html 源代码且解析了其他字段 |
所以,让我们回到自己的这个例子中。我们可以通过搜索结果页的左侧聚合看到,搜索结果里既有网站数据,也有协议数据。所以 status_code 语法是针对于 FOFA 上的网站数据的状态码进行筛选的,即 header 中的状态码。
那如果在搜索过程中,协议数据的状态也想筛选怎么办呢?其实就是使用 banner 即可。我们的需求拆分为,网站数据状态码为 200 或协议数据状态码为 200 的资产,所以这部分的语法如下:
status_code="200" || banner="HTTP/1.1 200 OK"
组合起来的搜索语法为:
app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK")
这里为什么要用括号 () 和或 || 呢?实际上我们的搜索内容是:
app="ThinkPHP" && status_code="200" 或 app="ThinkPHP" && banner="HTTP/1.1 200 OK"
需要这个关键词中状态为 A 的或者这个关键词中状态为B的逻辑。
所以在这里运用括号的优先级,可以将语法删减为:
app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK")
当然,其实很多情况下是需要对无效状态码进行排除的,我们这里继续用 200 状态码举例。
我们的需求拆分为,排除网站数据状态码为 200 和协议数据状态码为 200 的资产,那语法应该变为:
status_code!="200" && banner!="HTTP/1.1 200 OK"
组合起来的搜索语法为:
app="ThinkPHP" && status_code!="200" && banner!="HTTP/1.1 200 OK"
这里为什么是和 && 而且不需要括号优先级呢?
因为需要的是关键词资产中,既不要 A 也不要 B 的。
3. 国家/地区的筛选
第二个要求:需要中国的,但是要排除掉港澳台地区的资产数据;在 FOFA 里面,关于位置的划分有 Country(国家)、Region(地区/省份)、City(城市)这三个级别,其实省份用 Province 作为语法也行,但是region比较好记,所以其实两个语法都是可以的。那么我们看一下上面步骤得到的结果直接加上 country="CN"
app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK") && country="CN"
可以看到左侧的聚合页面显示,会发现有港澳台的数据。这是当然啦!因为港澳台是中国不可分割的一部分!
所以我们需要进一步的使用!=来进行筛选。
region!="HK" && region!="TW" && region!="MO"
拼接起来就是:
app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK") && country="CN" && region!="HK" && region!="TW" && region!="MO"
这样就可以排除掉港澳台的资产啦。当然使用 province!= 也是一样的效果。这也是一个非常常见的使用场景,即需要中国的,但是要排除掉港澳台地区的资产数据。我们只需要记住这样使用就行:
&& country="CN" && region!="HK" && region!="TW" && region!="MO"
4. 最后更新时间筛选
第三个要求:需要近一个月更新的数据;
更新时间筛选即 after 和 before 语法。我们简单解释一下筛选的时间到底是什么?FOFA 中有一个字段叫做:Last update time 就是每条数据上面的时间,即 FOFA 最后一次收录这个数据的时间。因为数据是不断的进行更新的。
在使用 FOFA 的时候,默认展示的是近一年内的数据。
当你使用页面端的时候,可以点击 all 查看所有的数据;
同理,API 也是默认展示一年内的数据。当你使用 API 的时候,可以添加字段 full=true 查看所有数据;
添加 &full=true
当然,可以使用 after 和 before 语法对更新时间进行一个圈定,这样就可以根据您的需求筛选出不同时间段的数据或最新数据。比如需要 6 月到 11 月底的数据:
&& before="2022-12-01" && after="2022-05-31"
注:使用 API 时,after 和 before 语法不可以进行共用,为产品限制而非 BUG。
所以根据我们的需求:需要近 1 个月更新的数据;只需要使用 after 即可,我们默认今天是 12 月 12 日,那就是在 2022 年 11 月 11 日之后,即:
&& after="2022-11-11"
4. 最终结果
我们回过头来看一整个流程。
Bot 收到命令,要搜 ThinkPHP 的资产,同时甲方爸爸有自己的要求。
ThinkPHP 的资产
app="ThinkPHP"
仅需要状态码为 200 的资产数据;
&& (status_code="200" || banner="HTTP/1.1 200 OK")
需要中国的,但是要排除掉港澳台地区的资产数据;
&& country="CN" && region!="HK" && region!="TW" && region!="MO"
需要近 1 个月更新的数据;
&& after="2022-11-11"
组合其他的最终语法为:
app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK") && country="CN" && region!="HK" && region!="TW" && region!="MO" && after="2022-11-11"
结语
在写这篇文章的时候,Bot 选择了状态码、地域及时间筛选三个经常会出现疑惑的部分进行了解答,如果您觉得有用,欢迎大家反馈更多的场景给 Bot,也更欢迎大家直接投稿~
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)