深圳市教育局学生学籍管理系统加密

在数据库中,密码杂乱无章,用USER_PASSWORD字段内容直接登录显示密码不对。一开始以为是数据库不对,后来全都试了还是登不上
第一感觉就是,密码被加密了,但是密码长度不一,说明很可能有的解。

后台有邮箱和短信找回密码功能,我改了管理员的邮箱和手机,邮箱找回失败,手机找回收不到短信。
那么没办法了,JSP的环境,class文件太费解,试试破解算法吧,兴许很简单

首先看密码

klmngh,qjmo,rlnh,5?+$,4=((,rjjjjj,hjlfhjlf,ehkfid,qponml,olinkh,olinkh,nljh,IkWGPIDX,oooo,olinkh,lnpjlf,klmngh,kmoko,knil,olinkh,nkpmj,njnjnj,lrmqll,olinkh,*(**oq,$$(*kj,klmngh,lplh,lplh,lplh,lnpjlf,nnkqnj,illmjo,jhlmnj,pnljhf,pnljhf,mpknil,knil,.&;2<3,68jl,jqogild,jrOPoEMC,*(**on,qponml,opqj,0*?2,/9&(,mjol,qponml,iqsj,qponml,knil,pnljhf,njnjnj,onml,onml,lnpjlf,mpkolq,rlnh,qponml,kdllmj,qponml,jhfjhf,olinkh,3;%$,hdhgkg,ppph,pnljhf,ppph,nero,nljh,qjkl,QDFPoaqi,igmkqo,mjol,njnjnj,njnjnj,hplo,njnjnj,mpsnql,flpmjk,lnpjlf,knil,rlnh,mpknil,7:ng,lnpjlf,klmngh,klmngh,klmngh,knil,onml,efgkde,6668-,njnjnj,mnohijkd,llljjj,7<,pnljhf,pnljhf,62qkmoqk,olinkh,plplplpl,llho,knil,onml,qlmgfgml,hdhgkg,onml,hdhgkg,hdhgkg,hdhgkg,ihgf,olinkh,56fg,mpsnql,mfghij,snqk,pnljhf,miinni,nljh,mm&,*",nljh,ejgd,gmdknfpl,mpknil,qponml,-0+.1,/*

看样子是每个学校都有人在管理学籍,权限不同罢了。

既然这样,那就太好办了,肯定有密码1234,123456或者0000这类的密码的。
原因很简单,看密码有很多重复的,既然用了一样的密码,生日,手机号做密码的可能性很小。

于是我就猜解123456的密码。密码长度不一,筛选6位的
于是锁定在hdhgkg和olinkh上面,这两个可能是123456的加密后的密文

实践证明olinkh就是明文密码123456的密文,于是数据库中各种改权限各种升权
可是这不是我想要的,这密码算法才是想要的
通过修改个人密码,发现密文这样的变化:

0000 nlrp
0001 nlro
0011 nlgo
0111 nkqo
1111 mkqo
00000 omsqo
00001111 rpnlqomk
123456789 qnkhmjgd

看似无规律但是却又有规律,说不出个所以然来。
用admin加密为bfpms的方式解出来的虽然看似也像密码,但是和真实的密码谬以千里。
于是各种算啊。

最后还是去找class文件反编译吧,工夫不负有心人,找到了那个文件NewPassword.class
反编译为java后的代码如下:

passwordEncryption()函数

package emis.login;

import com.nf.log.Contant;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

public class NewPassword
{

    static char digits[] = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
        'U', 'V', 'W', 'X', 'Y', 'Z'
    };
    private static Logger log;

    public NewPassword()
    {
    }

    public static String genPassword()
    {
        String password = "";
        for(int i = 0; i < 8; i++)
        {
            int temp = (new Double(Math.random() * 997D)).intValue() % 36;
            password = (new StringBuilder(String.valueOf(password))).append(String.valueOf(digits[temp])).toString();
        }

        return password;
    }

    public static String passwordEncryption(String uid, String pwd)
    {
        int encryptcode = 0;
        for(int i = 0; i < uid.length(); i++)
        {
            encryptcode += uid.charAt(i) * (i + 1);
        }

        char c[] = {
            '0', '0', '0', '0', '0', '0', '0', '0'
        };
        for(int i = 0; i < pwd.length(); i++)
        {
            c[i] = (char)((156 - pwd.charAt(i)) + ((i + 1) * encryptcode + pwd.length()) % 8);
        }

        String newpwd = new String(c, 0, pwd.length());
        if(pwd.length() == 0)
        {
            return "********";
        } else
        {
            return newpwd;
        }
    }

    public static String transferStringForSql(String word)
    {
        char sql_word = '\'';
        String result = null;
        if(word == null)
        {
            return result;
        }
        result = "";
        for(int i = 0; i < word.length(); i++)
        {
            char c = word.charAt(i);
            if(c == sql_word)
            {
                result = (new StringBuilder(String.valueOf(result))).append(String.valueOf(c)).append(String.valueOf(sql_word)).toString();
            } else
            {
                result = (new StringBuilder(String.valueOf(result))).append(String.valueOf(c)).toString();
            }
        }

        return result;
    }

    public static void main(String argv[])
    {
        String s = "fmkpegp";
        log.info(s);
        s = passwordEncryption("400001", s);
        log.info((new StringBuilder("400001:")).append(s).toString());
        s = passwordEncryption("INTERN", "VTI[QP`P");
        log.info((new StringBuilder("INTERN:")).append(s).toString());
        s = passwordEncryption("admin", ")%-.71");
        log.info((new StringBuilder("admin:")).append(s).toString());
        s = passwordEncryption("80000001", "onml");
        log.info((new StringBuilder("80000001:")).append(s).toString());
    }

    static 
    {
        log = LogManager.getLogger(Contant.LoggerName);
    }
}