模糊测试是什么?从字面上理解,模糊就是不确定,我们在遇到不确定的事情时,该怎么办呢?我们需要不断尝试可能的情况,直到最终确定下来,对于模糊测试的定义如何,我们来看一下百度百科的解释:
模糊测试,是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。
这里我们需要关注的几个点:输入、非预期、监视异常结果、软件漏洞
输入:对于软件而言,只要你需要跟用户交互,你就需要为用户提供输入的地方,比如:输入框、按钮等,对于安全而言,用户的输入都是不可信的,因为存在用户输入的地方,那么对于用户输入的内容是不可预料的,一定会有我们考虑不全的情况存在,出现非预期的情况。
非预期:我们在设计一个功能的时候,是有预期的,比如用户评论功能,只允许用户提交 50 个字,当用户成功提交了 51 个字,那么这就是非预期的情况,我们把这种情况就叫做非预期的结果,导致这个结果的原因就是漏洞或者 bug。
监视异常结果:对于一个输入口,我们在输入各种参数进行测试时,如何知道参数是否有效,那么就需要监视参数提交的过程以及提交后产生的结果是否存在异常,这里的异常就是跟我们最初预期的结果有所不同,出现这种情况就需要我们重点关注了。
软件漏洞:这是模糊测试的最终目的,不只是软件的漏洞也可以是 bug,因为漏洞和 bug 都是软件设计之初非预期的情况。
其中输入是模糊测试关键,是模糊测试是否有效的灵魂,只有你的输入是软件设计之初未考虑到情况,是非预期的输入,那么你才能发现软件的问题所在。
在做渗透测试的时候,需要模糊测试的情况有很多,比如:遇到一个用户评论的地方,我们可以尝试用不同的 xss payload 来判断是否存在 xss 漏洞;遇到一个用户登陆的地方,我们可以尝试用不同的 sql 注入的 payload 测试是否存在 sql 注入漏洞。
其实各种大型的 web 扫描器的原理也包含了模糊测试的功能,我们在对一个 web 网站做渗透测试的时候,有经验的人都不会直接用扫描器,而是先熟悉 web 网站有哪些功能,用户可以控制的参数有哪些,进行简单的手工尝试之后,如果发现有一处可能存在问题,但是由于自己尝试的 payload 不能成功验证漏洞的存在,正好,自己收集了一些同类漏洞的不同 payload 列表,将这个列表中的所有 payload 均尝试一遍,监视其产生的结果,确定该处是否存在安全漏洞。
模糊测试的过程可以是手工进行,但是手工多累,所以为了代替手工,可以写一个小脚本针对那一个指定的输入口,用指定的 payload 列表,进行尝试并将结果保存下来进行分析,而扫描器的原理就是将多个模糊测试案例综合起来,自动根据不同的接口用不同的 payload 列表进行尝试,并自动分析结果是否异常,输出报告,由于不同网站的技术栈不同,可能导致结果不准确,误报、漏报等情况。
由于扫描器会对所有接口尝试所有的 payload ,所以会导致网站的压力过大,对于一些会保存到数据库的功能,会给网站维护者增加非常多的垃圾数据,由于 payload 众多,扫描器为了减少扫描时间,会使用多线程来提升扫描速率,如果网站抗压能力不强,还有可能导致网站挂掉,所以在做渗透测试项目的时候,尽量不要使用大型的 web 扫描器。
对于扫描器而言,payload 就是其核心,如果你没有经验,让你去创造 payload 可能会有点强人所难,那么我们可以做的是收集别人的 payload,然后供自己使用。
1、github 有非常多的开源扫描器,其中或多或少都会有扫描器作者贡献的 payload,我们只需要把他们的 payload 收集起来,并且进行分类整理。
2、如果你有使用付费扫描器的权利,你可以自己搭建一个 web 服务器,用付费的扫描器对你的 web 服务器进行扫描,你把日志搞出来分析一下,就可以获得付费扫描器的 payload 了。
3、除了上面两种情况,还有非常多黑客自己专属扫描器以及自己专用 payload,那么你想要得到他们智慧的结晶,那么你就需要诱使他们来攻击你,让他们扫描你的网站,从而通过日志获取他们的 payload,这种情况可遇不可求。
分享一个不错的项目,它里面包含了一些 payload,像这种项目,GitHub 里有很多,需不需要自己决定:
https://github.com/Hood3dRob1n/creep3r/tree/master/fuzz
分享是一种美德,而不是义务,积极讨论,说出你的观点,也是对作者分享的一种鼓励,请不要吝啬你的才华,有讨论,有碰撞才会有进步,欢迎拍砖。