您的位置:首页 > 其它

破解某科大校园网帐号密码程序的设计及其实现

2010-12-17 10:53 381 查看
本日志目的是提醒各高校注意网络安全,以及帮助学校改进系统,绝无hack之意,转载注明出处……(出自shenyuanv的空间)


既然是设计及其实现,首先要说设计过程。说道设计过程,首先要感谢机组原理老师给我们安排了长达2小时的实验课,让我实验过程中在蜘蛛纸牌、扫雷都玩腻之后试图上网打发时间。

当在实验室电脑的浏览器输入www.ifeng.com回车后,竟然弹出了万恶的:



真是悲从中来啊,既然不让网页登录。那就试试从客户端登录呗,绕过浏览器看一下网页源码也能看出内容来不是,反正我想看的是新闻(还没有那个胆量在实验室上cl).

还好实验室里有netbean,于是简单测试一下连接互联网的功能,(部分代码):

URL url = new URL("http://www.ifeng.com");
URLConnection con = url.openConnection();
con.connect();
InputStreamReader isr = new InputStreamReader(con.getInputStream());
BufferedReader reader = new BufferedReader(isr);
StringBuffer sb = new StringBuffer();
while(reader.ready()){
sb.append(reader.readLine());
sb.append("/n");
}
System.out.println(sb.toString());


结果:

浏览器不支出java脚本

坑爹呢这是!

看到旁边有校园网帐号的童鞋已经在WEBQQ上聊的火热,哥怒了!于是随便输入了一个帐号密码期望RP大爆发……

。得到了大家都能想到的结果:



就当我即将放弃,已经点了返回按钮打算关闭登录器时,一个地方触动了我敏感的神经……好歹以前也写了那么多网站(模拟的,写着玩),在看到返回后的如下情形后:



童鞋们可能就要发问了,这有什么啊?很多网站都这样啊!当时我的脑海中闪过这个念头:这货没有验证码,这货没有验证码。是的!!!此登录系统的前端验证没有验证码!!!!!

它的前端反hack技术(找不到合适的名词形容这个技术)是用了延迟用户登录5秒,而且用地是javasrcript!

“有机会了!”这个念头一闪而过。以下动作均是为了帮助学校改进网络系统

于是保存网页,写字板打开此登录页面,修改源码,使之除了登录表单之外什么验证都没有!:

<form name=form1 method="post" action="表单提交的地址,可耻地匿了" onSubmit="return false;">
帐号 Account<input name="DDDDD" type="text"/><!--看了这个“DDDDD”一种智商上的优越感油然而生-->
密码 Password<input name="upass" type="text"/>
<input type="hidden" NAME="0MKKey" value="123456789"><!--我不知道这是神马-->
<button type= "submit" id="btn">登录 Login</button>
</form>


于是手动试了一下,随便输入帐号密码提交,跳转正常(当然是跳转到错误页面),最重要的是:当我拿出打星际的APM快速提交多次后,没有发现服务器端不接受同一IP短时间内快速提交表单的迹象!所以说,用一个程序实现暴力破解密码是应该行得通的了。

于是在本次机组原理实验课上,奠定了本人帮助学校提高网络安全的决心。于是决定等实验结束回到宿舍后写一个暴力破解密码的程序出来。

写到这里要感谢一下fei_xie童鞋,是他在本次老师要检查实验结果而我连本次实验要做什么都不知道的情况下,毅然决然地在老师不注意的时候偷偷地在登记册上我的名字后面画上了勾。。。

回到宿舍后,在考虑怎么自动提交表单比较容易实现,长期接触J2EE的我自然地想到了JS,最简单的方法实现原理如下:写一个WEB PROJECT,打开一个网页,从application里获得一个密码,然后将需要破解的帐号和获取的密码填入表单,使用JS自动提交,如果登录失败就继续试下一个密码,这里要求密码必须是纯数字,不以0开头。

但是问题来了,当网页跳转后,是不受你的WEB PROJECT控制的,所以就不能返回到自动登录的这个网页里来。

于是我尝试了iframe:将自动登录的这个网页以iframe嵌入到一个WEB PROJECT的网页中,那这样即使跳转后,自己写的项目里的网页仍然在打开状态,此时只要刷新本页面就可以继续自动登录。但经过尝试后发现使用iframe跨域后因为权限问题,iframe的母窗口是不能控制子窗口的,它甚至不能获得子窗口的网址,也就是说使用iframe的计划破产了。

那还有什么方法能自动登录呢?

本人研究后,发现使用JDK提交表单其实是最简单的方法(万能的JDK)

于是这段代码诞生了:

URL url = new URL(不告诉你);
url_con = (HttpURLConnection) url.openConnection();                                       url_con.setRequestMethod("POST");
url_con.setConnectTimeout(5000);
url_con.setReadTimeout(5000);
url_con.setDoOutput(true);
url_con.connect();
byte[] b = params.toString().getBytes();//params就是需要提交的帐号密码啦
url_con.getOutputStream().write(b, 0, b.length);
url_con.getOutputStream().flush();
url_con.getOutputStream().close();
InputStream in = url_con.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in,                    recvEncoding));
String tempLine = rd.readLine();
StringBuffer tempStr = new StringBuffer();
String crlf=System.getProperty("line.separator");
while (tempLine != null)            {
tempStr.append(tempLine);
tempStr.append(crlf);
tempLine = rd.readLine();
}


这里让我觉得很搞笑的是:在我只提交DDDDD和upass后,提示错误,不是提示帐号密码错误,而是表单错误,还记得那个奇怪的<input type="hidden" NAME="0MKKey" value="123456789">吗?好吧,我把这个也加到提交表单中,竟然可以了。。。写这个登录系统的人真是神奇。。。


使用此方法提交表单后,可以获得跳转后网页的源码,通过源码可以判断是否登录成功。

于是我用此方法做了一个循环,运行程序后自习去了,几个小时后回来发现只尝试了一千多次……唉,这个性能离破解还很远啊。

于是好久没用的线程派上用场了,100个线程同时运行,10+分钟大概能破解4位的密码。

尝试使用了1000个线程,但发现CPU占用到了98%,算了,为了刚买的本本着想,慢慢来。

于是在编译原理考完试后回来,发现了一条帐号记录以及一个3位的密码。。。。3位………………


-----------------------------------------

在此提醒各位童鞋,密码尽量复杂,还有,各位做网站的童鞋们,重视安全啊!!!

再次声明,此程序是作为帮助学校提高网络安全意识所用,如有人使用本文的方法“作案”,由作案人自己负责。。。

感谢小平给我精神上滴支持,再次感谢下谢胜飞童鞋帮我在机组实验上勾名字


转载注明出处……(出自shenyuanv的空间)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: