最近在实验室做的项目中,有一个需求,由于普通的网站后台界面,没有验证码,用户输入帐户名和密码,网站系统直接将请求与数据库相关信息进行比对,甚至没有设置最短请求间隔和最多请求次数。
那么会发生什么的,很明显,穷举攻击,也就是攻击者通过字典,无限次尝试所有可能,直到最终试出用户名和密码,从而实现对后台的入侵。
由于笔者对于后台架构的了解也不是很深入,只有短暂的作为用户的了解,现在的主流防御措施有,第一个,加验证码,用户输入不正确,即使是正确的账号密码也不允许登录,第二个,设置单IP的最多尝试次数,一个IP只允许你尝试特定次数,就像银行ATM机一样,尝试次数过多,判定为恶意尝试,直接拒绝。第三个,我能想到的,设置最短请求次数。因为穷举攻击有一个特性,就是需要很长的时间通过字典进行尝试,而攻击者通常为了效率,设置的尝试间隔都会很短,这样的话,很容易区分出正常请求用户与恶意攻击者,因为正常请求用户很难在单位时间进行如此多的尝试。
在这些措施中,第二个与第三个我并不是很了解,因为笔者还属于技术层面比较低级的阶段,网页编程中涉及IP和请求等方面的原理还是不太了解。对于第一个也只是停留在浅层次,为了项目需求,在网上查到了一些资料,记录在这里,希望能对读者有帮助。
基本原理是,由于Session的存在,我们将生成的验证字符和验证图片都存入session,然后读取用户输入的字符,进行比对,如果正确,则进行下一步的账号密码比对,如果错误,则直接弹出错误信息,强制用户重新输入。
这样就能在网站进行数据库操作之前,先验证用户是否为合法,从而实现对穷举攻击的有效防御。当前大多数网站系统都会有验证码系统,有的更高级一些,通过拖动滑块到指定位置,还有比如12306的点击物体的方式,其实本质上都是为了验证用户请求的合法性,这样一想,对于12306的近乎严厉的验证方式是不是也有些宽容了呢。
附上一些核心代码的图,当然笔者对于PHP语言的了解也不是很深刻,只能通过注释略微读懂代码的原理和应用方式,希望能有一些参考价值吧,代码非原创,请勿作为商业用途。
可以看到主函数的大致内容就是生成四个随机数字,并将随机数字画成图片供用户来识别,画图的方法用的ymagestring()方法,各个参数也都很好的解释了,这样一看应该不难理解。
下面是验证模块。
可以看到,用的是嵌套架构,先验证验证码机制,然后打开session,如果验证码正确,通过SQL查询用户名和密码是否正确,如果正确跳转管理界面,并设置session名为登录名,如果错误,提示错误用户名或密码,当然最后是如果验证码错误,提示Wrong Verification code。很真实。
这个便是简单的验证机制了,当然还有第二种基于IP的和第三种基于请求间隔的,由于项目没有要求,笔者没有过多的探求了。写在这里权当学习笔记,如果能给各位一些参考更好了。
领取专属 10元无门槛券
私享最新 技术干货