背景介绍

  我们学校的教务系统的是以学生学号作为登陆账号,初始密码是自己的生日。

 

一点点想法

  每次期末查成绩的时候,我都会有一个想法,要是我能跑到系统后台,把自己的成绩修改一下,那该时间多么舒坦的事情啊。当然,我目前还并没有这么做。^_^  光看自己的成绩不过瘾,有时候还想看下同学的成绩。怎么办呢?突然,我发现我从来没有改过我的密码,那会不会有很多人像我这样,没有改密码呢?如果是这样,那么密码就应该主要局限于1991年到1994年的所有日期了,空间集就大大减小了。那我是不是可以暴力得进行破解呢?如果这样就直接不停地给服务器发送http数据包,并分析服务器相应的结果,不就可以了么?好了,基本的思路我有了,由于只是在应用层上做文章,我打算用C#实现。

 

开始尝试,发现困难

  我利用fiddle捕获了点击登录按钮后,发送给服务器的数据结果如图:

      C#构造Http 破解学校教务系统学生账号密码

  这是HTTP数据包的头部,另外post的数据为:

  C#构造Http 破解学校教务系统学生账号密码

  遮住的部分是我的学号,结果我发现password发送的居然不是我的生日,而是一串很长的字母数字串,于是我查看网页源码,发现里面有一段这样的的js语句:

  

<form name="frmLogin" method="post" action="./Servlet/UsersControl" onsubmit="return selectType();">
………………………………
</form>

function selectType()
{
    …………
    change();   
}


function change()
{
     var pw = document.frmLogin.password.value;
     pw = hex_md5(pw);
     pw = hex_md5(pw+sharedValue); //用共享数值再次加密
     document.frmLogin.password.value = pw ;
}

  简单的说一下这一段的意思,form就是我们提交的表单,点击登录按钮之前调用 selectType(),selectType()在代码的最后面调用了change()函数,而change()函数改变了我们提交给服务器的密码值。而且在change()函数里shareValue这个值每次请求,服务器返回的值是不一样的,服务器通过这个值来对密码进行加密。这下算是总算明白为什么会提交一串看不懂的数字字母了(而且每次还不一样,因为shareValue每次都不一样)。

  进一步挖掘,发现hex_md5这个函数,在一个js文件里面,这个文件里面存在这一下加密函数,对输入参数做了很复杂的变换,我简单地看了一下里面的逻辑,发现都是一点函数的调用,并没有涉及到其他的文件与资源。到这里,我们已经基本了解了整个加密过程。于是,只要我们按照这样的顺序对密码进行同样的处理,就能得到正确的密码。而在C#有个开源项目 Javascript .NET,可以通过它去调用并执行Js。

  但问题并没有这么简单,细心的你观察Http数据包头部可以发现里面的cookie有三个参数,而且前两个是通过Js直接设置的,最后一个是服务器设置的。所以通过C#中的HttpWebRequest对象请求,只能得到最后一个JSESSIONID的值,例外两个需要在程序里面另外设置。

 

最终实现

  实现框架:

        for :date从1991到1994年所有的日期

        if(Crack(学号,date)){

          破解成功;

        }

    bool Crack(学号,日期){

        构造合适的HttpWebRequest对象请求登陆页面;

        分析网页代码得到shareValue的值并与日期一起传递给加密函数得到Post数据里面的password;

        将得到的cookie值提取出来,赋给下一次请求的HttpWebRequest对象,同时添加另外两个cookie值;

        再次发起请求通过分析服务器相应判断该日期是否正确,正确返回true,不正确返回false;

    }

     实践中发现单纯使用这种方式破解一个账号的速度大约是30分钟,主要原因是每次网络请求的开销比较大。后来我在原来思路的基础上,加入了多线程的方法,把破解速度提高到平均每3-5分钟破解一个。

具体代码:

 1     public class Date {
 2         public int y1;
 3         public int y2;
 4         public int m1;
 5         public int m2;
 6         public int d1;
 7         public int d2;
 8         public string stuNumber;
 9 
10         public Date(int a, int b, int c, int d, int e, int f,string num) {
11             y1 = a;
12             m1 = b;
13             d1 = c;
14             y2 = d;
15             m2 = e;
16             d2 = f;
17             stuNumber = num;
18         }
19     }
View Code

相关文章:

  • 2021-11-20
  • 2021-11-20
  • 2022-12-23
  • 2022-12-23
  • 2021-07-12
  • 2022-02-09
  • 2021-12-10
猜你喜欢
  • 2022-01-06
  • 2021-11-17
  • 2022-12-23
  • 2021-06-16
  • 2021-07-07
  • 2021-11-07
  • 2021-08-17
相关资源
相似解决方案