当前位置: 首页 > news >正文

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

文章目录

  • 一、抓包分析
  • 二、加密分析
  • 一、重写加密

一、抓包分析


分析站点

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.keykeyObj.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对称加密方式,加密时用到两个参数keyiv,以及把加密后的字符串与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 &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)函数上面进行调用

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

http://www.lryc.cn/news/139640.html

相关文章:

  • 面向对象的理解
  • java ssl加密发送邮件
  • SpringBoot-yml配置文件的使用与优势
  • Layer Normalization(层规范化)
  • redisson参数配置
  • 【基于Arduino的仿生蚂蚁机器人】
  • angular12里面FormGroup做多个项目的相关check
  • TypeScript 的发展与基本语法
  • macOS - 上编译运行 risc-v (spike)
  • Linux--线程地址空间
  • 华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)
  • RNN+LSTM正弦sin信号预测 完整代码数据视频教程
  • 如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态
  • 字节跳动 Git 的正确使用姿势与最佳实践
  • 龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP
  • Spearman Footrule距离
  • docker 安装 Wordpress 用lnmp搭建出现的故障
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
  • 【Spring框架】Spring事务的介绍与使用方法
  • 七夕特别篇 | 浪漫的Bug
  • 数据结构双向链表
  • 解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案
  • redis 7高级篇1 redis的单线程与多线程
  • GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程
  • vue ui 创建项目没有反应
  • go语言中channel类型
  • 基于STM32F1的电子罗盘HMC5883L角度测量
  • Oracle解锁表、包、用户、杀会话、停job
  • 软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用
  • Redis Pub/Sub 指南