freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

FOFA筛选语法的小技巧-新手向
2022-12-22 19:03:31
所属地 北京

前言

FOFA 作为一个网络空间测绘的搜索引擎,使用语法进行查询是一切的基础。但是 FOFA 的语法有很多,筛选语法用的时候好像又没有生效,不知道原因。所以今天想和大家分享一些可能不知道的语法搜索小技巧。

正文

我们可以设定一个场景,然后把搜索过程进行拆分,并详细讲解语法的使用以及为什么。Bot 收到命令,要搜 ThinkPHP 的资产,同时甲方爸爸有自己的要求。

  • 仅需要状态码为 200 的资产数据;

  • 需要中国的,但是要排除掉港澳台地区的资产数据;

  • 需要近一个月更新的数据;

1. FOFA规则的运用

首先,可以在 FOFA 的搜索框直接输入 ThinkPHP 的字样。那搜索联想就会直接推荐出FOFA拥有的规则。

1671705576_63a433e862a9f99bbbf7d.png!small?1671705576868

当然,还有另外一种快速展现形式,你也可以直接点击全局搜索 "thinkphp"。就可以在搜索结果页看到关键词相关规则的推荐。

1671705594_63a433fa1721a4510055d.png!small?1671705594582

app="ThinkPHP"

1671705625_63a43419cb07211837212.png!small?1671705626237

我们可以看到,近一年内的 ThinkPHP 全球资产有 814,958 条。

注:在使用 FOFA 规则的时候,有些工程师直接用 app+ 关键词进行搜索,会显示错误,这种使用方法是错误的。因为规则的命名是 FOFA 本身进行命名的,所以更推荐使用上面的两种方式获取规则。

2. 资产响应状态筛选

第一个要求,仅需要状态码为200的资产。可以通过 FOFA 的语法表知道,使用 status_code 语法就行,但是有的同学总说筛不全,还是会冒出来奇怪的状态数据。那在完成这件事情之前,我们需要先了解到一些基础的逻辑。1671705679_63a4344fb7d1c0c3c72b0.png!small?1671705680102我们可以看到,FOFA 对这个语法的解释,查询网站类型的数据。什么是网站类型的数据?FOFA 对其实对数据类型进行了区分,分为网站数据和协议数据,因为:

数据分类区别
协议数据http/https 协议不包含 html 源代码
网站数据http/https 抓包,包含 html 源代码且解析了其他字段


所以,让我们回到自己的这个例子中。我们可以通过搜索结果页的左侧聚合看到,搜索结果里既有网站数据,也有协议数据。1671705884_63a4351c44ec1a9661226.png!small?1671705884912所以 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")

1671706025_63a435a939926bd463a03.png!small?1671706025782

这里为什么要用括号 () 或 || 呢?实际上我们的搜索内容是:

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"

1671706195_63a43653678ffb7d6eca1.png!small?1671706196918

这里为什么是和 && 而且不需要括号优先级呢?

因为需要的是关键词资产中,既不要 A 也不要 B 的。

3. 国家/地区的筛选

第二个要求:需要中国的,但是要排除掉港澳台地区的资产数据;在 FOFA 里面,关于位置的划分有 Country(国家)、Region(地区/省份)、City(城市)这三个级别,其实省份用 Province 作为语法也行,但是region比较好记,所以其实两个语法都是可以的。那么我们看一下上面步骤得到的结果直接加上 country="CN"

app="ThinkPHP" && (status_code="200" || banner="HTTP/1.1 200 OK") && country="CN"

1671706276_63a436a48ffa52dd34926.png!small?1671706277051可以看到左侧的聚合页面显示,会发现有港澳台的数据。这是当然啦!因为港澳台是中国不可分割的一部分!1671706296_63a436b8dce10fdcdb57a.png!small?1671706297254所以我们需要进一步的使用!=来进行筛选。

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"

1671706393_63a43719bf7f46965006b.png!small?1671706394266这样就可以排除掉港澳台的资产啦。当然使用 province!= 也是一样的效果。这也是一个非常常见的使用场景,即需要中国的,但是要排除掉港澳台地区的资产数据。我们只需要记住这样使用就行:

&& country="CN" && region!="HK" && region!="TW" && region!="MO"

4. 最后更新时间筛选

第三个要求:需要近一个月更新的数据;

更新时间筛选即 after 和 before 语法。我们简单解释一下筛选的时间到底是什么?FOFA 中有一个字段叫做:Last update time 就是每条数据上面的时间,即 FOFA 最后一次收录这个数据的时间。因为数据是不断的进行更新的。

1671706530_63a437a21ea1c2a7d756f.png!small?1671706530597

在使用 FOFA 的时候,默认展示的是近一年内的数据。

1671706567_63a437c7dd7ebc62606d9.png!small?1671706568331

当你使用页面端的时候,可以点击 all 查看所有的数据;

1671706586_63a437daa64e9728be946.png!small?1671706587044

1671706596_63a437e4e957ff5aaeac4.png!small?1671706597485

同理,API 也是默认展示一年内的数据。当你使用 API 的时候,可以添加字段 full=true 查看所有数据;

1671706612_63a437f4e5418ab7f7129.png!small?1671706613460

添加 &full=true

1671706627_63a4380321d3bb2525cf2.png!small?1671706627589

当然,可以使用 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"

1671706740_63a43874e907de2fb379a.png!small?1671706741472

结语

在写这篇文章的时候,Bot 选择了状态码、地域及时间筛选三个经常会出现疑惑的部分进行了解答,如果您觉得有用,欢迎大家反馈更多的场景给 Bot,也更欢迎大家直接投稿~

# 工具使用 # fofa # 使用心得
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录