文章目录
- 一、抓包分析
- 二、加密分析
- 一、重写加密
一、抓包分析
分析站点:
aHR0cDovL2VpcC5jaGFuZmluZS5jb20v
首先我们提交一下登陆信息:
搜索j_password查看加密函数:
把上图搜索到的encryptPassword函数拿出来分析一下:
function encryptPassword(){ document.forms[0].j_password.value = desEncrypt(document.forms[0].j_password.value);
}
- 根据desEncrypt函数名推测是DES的对称加密方式
- desEncrypt函数参数是用户填写的,加密函数只需要一个参数
二、加密分析
我们根据断点提示进入desEncrypt函数:
代码如下:
function desEncrypt(value, xForm, type) {if (_0(xForm)) {return value} else {var keyObj = {};if (type == null || "aes" == type.toLowerCase()) {keyObj = SECURITYKEY.get();value = CryptoJS.AES.encrypt(value, CryptoJS.enc.Utf8.parse(keyObj.key), {iv: CryptoJS.enc.Utf8.parse(keyObj.iv)}).toString()} else {keyObj = SECURITYKEY.get('des');value = CryptoJS.DES.encrypt(value, CryptoJS.enc.Hex.parse(keyObj.key), {iv: CryptoJS.enc.Hex.parse(keyObj.iv)})}return keyObj.security + value}
}
一看确定是DES加密方式,通过分析上面的代码可知,在里面只使用了第一个参数即value,xForm和type都没有使用,根据上面代码逻辑分析,只需要把上面的代码进行改写成需要的即可
虽然我们只需要传一个密码明文,但是在上面加密函数里面还需要keyObj.key和keyObj.iv两个参数,而这两个参数值皆来源于keyObj,即SECURITYKEY.get()
在上面代码的上文中找SECURITYKEY.get()相关的代码如下所示:
_2: function() {$.ajax({async: false,dataType: "script",url: Com_Parameter.ResPath + "js/session.jsp?_=" + new Date().getTime()});var str = "";if (window.getSessionId) {str = getSessionId()}return str},supportEncodings: function() {return ["aes", "des"]},get: function(encodeType) {var str = SECURITYKEY._2();if (encodeType == null || encodeType == 'aes') {if (str.length < 32) {str += "abcdefghijklmnopqrstuvwxyz1234567890"}str = str.toUpperCase();var key = {};key.key = str.substring(0, 16);key.iv = str.substring(16, 32);key.security = "\u4435\u5320\u4d35"} else {if (str.length < 16) {str += "abcdefghijklmnopqrstuvwxyz"}str = str.toUpperCase();var key = {};key.key = SECURITYKEY.toHexString(str.substring(0, 8));key.iv = SECURITYKEY.toHexString(str.substring(8, 16));key.security = "\u4445\u5320\u4d45"}return key},
通过上面的代码可知,SECURITYKEY.get()返回的是一个key对象,而key这个对应保存了key,iv和security,这三项就是加密所需要用到的
key,iv和security的值通过下面的代码可以确定:
var key = {};key.key = str.substring(0, 16);key.iv = str.substring(16, 32);key.security = "\u4435\u5320\u4d35"而str字符串则是由SECURITYKEY._2()生成的。SECURITYKEY._2()对应的代码是:if (window.getSessionId) {str = getSessionId()}
也就是说str是它的SessionId,如下图所示:
这个网站用的是DES对称加密方式,加密时用到两个参数key和iv,以及把加密后的字符串与security拼接成最终加密字符串,而这三个相关的参数是把该网站的SessionId进行处理得到的。所以,最终要实现加密只需要通过python的requests打开登录页面获取SessionId值就行
一、重写加密
改写加密函数代码:
function getPwd(value)
{var str = '46D6F0AC53B420C83D055ED3486F601F';var key = str.substring(0, 16);var iv = str.substring(16, 32);var security = "\u4435\u5320\u4d35"if (str.length < 32) {str += "abcdefghijklmnopqrstuvwxyz1234567890"}value = CryptoJS.AES.encrypt(value, CryptoJS.enc.Utf8.parse(key), {iv: CryptoJS.enc.Utf8.parse(iv)}).toString()return security + value
}
也可以把整个文件代码复制过来,然后调用里面的加密函数。这样更省事
如下扣取加密代码:
把文件aes.js整个代码复制过来放到getPwd(value)函数上面进行调用
好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章