某网站DES加密逆向分析实战

文章目录

一、抓包分析


分析站点

aHR0cDovL2VpcC5jaGFuZmluZS5jb20v

首先我们提交一下登陆信息:

搜索j_password查看加密函数:

把上图搜索到的encryptPassword函数拿出来分析一下:

javascript 复制代码
function encryptPassword(){ 
	document.forms[0].j_password.value = desEncrypt(document.forms[0].j_password.value);
}
  • 根据desEncrypt函数名推测是DES的对称加密方式
  • desEncrypt函数参数是用户填写的,加密函数只需要一个参数

二、加密分析


我们根据断点提示进入desEncrypt函数:

代码如下:

javascript 复制代码
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.keykeyObj.iv两个参数,而这两个参数值皆来源于keyObj,即SECURITYKEY.get()

在上面代码的上文中找SECURITYKEY.get()相关的代码如下所示:

javascript 复制代码
_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的值通过下面的代码可以确定:

javascript 复制代码
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对称加密方式,加密时用到两个参数keyiv,以及把加密后的字符串与security拼接成最终加密字符串,而这三个相关的参数是把该网站的SessionId进行处理得到的。所以,最终要实现加密只需要通过python的requests打开登录页面获取SessionId值就行

一、重写加密


改写加密函数代码:

javascript 复制代码
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 &lt; 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)**函数上面进行调用

好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

相关推荐
databook14 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar15 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805115 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_15 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i1 天前
drf初步梳理
python·django
每日AI新事件1 天前
python的异步函数
python