Mid Station

抓虫三定律

总是在过节的时候产生一些稀奇古怪的想法。
由于一个总所周知的小典故,漏洞的英文是Bug,直译过来是臭虫,那么自然找漏洞就可以理解为“抓虫”,接下来想简单谈一谈关于找漏洞(侧重Web方面但应该也适用于其他范畴)的一些想法。结合自己和前人的经验加上了解到的情况,总结出三条规律,故此称为“抓虫三定律”。

Ⅰ.漏洞是普遍存在的

这是很简单但是至关重要的一条规律。理解这条规律首先就要理解漏洞的本质,漏洞其实就是错误。这些错误可能是程序员认知错误带来的,也可能是错误的执行(编码方式方法)带来的。就像学生做作业常常犯错一样,我们不可能要求每位程序员都编写出十全十美的代码;学生作业上的错误会有老师来发现纠正,而如果没有相应的检测和发现,程序员所犯的错误将持续地在系统中存在,从而影响到系统的安全性和稳定性。
当初我刚开始尝试找漏洞的时候,总是借助一些现成的工具,或者生搬硬凑一些检测方法来测试。例如检测SQL注入时会用到经典的单引号法和and 1=1法,初学者往往只是通过返回结果的不同来判断漏洞是否存在,而没有留意到造成错误的原因,这种一知半解的初步检测就会产生“这里没有漏洞”的假象。没有检测到漏洞其实并不等于没有漏洞,如果深入了解漏洞产生的原因,我们就会发现其实漏洞还是存在的——因为错误没有被很好地纠正过来。没有被恰当地修复的漏洞,总是有许多方法去利用,有时候报错注入不行,我们可以尝试盲注的方法;有时候GET方法不行,我们可以找POST方法的点;有时候被WAF过滤了,我们还有很多方法绕过。

对于开发者,通过这条规律能够促使他们重新审视自己的系统是否存在健全可靠。而对于测试者,这更是一种支撑测试能够顺利进行的信念。

Ⅱ.系统的安全性不取决于漏洞风险的总和,而是取决于风险最高的漏洞。

这就是我们所熟悉的“饭桶木桶效应”——一个木桶能装多少水取决于它最短的那块木板。

我们可以把漏洞按照风险程度来划分,高危漏洞是指那些利用简单而又能直接获取较高权限的漏洞,而相对的,低危漏洞利用起来比较复杂,而且造成的危害也相当有限。也许补上一百个低危漏洞也比不上补上一个高危漏洞有效,因为补上低危漏洞仅仅相当于不断垒高木桶的最高木板的高度,但是由于短板的存在,木桶容量并没有发生变化,所以只有补上高危的漏洞才能真正提高系统的安全水平。乌云上有众多高危漏洞的实例已经充分证明了这条定理的正确性,就像猪猪侠所说的:

安全是一个整体,保证安全不在于强大的地方有多强大,而在于真正薄弱的地方在哪里。

这条规律给测试者一个启发,要想在有限的时间和成本中获得系统安全性能的提高,就应该首先处理风险较高的漏洞。要明确一点,测试的时候最佳的处理方式不是要找到所有的漏洞去实现天方夜谭般的绝对安全,而是要按优先次序补上有可能被利用并危害到系统安全的漏洞,从而实现安全性能渐进式地整体提高。

III.没有银弹

银弹在欧洲传说中是狼人、吸血鬼等怪物的克星,拥有一发致命的效果,后来被用作致命武器的代名词,引申为具有极端有效性的解决方法。诚然,我们希望有这样的一枚银弹来穿透系统,一劳永逸地解决所有的漏洞。但是这样的银弹不可能存在,就像道哥在《白帽子讲Web安全》中提到,安全是一个动态的概念。随着系统的迭代更新和使用,不断会有新的漏洞被暴露出来。同时也因为错误的激发需要满足一定的条件,没有一种方式能够让所有漏洞自动暴露在我们面前,只有通过不同的检测手段对不同的测试点进行测试,才能达到逐个发现,逐个击破的效果。
因为这条银弹规律的存在,注定了如果采用黑盒测试的方式进行测试的话,需要测试的目标点其实是固定的,利用某种工具的目的只是为了覆盖更多的目标点,提高效率,优化工作流程。


总结

以上“抓虫三定律”说到底可以总结为渗透测试人员之所以能够混口饭吃的原因,仔细体会可以从中找到渗透测试的一些法门。