在数据库中,密码杂乱无章,用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); } }