最近要对网站做一个升级,考虑到安全性的问题,因此对网站整体检查了一遍,发现几处需要完善的地方。其中一个就是用户登录的问题。原网站没有增加验证码的功能,只是单纯的一个用户名和密码的文本框,点击登录按钮后,如果成功便进入系统,如果账号不存在或密码错误,将对用户提示。如图:
这样会给网站破解者提供机会,如果想得到进入系统的权限,可以尝试暴力破解法。
如果知道某个用户名,不知道密码,则可以编写密码字典暴力破解;
如果不知道用户名,则可以编写用户名和密码字典暴力破解;
要暴力破解,就要伪装提交数据包。首先要找到POST地址,可以使用httpwatch来获取到POST地址、发送的头信息(Headers)和POST的数据。
然后把字典内容作为参数传递。
根据返回的数据包判断是否登录成功(如数据包中包含登录的错误提示,表示没有成功),如果成功记录当前循环判断的字典数值,它就是可以登录系统的用户名和密码,接着继续执行后面的循环直到结束。
为了防止暴力破解,网站登录需要加一个随机的验证码。可是,有的用户不喜欢这个验证码,因为让他们多敲击了一次键盘。我们可以加这样的功能来满足他们的需求。可以加一个判断,如果输入的用户名或密码连续错误N次,便提示输入验证码。这样就解决了这个问题,而且给给破解者带来了麻烦,当然如果他能破解验证码,那增加的这个防护功能,就不起作用了。
修改后,若登录失败超过N次后,登录界面显示如下图:
2012-10-30 补充:
对于暴力破解,或理解为批量验证账号密码的方法上文有所提及,下面补充一下一般操作需要注意的地方。
1.首先取得表单发送的POST请求的信息,主要包括POST地址,提交的数据(如用户名和密码的参数),header信息。
2.通常只需要只要POST地址和提交的数据时传递参数就够了,但有时候服务器会防止外连接做一些处理,这个时候就需要设置一下header的Referer信息。Referer,是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。 如可以使用Request.ServerVariables("HTTP_REFERER")防外连接。
3.发送请求的方法有几种,一种方法是使用MSXML2.XMLHTTP类,需要添加引用Microsoft XML v6.0,不过在使用这种方法的时候,偶尔会发现在处理个别网站时,明明参数都设置正确的,但是请求返回的结果就是不正确,这时候你需要考虑第二种方法,使用WinHttp.WinHttpRequest类来处理请求数据,需要添加引用Microsoft WinHTTP Services,version 5.1
4.因为是批量验证账号和密码,所以有必要考虑使用线程控制,及可以暂停、继续或停止任务,否则程序给你的感觉会一直卡在那直到运行结束。
5.如果使用了线程,你需要告诉用户当前的进度,需要让用户知道总共需要验证的数目,和当前正在验证的位置。
6.如果碰到封IP的情况,你还需要考虑自动断网,自动拨号以获得新IP的问题。
7.最为困难的是碰到验证码的防护,如在上文中讲到,一旦在网站中加入了验证码的机制,就必须考虑怎么样绕过验证码的防护,这将是对程序员的一大挑战。
评论