e-works数字化企业网  »  文章频道  »  基础信息化  »  网络与安全

漏洞挖掘的高级方法

2017/11/7    来源:安全客    作者:佚名      
关键字:漏洞挖掘  代码分析  
本篇文章首先我会从一个较高的角度总结于我眼中何谓漏洞挖掘,然后详细讨论在软件漏洞挖掘过程中我们需要掌握的技能以及需要的知识和工具等。
    前言
 
    在此文中我将讲述我在软件漏洞挖掘的实践中学到的技术及方法,不过这些内容并非那些前沿的技术,大多是基础类型的技术及方法。对于初学者而言,希望能够给予入门的指导,对于经验丰富的漏洞挖掘工作者而言,我认为也可以从中获得一些启发。
 
    漏洞挖掘的高级方法
 
    受限于我个人的知识水平及能力,这篇文章并不可能做到面面俱到,也希望阅读者能够与我积极交流,对于其中的错误不吝赐教。
 
    我将会把此文分为三个章节,分别阐述我的观点。首先我会从一个较高的角度总结于我眼中何谓漏洞挖掘;然后详细讨论在软件漏洞挖掘过程中我们需要掌握的技能以及需要的知识和工具等;最后我将谈谈一些我认为有利于漏洞挖掘但是却并非纯技术性的想法。
 
    一.什么是漏洞挖掘
 
    迷宫游戏
 
    从某个角度来讲,我们可以将漏洞挖掘工作比作玩迷宫游戏,不同的是,这个迷宫与我们平时所见的游戏中的迷宫略有不同:
 
    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应用程序的漏洞示例
 
    首先我们假设目标web应用是一个单页面应用(single-page-application SPA),我们已经获得合法验证去访问这个应用,但是我们没有任何关于服务端的源代码或者二进制文件。在这种情况下,当我们枚举入口点时,可以通过探寻该应用的不同功能来进一步了解其业务逻辑及功能,可以通过抓包分析看HTTP请求内容,也可以分析客户端的网页代码获取需要提交表单的列表,但是最终的限制还是我们无法具体知悉客户端和服务端调用的API之间的区别,不过通过以上方法,我们可以找到一些入口点,
 
    接着就是操作这些入口点,以试图达到我们预期的不安全状态。由于漏洞的形态很多,我们通常需要构建一个适用于该测试应用程序的业务功能漏洞的测试集,以求达到最高效的寻找漏洞。如果不那样做的话,我们就将会在一些无用的测试集上花费大量时间,并且看不到任何效果(举个例子,当后台的数据库为Postgresql时,我们用xp_cmdshell去测试,测试再多次都无济于事)。所以在构造测试集时,需对应用程序的逻辑有较深的理解。下图形象的展示了低效率测试集的效果:
 
   WEB应用程序的漏洞示例
 
    对于桌面应用程序,漏洞挖掘的思路本质上与web程序是类似的,不过也有一些区别:最大的区别在于,桌面应用的执行方式与流程与web程序不一样,下图展示的是桌面应用漏洞挖掘的一些内容:
 
    与黑盒测试相比,当有源代码时(白盒测试),在寻找代码入口和程序执行路径等漏洞挖掘点时所做的猜测性的工作会大大减少,在这种情况下,将数据载荷从入口点执行到不安全的程序位置的效率低于从不安全的程序位置回溯至入口点。不过在白盒测试中,你对代码的测试的覆盖面可能会由于你自己的知识局限性而受到影响。
 
    二.漏洞挖掘需要具备的知识
 
    从事漏洞挖掘工作需要具备的知识是极其广泛的,并且随着时间在不断改变,也取决于你所研究的对象(web程序、桌面程序、嵌入式等等)。不过,万变不离其宗,所需要掌握的知识领域却总可以认为是确定的,我认为大致可以分为以下四个方面:
 
    1. 程序正向开发技术。这是一个开发者需要掌握的能力,包括编程语言、系统内部设计、设计模式、协议、框架等。拥有丰富编程经验与开发能力的人在漏洞挖掘过程中往往比那些只对安全相关领域有所了解的人员对目标应用能有更深入的理解,从而有更高的产出。
 
    2. 攻防一体的理念。这些知识涵盖了从基本的安全原则到不断变换的漏洞形态及漏洞缓解措施。攻击和防御结合的理念,能够有效帮助研究者既能够发现漏洞,同时也能够快速给出有效的漏洞缓解措施和规避方法。
 
    3. 有效使用工具。能够高效的使用工具能够快速将思路转化为实践,这需要通过花时间去学习如何配置和使用工具,将其应用于自己的任务并构建自己的工作流程来不断积累经验。更进一步,需要深入掌握所使用工具的原理,以及如何对其进行二次开发,以使得其能够更加高效的应用于当前的工作实际。事实上,我认为面向过程的学习方法往往比面向工具的学习方法更加高效以及有价值,当自己发现一个在使用一个工具遇到瓶颈时,先不要退缩,尝试去改造它,或者通过自己动手实践去完成能够适应当前工作的工具,这往往能够帮助快速积累大量实践经验。帮助我们以后更加高效的去实践漏洞挖掘工作。
 
    4. 对目标应用的理解。最后,也是最重要的,作为一个漏洞挖掘人员,对自己研究的应用程序在安全性方面必须要比这个程序的开发者或维护者有更深的理解。这样你才能尽可能的发现这个程序中的漏洞并修复它。
 
    下面这张表格介绍了我认为在挖掘web应用程序和桌面应用程序的漏洞时所需要掌握的内容,限于笔者个人的认知水平,所展示的内容并非特别齐全:
 
    在挖掘web应用程序和桌面应用程序的漏洞时所需要掌握的内容

    在挖掘web应用程序和桌面应用程序的漏洞时所需要掌握的内容
 
    在挖掘web应用程序和桌面应用程序的漏洞时所需要掌握的内容
 
    这是我经过无数的不眠之夜、数以千计的小时、一次又一次的错误而总结的知识,我相信它将会帮助你提高你挖掘漏洞的能力。如果说上面一节是讲诉挖掘漏洞所需要的知识,那么下面的这一节将讲述挖掘漏洞如何做。
 

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐