漏洞挖掘入门教程:从零开始掌握基本过程
初学者最好不要直接上手进行漏洞挖掘,因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫,而且难度较大。较合理的途径应该从漏洞利用入手,不妨分析一些公开的 CVE 漏洞。很多漏洞都有比较好的资料,分析研究的多了,对漏洞的认识自然就不同了,然后再去搞挖掘就会易上手一点。
俗话说:'磨刀不误砍柴工',就是这么个理儿。
对于有一些基础知识的初学者,应该怎样进行漏洞挖掘呢?
一、漏洞是怎样被发现的

从某个角度来讲,我们可以将漏洞挖掘工作比作玩迷宫游戏,不同的是,这个迷宫与我们平时所见的游戏中的迷宫略有不同:
(1)你无法立即看到它整体的外观 (2)随着漏洞挖掘工作的深入,这个迷宫的形状逐渐扩大 (3)你将会拥有多个起点及终点,但是无法确定这些点具体在哪里 (4)最终这个迷宫可能永远也无法 100% 的完整,但是却能够弄清楚 A 点至 B 点的一条完整路径
具体一点地描述,我们可以将漏洞挖掘工作归结为三个步骤:
(1)枚举程序入口点(例如:与程序交互的接口) (2)思考可能出现的不安全状态(即漏洞) (3)设法使用识别的入口点到达不安全状态
即是说,在这个过程中,迷宫是我们研究的应用程序,地图是我们对程序的理解程度,起点是我们的入口点(交互接口),终点为程序的不安全状态。
所谓入口点,既可以是 UI 界面上直观可见的交互接口,也可以是非常模糊与透明的交互接口(例如 IPC),以下是部分安全研究员较为感兴趣的关注点:
(1)应用程序中比较古老的代码段,并且这一部分随着时间的推移并没有太大的变化。 (2)应用程序中用于连接由不同开发团队或者开发者开发的程序模块的接口部分 (3)应用程序中那些调试和测试的部分代码,这部分代码本应在形成 Release 版本时去除,但由于某些原因不小心遗留在程序中。 (4)C-S 模式(带客户端和服务端)的应用中客户端及服务端调用 API 的差异部分(例如网页表单中的 hide 属性字段) (5)不受终端用户直接影响的内部请求(如 IPC)
从攻击面上来划分,可以将漏洞分为两大类,通用漏洞(General)和上下文漏洞(Contextual)。通用型漏洞是指在我们对应用的业务逻辑不是非常熟悉的情况下能够找出的漏洞,例如一些 RCE(远程代码执行)、SQLi(sql 注入)、XSS(跨站)等。上下文漏洞是指需要在对应用的业务逻辑、认证方式等非常熟悉的情况下才能找到的漏洞,例如权限绕过等。
在漏洞挖掘的过程中,首先根据经验优先考虑研究测试那些可能会对应用产生巨大威胁的部分。一些轻量级威胁检测模型(如 STRIDE)可以辅助我们做出这样的决策。
下面我们来看一个 WEB 应用程序的漏洞示例,后面将会介绍桌面程序:

首先我们假设目标 web 应用是一个单页面应用程序(single-page-application SPA),我们已经获得合法验证去访问这个应用,但是我们没有任何关于服务端的源代码或者二进制文件。在这种情况下,当我们枚举入口点时,可以通过探寻该应用的不同功能来进一步了解其业务逻辑及功能,可以通过抓包分析看 HTTP 请求内容,也可以分析客户端的网页代码获取需要提交表单的列表,但是最终的限制还是我们无法具体知悉客户端和服务端调用的 API 之间的区别,不过通过以上方法,我们可以找到一些入口点。
接着就是操作这些入口点,以试图达到我们预期的不安全状态。由于漏洞的形态很多,我们通常需要构建一个适用于该测试应用程序的业务功能漏洞的测试集,以求达到最高效地寻找漏洞。如果不那样做的话,我们就将会在一些无用的测试集上花费大量时间,并且看不到任何效果(举个例子,当后台的数据库为 Postgres 时,我们用 xp_cmdshell 去测试,测试再多次都无济于事)。所以在构造测试集时,需对应用程序的逻辑有较深的理解。下图形象地展示了低效率测试集的效果:

对于桌面应用程序,漏洞挖掘的思路本质上与 web 程序是类似的,不过也有一些区别:最大的区别在于,桌面应用的执行方式与流程与 web 程序不一样,下图展示的是桌面应用漏洞挖掘的一些内容:










