以针对Yahoo! 的安全测试为例讲解如何高效的进行子域名收集与筛选
平常我在Hackerone平台上寻找新目标时,常常会关注厂商响应信息,如果厂商响应越积极我就越感兴趣。相对于响应信息很少的厂商而言,我们更能从中摸索到问题的本质。换句话说,即越是大厂越是容易挖到漏洞。不信?今天就拿Yahoo!练手。
预测
众所周知Yahoo!是一个国际性的大厂,所以我预计其拥有大量子域名,路径以及重定向页面。从何处下手呢?我常使用Sublister及Fierce进行枚举/爆破子域名。我希望能够利用这些工具找到被遗忘,配置错误的或者还在使用旧版软件运行的子域名。使用Subliste3r我获得了超过9000条子域名信息,如何进行检查呢?
Semi - 自动化搜索
我不信这9000多条子域名中没有一个存在漏洞的。打开Sublist3r扫描结果,手动删除一些无效及重复子域名。虽然我没有进行很细致的检查,但仍旧还有7000多条记录。接下来进行这些记录进行排序,使用Nmap以更容易解析的XML方式输出结果。
nmap -sS -p80,443 -iL nmap_input.txt -oX nmap_output
输出XML样例:
<hostnames>
<hostname name=”start.producersdesktop.yahoo.com” type=”user”/>
<hostname name=”proxy.publish.bf1.yahoo.com” type=”PTR”/>
</hostnames>
<ports><port protocol=”tcp” portid=”80"><state state=”closed” reason=”reset” reason_ttl=”42"/><service name=”http” method=”table” conf=”3"/></port>
</ports>
<times srtt=”148262" rttvar=”148262" to=”741310"/>
</host>
我们只能扫描Nmap命令中指定的端口,对我来说扫描结果中最有用的参数为state以及hostname name。我相信hostname name就是DNS记录,就我以往的经验而言,这里有时可能会是你的ISP地址,这时你就该考虑该站点是否有进行解析的问题。我们这里的基数比较大,扔几百条记录出去影响也不大。为此我写了一个脚本,根据主机名的name参数决定是否删除该XML条目。
import xmltree
def removeHostname():
for host in root.iter('host'):
for elem in host.iter():
if 'name' in elem.attrib and elem.attrib['name'] == 'ISP_redir_site':
root.remove(host)
tree.write('output.xml')
至此获得所有开放80端口的子域名,接下来可以使用Nmap扫描这些子域名的HTML标题( — script http-title),并且再次对所得数据进行除重。Yahoo!这个国际性大厂设有多语言站点,比如:
ru.search.yahoo.com
br.search.yahoo.com
de.stars.yahoo.com
接下来我们便是要清除这些明显的子域名,在最后获得的子域名中依旧有700条记录。
枯燥的研究
接下来就是花时间仔细检测剩下的子域名记录了。由于不知道这些子域名之间是否还存在着共同点,所以只能手工一个一个的来测试了。测试一段时间之后,我发现某些子域名存在相似点以及可重复性。打开http://yvap.query.yahoo.com/我才发现其属于YQL内部主机,同样的我在http://ygh-app.media.yahoo.com/也观察到这个信息。
YQL (Yahoo! Query Language)内部主机
Beaker
深入探究
http://yvap.query.yahoo.com/v1/test/js/console_ajax.js中的JavaScript代码之外,我没有发现任何有趣的信息。这里不止一个内部主机,但是不是出于关闭状态就是下面截图这个样子。
锁着的内部YQL主机YQL的示例查询如下:
https://query.yahooapis.com/v1/public/yql?q=show%20tables&diagnostics=true
我尝试使用该方法来重置锁着的主机,意思即是虽然主面板显示内部主机是无法访问,但你仍然可以通过URL提交查询。将列表中的子域名一个一个的拿来检测,其中大部分都能运行show tables命令。在向厂商报告问题之后我想继续深入下去,结果发现该页面可任意访问在http://ygh-app.media.yahoo.com我发现用于测试的Beaker站点,老实说这还是我第一次处理这种情况。经过检测发现了另一个泄露的信息。
总结
这并不是一个革命性的方法,但相交其他方式会快一点,准确一点,耗费时间更少一点。在两个星期前我发现一个名为Aquatone的工具将所用到的脚本都集成到一起了。
时间轴
5月10日 - 向HackerOne平台报告 5月11日 - Yahoo!响应YQL主机的问题之前已经有报告过,但第二个问题是最新报告 5月12日 - 我提出可以向YQL主机发送查询请求的可能 5月18日 - 答复这是有意的行为 6月 2日 - 获取奖金
- React第三方组件3(状态管理之Flux的使用⑤异步操作)
- 使用yo-get下载视频网站视频或其
- React多页面应用3(webpack4 多页面实现)
- 洛谷P2345 奶牛集会
- React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)
- React多页面应用1(webpack4 开发环境搭建,包括热更新,api转发等)
- 洛谷P2345 奶牛集会
- P2880 [USACO07JAN]平衡的阵容Balanced Lineup
- Python黑客编程3网络数据监听和过滤
- React第三方组件6(状态管理之Mobx的使用⑤异步操作)
- 机器学习(五)使用Python和R语言从头开始理解和编写神经网络介绍目录神经网络背后的直观知识多层感知器及其基础知识什么是激活函数?前向传播,反向传播和训练次数(epochs)多层感知器全批量梯度下降
- 洛谷P2251 质量检测
- React第三方组件6(状态管理之Mobx的使用④TodoList下)
- HDU 1536 S-Nim
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java安全编码指南之:输入校验
- Joomla漏洞总结
- 如何在YouTube Api限额的情况下获取更多视频
- RNA-Seq数据用aspera高效批量下载(万事开头难)
- 并发编程之Atomic&Unsafe魔法类详解
- 重温Retrofit源码,笑看协程实现
- 【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
- 解决jar包冲突的简单办法
- 【Java8新特性】01 函数式接口和Lambda表达式你真的会了吗
- 只出现一次的元素
- 【排序】堆排序
- redis灵魂拷问:怎样搭建一个哨兵主从集群
- 是时候给你的鼠标指针更换样式换下风格体验了!如何卸载与安装鼠标指针?
- Linux设置虚拟内存
- SSM 单体框架 - 教育平台后台管理系统:接口文档