FOFA筛选语法的小技巧-新手向

释放双眼,带上耳机,听听看~!


正文共:3307字 19图  

预计阅读时间:9分钟


▌前言

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,也更欢迎大家直接投稿~

本文来源自:FOFA

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
小白专享

Python3 零基础完全入门 小白到程序猿进化 (80课全)

2022-12-24 13:09:04

Web安全渗透测试

一次xss到rce

2019-3-18 11:28:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索