Google Hacking,有时也会被称为 Google dorking,是一种利用谷歌搜索的高级使用方式进行信息收集的技术。这个概念最早在2000年由黑客 Johnny Long 提出并推广,一系列关于 Google Hacking 的内容被他写在了《Google Hacking For Penetration Testers》一书中,并受到媒体和大众的关注。在 DEFCON 13的演讲上,Johnny 创造了 “Googledork" 这个词,“Googledork" 指的是“被 Google 透露了信息的愚蠢、无能的人们”。这是为了引起人们注意到,这些信息能被搜索到并不是 Google 的问题,而是由用户或用户安装程序时无意识的错误配置造成的。随着时间的推移,“dork" 这个词成为了“定位敏感信息的搜索”这个行为的简称。
黑客们可以使用 Google 的高级操作符搜索那些易被攻击的 Web 应用程序或者特定文件类型( .pwd
, .sql
...), 查找 Web 应用程序中的安全漏洞、收集目标信息、发现泄露的敏感信息或错误消息以及发现包含凭据和其他敏感数据的文件。
虽然 Google 在国内无法直接访问,但作为技术人员,理应找到恰当的访问途径。另外这种技术虽然名为 “Google Hacking”,但同样的思路,类似的搜索技巧,也是完全适用于其他搜索引擎的。所以这里仅是抛砖引玉性质的介绍,触类旁通地可以灵活应用在其他的搜索场景里,只需要注意各种搜索引擎在搜索操作符(operator)使用上的细小差异。
一、搜索基础点
- 可以使用双引号 ( “ " ) 进行短语搜索;
- 关键字不区分大小写;
- 可以使用通配符 ( * );
- 会在搜索中忽略一些词语,这些词语被称为 stop words,比如:how,where 等;
- 关键词最多可以有32个词语,但 Google 并不会把通配符 ( * ) 算入关键词的长度,所以可以使用通配符扩展搜索内容的长度;
- 布尔运算符和特殊字符:
- + 加号 (AND)
会强制搜索加号后面跟随的单词,后面不能有空格。使用加号可以让那些 Google 默认忽略的单词可以被搜索;- - 减号 (NOT)
会强制忽略减号后面跟随的单词,后面也不能有空格;- | 管道符 (OR)
会在搜索中搜索被管道符分割的关键词中的任意一个。
二、高级操作符
在 Google Hacking 中可以使用高级运算符,以缩小搜索结果范围,最终获取到需要的信息。高级操作符虽然容易使用,但也需要遵循严格的语法。
1. 需要知道
- 基本语法是:
operator:search_term
,当中不能有空格; - 布尔运算符和高级操作符可以结合使用;
- 多个高级操作符可以在一次搜索中配合使用;
- 以
all
开头的操作符在一次搜索中仅能使用一次,不能与其他高级操作符同时使用。
2. 基本操作符(operator)
· intitle & allintitle ·
使用 intitle 可以搜索网页的的标题,标题指的是在 HTML 中的 title 标签的内容。比如搜索 intitle:"Index of"
会返回所有 title 标签中含有关键字短语 “Index of" 的搜索结果。
allintitle 的使用方法和 intitle 类似,但 allintitle 后面可以跟随多个内容。比如
allintitle:"Index of""backup files"
返回所有 title 标签中含有关键字短语 Index of
和 backup files
的搜索结果。
但使用 allintitle 会有很大的限制,因为这样搜索的内容只会限制于返回 intitle 的内容,而不能使用别的高级操作符。在实际使用中,最好使用多个 intitle,而不是使用 allintitle。
· allintext ·
这个是最容易理解的一个操作符,作用就是返回那些包含搜索内容的页面。当然,allintext 不能与其他高级操作符结合使用。
· inurl & allinurl ·
在介绍过 intitle 后,inurl 其实也很好理解:可以搜索网页 url 的内容。然而在实际使用中,inurl 往往并不能如预期般获得想要的结果,原因如下:
- Google 并不能很有效地去搜索 url 中协议的部分,比如
http://
; - 在实际情况中,url 通常会包含大量的特殊字符。为了在搜索的同时兼容这些特殊字符,搜索的结果就不会如预期那样精准;
- 其他的高级操作符(比如:site, filetype 等)可以搜索 url 内特定的部分,在搜索中的效率也比 inurl 高的多。
所以 inurl 并不如 intitle 那样好用。但即便 inurl 或多或少有一些问题,inurl 在 Google Hacking 中也是不可或缺的。
和 intitle 相同,inurl 也有一个对应的高级操作符 allinurl。而且 allinurl 同样不能与别的高级操作符结合使用,所以如果想要去搜索 url 中多个关键字,最好使用多个 inurl 操作符。
· site ·
site 操作符可以在特定的网站中指定搜索内容,比如搜索 site:apple.com
,返回的内容就只会是 www.apple.com 这个域名或者其子域名下的内容。
不过需要注意的是,Google “阅读” 域名的顺序是从右到左,和人阅读的顺序是截然相反的。如果你搜索 site:aa
,Google 会去搜索以 .aa 为结尾的域名,而不是以 aa 开头的域名。
· filetype ·
filetype 操作符能搜索的文件类型,也就是指定搜索文件的后缀名。比如搜索 filetype:php
,搜索将会返回以 php 为结尾的 URL。此操作符往往会与其他高级操作符配合使用,达到更精确的搜索结果。
· link ·
link 操作符可以搜索跳转到指定 URL 的链接,link 操作符后面不仅可以写一些基础 URL,也可以写一些复杂的、完整的 URL。link 操作符也不能与其他高级操作符或关键字一起使用。
· inanchor ·
inanchor 操作符可以搜索 HTML 链接标签中的锚文本,“锚文本”是网页中关于超链接的一段描述,比如下面这段 HTML 语言:
<a href="http://en.wikipedia.org/wiki/Main_Page">Wikipedia</a>
其中的Wikipedia
就是这段链接中的锚文本。
· cache ·
当 Google 爬到网站的时候,会生成一个链接来保存这个网站的快照,也被称为网页缓存。运用 cache 操作符就可以搜索指定 URL 的网页快照,而且网页快照不会因为原网页的消失或变更而发生改变。
· numrange ·
numrange 操作符后面需要加上两个数字来表示数字的范围,以 “-" 为分割,形如: numrange:1234-1235
。当然 Google 也提供了一个更简洁的方式来搜索数字,形如: 1234..1235
,这样就可以不使用 numrange 操作符来达到搜索范围数字的目的了。
· daterange ·
daterange 操作符可以搜索指定时间范围内 Google 索引的网站,操作符后面使用的日期格式是“儒略日期(Julian Day)”。关于“儒略日期”的解释请参见相关文档。使用时可以通过在线版查询工具获得需要的"儒略日期"数值,如:
www.onlineconversion.com/julian_date.htm
· info ·
info 操作符会返回一个站点的摘要信息,操作符后面的内容必须是一个完整的站点名称,否则不会返回正确的内容。info 操作符不能与其他操作符一起使用。
· related ·
related 操作符会搜索那些和输入的 URL 相关或者相似的页面,related 操作符不能与其他操作符一起使用。
· stocks ·
stocks 操作符会搜索相关的股票信息,stocks 操作符不能与其他操作符一起使用。
· define ·
define 操作符会搜索关键字的定义,define 操作符不能与其他操作符一起使用。
三、简单应用
1. 邮箱抓取
如果要对一个目标进行测试,Google Hacking 能帮助我们搜索到足够的信息。其中,收集相关的邮箱地址(往往也是网站的用户名)则是 Goolge Hakcing 运用中简单且又能证明其强大的一个例子。
首先我们先在 Google 中搜索 “@gmail.com",发现搜索返回的结果并不好,但也包含了需要的搜索结果。
▲在 Google 中搜索 “@gmail.com"
随后,用 Lynx(Linux 下的纯文本网页浏览器),将所有的结果输出至一个文件:
lynx --dump 'http://www.google.com/search?q=@gmail.com' > test.html
最后,用 grep
和正则表达式就可以找出所有的邮箱地址:
grep -E '^[A-Za-z0-9+._-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}' test.html
当然,网络上还有更“完美”的正则表达式能涵盖更多的邮箱地址格式(比如:emailregex)。这个例子不过是抛砖引玉,仅仅是利用 Google 搜索就可以达到搜索基础信息的目的。
2. 基础网站抓取
作为一名安全测试人员,如果我们需要对一个指定的网站进行信息收集,可以使用 site
操作符指定一个站点、域名或子域名。
可以看到搜索结果非常的多,Google 会智能地将更显而易见的结果放在前面。而我们往往希望看到的并不是这些常见内容,而是那些在平时可能看不到的结果。我们可以使用 -
来筛选我们的搜索结果。
将上图中的几个站点排除后搜索关键字:
site:microsoft.com -site:www.microsoft.com -site:translator.microsoft.com -site:appsource.microsoft.com -site:bingads.microsoft.com -site:imagine.microsoft.com
搜索结果:
可以看到,结果已经不包含第一次搜索中的几个站点了。想要进一步挖掘,就必须重复这个筛选的动作,那最后搜索内容的长度肯定会到 Google 限制的32个单词的上限。不过这个操作可以简单地就达成域名的收集工作,虽然有点乏味和繁琐。
和之前相同,我们可以使用 Lynx 将这个过程简化一点:
lynx --dump 'https://www.google.com/search?q=site:microsoft.com+-site:www.microsoft.com&num=100' > test.html
grep -E '/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/' test.html
【优点】
虽然站点名和域名收集并不是一件新鲜事,但通过 Google 完成这项任务有以下几项优点:
- 低调:不会直接向测试目标发送任何数据包,不会被目标捕捉行为;
- 简单:返回的结果是被 Google 按照一定顺序排序好的,往往更有用的信息会被放在“下面”,所以可以对结果进行简单筛选而寻找到需要的信息;
- 指向性:通过 Google 进行信息搜索,可以得到的不仅仅是站点名和域名,还有电子邮箱地址、用户名等等更有用的信息。这些信息往往能指向下一步的测试操作。
四、复杂应用
1. Google Hacking Database
www.exploit-db.com/google-hacking-database
Google Hacking Database (GHDB) 是一种互联网搜索引擎查询的索引,旨在发现那些在互联网上公开透明且敏感的信息。这些敏感信息在大多数情况下是不应被公开的,但因为某些原因,这些信息被搜索引擎抓取到,然后被放在了公开的网络中。GHDB 中包含了大量 Google Hacking 的搜索语句,如果是想要提升自己搜索的能力,或者是想要拓展视野,这里绝对是绝佳的去处。
GHDB 把所有的搜索内容分为了以下 13 类:
- Footholds 演示页面
- Files Containing Usernames 用户名文件
- Sensitive Directories 敏感目录
- Web Server Detection 网站服务器检测
- Vulnerable Files 有漏洞的文件
- Error Messages 错误信息
- Files Containing Juicy Info 有价值的文件
- Files Containing Passwords 口令文件
- Sensitive Online Shopping Info 在线商业信息
- Network or Vulnerability Data 安全相关数据
- Pages Containing Login Portals 登录页面
- Various Online Devices 在线设备
- Advisories and Vulnerabilities 公告和漏洞
由此可见,Google Hacking 几乎没有做不到,只有想不到,如果需要精进,那肯定还需要漫长的学习的。
2. 脚本利用
前面也提到过,利用 Lynx 等相关的命令行可以比较简单地对 Google 出来的数据进行处理,进而得到想要的结果。同时,Google 也提供了很多 API 可以方便进行调用。所以编写脚本,能更为有效且快捷地得到所需要的信息。这里列举两个利用 Google 搜索的脚本,用以展示脚本的强大和灵活性。
· dns-mine ·
github.com/sensepost/SP-DNS-mine
利用 dns-min.pl
可以更加快捷的达成之前介绍的网站抓取的目的。
· bile ·
github.com/sensepost/BiLE-suite
bile 脚本工具利用 Httrack 和 Google 能搜索出和目标网站相关联的站点,并且用算法衡量各个结果的权重,最后有序输出。
五、如何防范
前面已经介绍了许多不同的 Google Hacking 的方法,那么对于网站的运营人员,应如何防范这种看似无孔不入的攻击呢?
1. 禁止目录列表
通常通过 .htaccess 文件可以防止那些未授权的访问网站中的目录内容。在 Apache Web Server 上也可以通过编辑 httpd.conf 文件 Options-Indexes-FollowSymLinks-MultiViews
字段禁止访问站点中的目录列表。
2. 合理设置站点的 robots.txt
可以使用 /robots.txt 文件向网络机器人提供有关其网站的说明, 这被称为The Robots Exclusion Protocol。
在网站根目录创建 robots.txt,例如:
User-agent: Baiduspider
Disallow: /
User-agent: Sosospider
Disallow: /
User-agent: sogou spider
Disallow: /
User-agent: YodaoBot
Disallow: /
Disallow: /bin/
Disallow: /cgi-bin/
通过 User-agent 指定针对的爬虫机器人,通过 Disallow 指定不允许机器人访问的目录。上面的例子的意思就是拒绝百度、搜搜、搜狗和有道的机器人爬取网站,同时禁止所有机器人爬取 /bin/ 和 /cgi-bin/ 目录。
3. 合理设置页面的 NOARCHIVE 标签
通过 robot.txt 可以限制爬虫机器人访问你的站点,但对于单个页面而言,robot.txt 就没有那么好用了,Google 等搜索引擎依旧抓取网页并且会生成网页快照,要处理这种情况就需要使用 META
标签。
<META NAME="ROBOTS" CONTENT="NOCARCHIVE">
将上面这个 META 标签加入页面的 head 中,可以有效地避免机器人爬取单个页面生成网页快照。
4. 合理设置页面的 NOSNIPPET
为了不让搜索引擎生成网页摘要,也可以在网页中加入一条 META
标签:
<META NAME="BAIDUSPIDER" CONTENT="NOSNIPPET">
这样就可以避免搜索引擎抓取网页并生成网页的摘要,同时 NOSNIPPET 也会让搜索引擎避免生成网页快照。
六、扩展
最后推荐两个网站,相对于 Google 他们更注重于搜索网络安全方面的信息收集。
1. 钟馗之眼
www.zoomeye.org
ZoomEye 是一款针对网络空间的搜索引擎,收录了互联网空间中的设备、网站及其使用的服务或组件等信息。
ZoomEye 拥有两大探测引擎:Xmap 和 Wmap,分别针对网络空间中的设备及网站,通过 24 小时不间断地探测、识别,标识出互联网设备及网站所使用的服务及组件。研究人员可以通过 ZoomEye 方便地了解组件的普及率及漏洞的危害范围等信息。
搜索内容包括:
-
网站组件指纹:包括操作系统,Web 服务,服务端语言,Web 开发框架,Web 应用,前端库及第三方组件等等。
-
主机设备指纹:结合 NMAP 大规模扫描结果进行整合。
2. Shodan
www.shodan.io
Shodan是一个搜索引擎,它允许用户使用各种过滤器查找连接到互联网的特定类型的计算机(网络摄像头,路由器,服务器等)。有些人还将其描述为服务横幅的搜索引擎,服务横幅是服务器发送回客户端的元数据。这可以是有关服务器软件的信息,服务支持的选项,欢迎消息或客户端在与服务器交互之前可以找到的任何其他信息。
最后也需要提醒一下,在搜索隐私相关数据时,也需要保持敬畏之心,不要滥用技术手段,否则可能引起争议和触发规条。(黄缪华 | 天存信息)
Ref
- J. Long - Google Hacking for Penetration Testers
- J. Long - Using Google as a Security Testing Tool
- Google Search Help
- 锚文本(Anchor_text)
- robot.txt详解
- 钟馗之眼
- Shodan
- 儒略日期