小议如何绕开验证码(原理)
验证码就是每次访问页面时随机生成的图片,内容一般是数字和字母(更BT点的还有中文,呵呵),需要访问者把图中的数字字母填到表单中提交,这样就有效地防止了暴力破解,验证码也用于防止恶意灌水、广告帖等等,以避免服务器遭受恶意攻击!
那么,验证码机制又该如何实现。
目前主流的实现技术主要有session和cookie两种方式,而这两种方式可以说技术是一样的,区别在于将验证码字符串存储在服务器还是客户端。
前者工作流程:服务器发送验证码图片到客户端并在服务器保存验证码字符串到session,用户辨认图片并提交验证码字符串到服务器,服务器将用户提交的验证码字符串与session中保存的字符串进行比较。
后者工作流程:服务器发送验证码图片以及验证码字符串(可能会进行加密)到客户端,客户端将验证码字符串存储到本地cookie,用户辨认图片并提交验证码字符串以及cookie中所存储的字符串到服务器,服务器将用户提交的两个字符串(进行解密后)进行比较。
相对而言,存放在服务器的session更为安全,只不过消耗服务器内存,程序员除了使用模式识别辨认出验证码,没有其他办法。而对于使用cookie方式的验证码,不增加服务器内存消耗,但我们可以通过对传输数据进行分析轻易破解验证码。
溯雪是早年大名鼎鼎的黑客神器“刀光雪影”之一,其功能就是暴力破解表单,那时很是很流行的。但是后来有了验证码这个东东,几乎把溯雪推向了死路。但是真的完全是死路了吗?
(这个软件是利用asp、cgi对免费信箱、论坛、聊天室进行密码探测的软件。密码探测主要是通过猜测生日的方法来实现,成功率可达60%-70%。溯雪的运行原理是通过提取asp、cgi页面表单,搜寻表单运行后的错误标志,有了错误标志后,再挂上字典文件来破解信箱密码。由于许多人对密码的设置采用了自己的生日或常用英文单词等较简单的方式,这给溯雪留下了很大的施展空间。)
对于验证码机制,网上的攻击手法都是利用数学方法分析图片,当然我们不能老是跟着别人的思路走噻,那样多没创意撒!
破解方式一:session
想想验证码的思路:就是每次在登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到session里,提交的时候验证登陆的脚本就会判断提交的验证码是否与session里的一致。
问题出现了,在登陆密码错误之后,我们不去访问生成验证图片的文件,那么如果session中的验证码没有被清空,此时验证码就是跟上次的一样,辛辛苦苦构建的防暴力破解就形同虚设了。
大致解决方法:密码错误之后session中的验证码值被置空且每次检查验证码的时候先检查是否为空,并重新发送新的id至session.
PowerEasy2005的管理员登陆页面就是个很好的实例,只要我们把首次访问的验证码辨认出来,以该会话cookie值不断提交就可以实现暴力破解了。图中就是用溯雪破解的结果。
类似的情况还有PJBlog2的登陆验证,其他的程序没看,体力活了,不好玩。
破解方式二:cookie欺骗
方式1,通过模式识别辨认出图片所承载的验证码字符串,然后提交的时候直接发送识别的字符串。
方式2,通过解密破译出verifysession的明文。
方式3,提前获得几组甚至几百几千组验证码(需要人眼识别,人手输入)及其密文。而且所获得的验证码还不能闲置太长时间(以防验证码过期),在特定时间连续并快速的提交。
利用验证码的漏洞还可以实现DOS(还有刷投票之类的,呵呵),比如这个CSDN博客系统,回复的验证码就存在这个问题,所以你可以抓包不断提交(喂,先说好,不准拿我试验)