SRC 漏洞挖掘经验与技巧
一、漏洞挖掘的前期–信息收集
虽然是前期,但是我认为最重要的一部分。
很多人挖洞的时候说不知道如何入手,其实挖洞就是信息收集 + 常规 OWASP Top 10 + 逻辑漏洞(重要的可能就是思路猥琐一点)。这些漏洞的测试方法本身不是特别复杂,一般混迹在安全圈子的人都能复现漏洞。接下来我就着重说一下我在信息收集方面的心得。
本文介绍了 SRC 漏洞挖掘的全流程,涵盖信息收集、信息处理及漏洞挖掘三个阶段。详细阐述了域名、子域名及敏感信息的收集方法,包括搜索引擎利用和工具使用。同时解析了安全漏洞的定义、分类(内存破坏、逻辑错误、输入验证等)及典型实例。最后总结了挖洞心态与技巧,强调业务理解与持续学习的重要性,旨在帮助安全从业者提升漏洞发现能力。

虽然是前期,但是我认为最重要的一部分。
很多人挖洞的时候说不知道如何入手,其实挖洞就是信息收集 + 常规 OWASP Top 10 + 逻辑漏洞(重要的可能就是思路猥琐一点)。这些漏洞的测试方法本身不是特别复杂,一般混迹在安全圈子的人都能复现漏洞。接下来我就着重说一下我在信息收集方面的心得。
SRC 一般都只收对应的漏洞,很多 SRC 的公告里面就会明确范围;然后我们就需要根据这些范围来确定域名。
如果 SRC 上面没有给出范围,那么需要我们去搜集,你需要知道哪些 domain 是该公司的,主要通过手工来查看:
但是只要是工具就会有误报,建议大家对获取的子域名写个脚本处理一下,判断哪些是可以访问的,哪些是不可以访问的,哪些访问是测试页面的。可以节约不少时间。
其实也是可以工具化(爬虫思维,不过爬虫不是很准确)。
利用 Google Hacking 搜索,大家一定不要只用 Google 搜索,这样是不全面的,还有 Bing(不用翻墙)、百度、360 等等,因为很多国内的网站利用 Google 去搜索是搜不到的。这里就不说语法了,贴几条常用的就行了。
site:xxx.comsite:xxx.com filetype:docsite:xxx.com 管理 / site:xxx.com admin / site:xxx.com loginsite:xxx.com intext:@xxx.com / intext:@xxx.comsite:xxx.com intitle:登录 / site:xxx.com inurl:sql.php这一块是比较大的一块,我这里举一些:
其实很多时候,我们通过信息收集能得到不少的漏洞了,我这里举几个简单的案例:
对于第三节提到的那些信息收集技术,我们不能收集完了就完了,一定好好整理,会对后期渗透有很大的帮助。这里说一下具体怎么整理。
利用 Word 或 Excel 或 TXT 都行,我建议 Word 和 Excel 因为 TXT 毕竟太简单了。分类:
我们辛苦的挖洞一定要对我们挖掘出来对漏洞有一个记录,记录的可以稍微详细一些,一是可以方便自己以后回顾,还有就是以后说不定有些地方出现了跟以前一样的功能,这样就方便我们更快的找到漏洞。这里建议 DOC 文档,图片可以贴的详细一些。
第二个就是通过漏洞得到的一些数据:
为什么我们要整理这些数据,因为我们要根据这些数据来设计我们的字典。爆破完好了,一样的 6。
有了前两步,这里我会写的少一点,毕竟漏洞的类型就那么些,像前文说过就是 OWASP Top 10、逻辑,对于挖掘这些漏洞,我觉得没什么特别好的办法,就是抓包分析逻辑(这里说的不包括对软件客户端的挖掘、App 的挖掘)。
首先我们需要对一个网站/App 有一个了解要知道它的功能点有哪些(后期我会更新一个 Checklist 介绍一下哪些功能会对应什么样的漏洞)。
其次我们要分析这个网站/App 里面的请求哪些是我们可以控制的参数,这些地方就是漏洞经常出没的点。
最后就是分析逻辑,这一类别的漏洞主要还是涉及一套流程,这里举个例子:
例:"我们买东西"
首先我们要选择:
询问商家:
下单:
电子票据:
支付:
订单完成:
评价:
退货…………
大家可以无限延伸,这里只是抛砖引玉。
其实这方面的文章很少,几个原因:
SRC 慢慢的挖多了系统更新不快,业务不多自然就很难挖了,所以一定要有坚持精神,深入挖掘意识,因为挖洞没有想象中的那么简单;不要想一步登天,多去看看一些案例分析一下别人的挖掘思路,然后跟着学。
我们经常听到漏洞这个概念,可什么是安全漏洞?
想给它一个清晰完整的定义其实是非常困难的。如果你去搜索一下对于漏洞的定义,基本上会发现高大上的学术界和讲求实用的工业界各有各的说法,漏洞相关的各种角色,比如研究者、厂商、用户,对漏洞的认识也是非常不一致的。
从业多年,我至今都找不到一个满意的定义,于是我自己定义一个:安全漏洞是信息系统在生命周期的各个阶段(设计、实现、运维等过程)中产生的某类问题,这些问题会对系统的安全(机密性、完整性、可用性)产生影响。
这是一个从研究者角度的偏狭义的定义,影响的主体范围限定在了信息系统中,以尽量不把我们所不熟悉的对象扯进来。
漏洞之所以被描述为某种'问题',是因为我发现无法简单地用脆弱性、缺陷和 Bug 等概念来涵盖它,而更象是这些概念的一个超集。漏洞会在系统生命周期内的各个阶段被引入进来,比如设计阶段引入的一个设计得非常容易被破解的加密算法,实现阶段引入的一个代码缓冲区溢出问题,运维阶段的一个错误的安全配置,这些都有可能最终成为漏洞。
定义对安全的影响也只涉及狭义信息安全的三方面:机密性、完整性和可用性。漏洞造成的敏感信息泄露导致机密性的破坏;造成数据库中的信息被非法篡改导致完整性的破坏;造成服务器进程的崩溃导致可用性的丧失。漏洞也可能同时导致多个安全属性的破坏。
漏洞与 Bug 并不等同,他们之间的关系基本可以描述为:大部分的 Bug 影响功能性,并不涉及安全性,也就不构成漏洞;大部分的漏洞来源于 Bug,但并不是全部,它们之间只是有一个很大的交集。
各个漏洞数据库和索引收录了大量已知的安全漏洞,下表是一个主流漏洞库的数量的大致估计,漏洞一般最早从 20 世纪 90 年代开始。
事实上,即便把未知的漏洞排除在外,只要订了若干漏洞相关的邮件列表就会知道:并不是所有漏洞数据库都会收录,就算把上面的所列的数据库中的所有条目加起来去重以后也只是收录了一部分的已知漏洞而已,实际的已知漏洞数比总收录的要高得多。
和其他事物一样,安全漏洞具有多方面的属性,也就可以从多个维度对其进行分类,重点关注基于技术的维度。注意,下面提到的所有分类并不是在数学意义上严格的,也就是说并不保证同一抽象层次、穷举和互斥,而是极其简化的出于实用为目的分类。
本地漏洞
需要操作系统级的有效帐号登录到本地才能利用的漏洞,主要构成为权限提升类漏洞,即把自身的执行权限从普通用户级别提升到管理员级别。
实例:Linux Kernel 2.6 udev Netlink 消息验证本地权限提升漏洞(CVE-2009-1185)攻击者需要以普通用户登录到系统上,通过利用漏洞把自己的权限提升到 root 用户,获取对系统的完全控制。
远程漏洞
无需系统级的帐号验证即可通过网络访问目标进行利用,这里强调的是系统级帐号,如果漏洞利用需要诸如 FTP 用户这样应用级的帐号要求也算是远程漏洞。
实例:Microsoft Windows DCOM RPC 接口长主机名远程缓冲区溢出漏洞(MS03-026)(CVE-2003-0352)攻击者可以远程通过访问目标服务器的 RPC 服务端口无需用户验证就能利用漏洞,以系统权限执行任意指令,实现对系统的完全控制。
获取控制
可以导致劫持程序执行流程,转向执行攻击者指定的任意指令或命令,控制应用系统或操作系统。威胁最大,同时影响系统的机密性、完整性,甚至在需要的时候可以影响可用性。主要来源:内存破坏类、CGI 类漏洞
获取信息
可以导致劫持程序访问预期外的资源并泄露给攻击者,影响系统的机密性。
主要来源:输入验证类、配置错误类漏洞
拒绝服务
可以导致目标应用或系统暂时或永远性地失去响应正常服务的能力,影响系统的可用性。
主要来源:内存破坏类、意外处理错误处理类漏洞。
基于漏洞成因技术的分类相比上述的两种维度要复杂得多,对于目前我所见过的漏洞大致归纳为以下几类:
以下是对这几类漏洞的描述和实例分析。
内存破坏类
此类漏洞的共同特征是由于某种形式的非预期的内存越界访问(读、写或兼而有之),可控程度较好的情况下可执行攻击者指定的任意指令,其他的大多数情况下会导致拒绝服务或信息泄露。对内存破坏类漏洞再细分下来源,可以分出如下这些子类型:
栈缓冲区溢出
最古老的内存破坏类型。发生在堆栈中的缓冲区溢出,由于利用起来非常稳定,大多可以导致执行任意指令,威胁很大。此类漏洞历史非常悠久,1988 年著名的 Morris 蠕虫传播手段之一就是利用了 finger 服务的一个栈缓冲区溢出漏洞。在 2008 年之前的几乎所有影响面巨大的网络蠕虫也基本利用此类漏洞,汇总情况可以见下表。
上面表格里列出的蠕虫即使经过多年,在当前的互联网上还经常被捕捉到。栈溢出漏洞是相对比较容易发现的漏洞,静态动态分析的方法对于此漏洞的挖掘已经相当成熟,因此这类漏洞,特别是服务端程序中,目前基本处于日渐消亡的状态。
实例:
堆缓冲区溢出
导致堆缓冲区溢出的来源与栈溢出的一致,基本都是因为一些长度检查不充分的数据操作,唯一不同的地方只是发生问题的对象不是在编译阶段就已经确定分配的栈缓冲区,而是随着程序执行动态分配的堆块。
实例:
静态数据区溢出
发生在静态数据区 BSS 段中的溢出,非常少见的溢出类型。
实例:Symantec pcAnyWhere awhost32 远程代码执行漏洞(CVE-2011-3478)
格式串问题
在printf 类调用中由于没有正确使用格式串参数,使攻击者可以控制格式串的内容操纵printf 调用越界访问内存。此类漏洞通过静态或动态的分析方法可以相对容易地被挖掘出来,因此目前已经很少能够在使用广泛的软件中看到了。
实例:Qualcomm Qpopper 2.53 格式串处理远程溢出漏洞(CVE-2000-0442)
越界内存访问
程序盲目信任来自通信对方传递的数据,并以此作为内存访问的索引,畸形的数值导致越界的内存访问,造成内存破坏或信息泄露。
实例:OpenSSL TLS 心跳扩展协议包远程信息泄露漏洞 (CVE-2014-0160) 漏洞是由于进程不加检查地使用通信对端提供的数据区长度值,按指定的长度读取内存返回,导致越界访问到大块的预期以外的内存数据并返回,泄露包括用户名、口令、SessionID 甚至是私钥等在内的敏感信息。
释放后重用
这是目前最主流最具威胁的客户端(特别是浏览器)漏洞类型,大多数被发现的利用 0day 漏洞进行的水坑攻击也几乎都是这种类型,每个月各大浏览器厂商都在修复大量的此类漏洞。
技术上说,此类漏洞大多来源于对象的引用计数操作不平衡,导致对象被非预期地释放后重用,进程在后续操作那些已经被污染的对象时执行攻击者的指令。
与上述几类内存破坏类漏洞的不同之处在于,此类漏洞的触发基于对象的操作异常,而非基于数据的畸形异常(通常是不是符合协议要求的超长或畸形字段值),一般基于协议合规性的异常检测不再能起作用,检测上构成极大的挑战。
实例:Microsoft IE 非法事件操作内存破坏漏洞(CVE-2010-0249)著名的 Aurora 攻击,涉嫌入侵包括 Google 在内的许多大互联网公司的行动,就使用了这个 CVE-2010-0249 这个典型的释放后重用漏洞。
二次释放
一般来源于代码中涉及内存使用和释放的操作逻辑,导致同一个堆缓冲区可以被反复地释放,最终导致的后果与操作系统堆管理的实现方式相关,很可能实现执行任意指令。
实例:CVS 远程非法目录请求导致堆破坏漏洞(CVE-2003-0015)
逻辑错误类
涉及安全检查的实现逻辑上存在的问题,导致设计的安全机制被绕过。
实例:
// 伪代码示例
if (signature != null) {
if (!verify(signature)) return false;
} else {
// 问题在于如果签名是空的话并没有对应的 else 逻辑分支来处理,会直接执行最下面的 return true 操作
}
return true;
代码会先检查回来的数据签名是否为空,不空的话检查签名是否正确,如果不对返回失败。问题在于如果签名是空的话并没有对应的 else 逻辑分支来处理,会直接执行最下面的 return true 操作,导致的结果是只要返回的消息中签名为空就会返回验证通过。
输入验证类
漏洞来源都是由于对来自用户输入没有做充分的检查过滤就用于后续操作,绝大部分的 CGI 漏洞属于此类。所能导致的后果,经常看到且威胁较大的有以下几类:
SQL 注入
Web 应用对来自用户的输入数据未做充分检查过滤,就用于构造访问后台数据库的 SQL 命令,导致执行非预期的 SQL 操作,最终导致数据泄露或数据库破坏。
实例:一个网站 Web 应用的数值参数的 SQL 注入漏洞。
跨站脚本执行(XSS)
Web 应用对来自用户的输入数据未做充分检查过滤,用于构造返回给用户浏览器的回应数据,导致在用户浏览器中执行任意脚本代码。
实例:YouTube 上的一个存储式 XSS 漏洞。
远程或本地文件包含
PHP 语言支持在 URL 中包含一个远程服务器上的文件执行其中的代码,这一特性在编码不安全的 Web 应用中很容易被滥用。如果程序员在使用来自客户端的 URL 参数时没有充分地检查过滤,攻击者可以让其包含一个他所控制的服务器上的文件执行其中的代码,导致远程文件包含命令执行。
实例:一个远程文件包含利用的例子。
如果 Web 应用支持在 URL 参数中指定服务器上的一个文件执行一些处理,对来自客户端 URL 数据及本地资源的访问许可如果未做充分的检查,攻击者可能通过简单的目录遍历串使应用把 Web 主目录以外的系统目录下的文件包含进来,很可能导致信息泄露:
实例:一个网站存在的本地文件包含的漏洞。
命令注入
涉及系统命令调用和执行的函数在接收用户的参数输入时未做检查过滤,或者攻击者可以通过编码及其他替换手段绕过安全限制注入命令串,导致执行攻击指定的命令。
实例:AWStats 6.1 及以下版本 configdir 变量远程执行命令漏洞(CVE-2005-0116)典型的由于 Perl 语言对文件名特性的支持加入未充分检查用户输入的问题,导致的命令注入漏洞,awstats.pl 的 1082 行:
if(open(CONFIG,"searchdir searchdir PROG.$SiteConfig.conf"))
目录遍历
涉及系统用于生成访问文件路径用户输入数据时未做检查过滤,并且对最终的文件绝对路径的合法性检查存在问题,导致访问允许位置以外的文件。多见于 CGI 类应用,其他服务类型也可能存在此类漏洞。
实例:
设计错误类
系统设计上对安全机制的考虑不足导致的在设计阶段就已经引入的安全漏洞。
实例
配置错误类
系统运维过程中默认不安全的配置状态,大多涉及访问验证的方面。
实例:
各种眼花缭乱的安全漏洞其实体现的是人类在做事的各种环节上犯过的错误,通过改进工具流程制度可以得到某些种程度的解决,但有些涉及人性非常不容易解决,而且随着信息系统的日趋复杂,我们可以看到更多的新类型漏洞,这个领域永远都有的玩。
本文系统梳理了 SRC 漏洞挖掘的核心流程与技术细节。从信息收集的广度与深度,到漏洞处理的规范性,再到具体漏洞类型的原理与实战案例,涵盖了安全研究的基础知识。希望从业者能通过持续学习、深入理解业务逻辑以及保持敏锐的洞察力,不断提升自身的安全攻防能力。同时,务必遵守法律法规,坚持白帽原则,负责任地进行漏洞挖掘与披露。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online