javascript代码混淆与加解密
开发一个python的程序,功能很简单,对某个网页发送post请求,把response的结果解析后存入数据库,供后续分析。
抓包
首先是抓包,使用burp suite,发现该网页原始的post请求如下:
因存在隐私信息,部分字段值已修改
uid=487f764baab641be902f4dxxxxxxxxx×tamp=1596436610125&sign=iNtdr75WKc7VHmbn8pu4VLqddoLEhupmin6LSi8vj%2Bn%2FyJ0zHlu34LVqQojiN4K6OoB6ggz0Q5NSx6rxxxxxxx%3D%3D
uid应该是该用户的id,timestamp为当前时间戳,很好理解,sign暂时不去管它。
在burp里,使用repeat重新发包,修改timestamp时间戳字段后,无法收到response,怀疑sign为验证标识。
继续使用原来的时间戳,可以收到response包,但是一段时间后,时间戳失效,不再能收到response。
分析如下:
网站为了防止DDOS攻击,设置了请求验证,通过加密算法把用户id和当前时间戳进行加密后,放入sign字段中。在服务器端解密后验证,如验证通过,返回response,验证不通过,丢弃请求包。
timestamp字段应该是用于sign有效期判断,超过一定时间,该sign失效。
代码审计
打开网页源代码,发现加密js代码:
<!-- 加密start-->
<script src="js/httpUtil.min.js"></script>
<script type="text/javascript" src="plugins/CryptoJSv3.1.2/rollups/tripledes.js"></script>
<script type="text/javascript" src="plugins/CryptoJSv3.1.2/components/mode-ecb-min.js"></script>
<script src="plugins/bootstrap-table-1.11.0/bootstrap-table.min.js"></script>
<script src="plugins/bootstrap-table-1.11.0/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="plugins/jquery.tmpl.min.js"></script>
<script src="plugins/DESUtil.min.js"></script>
打开最后一个js文件,内容如下:
eval(function(p, a, c, k, e, d) {e = function(c) {return (c < a ? "": e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))};if (!''.replace(/^/, String)) {while (c--) d[e(c)] = k[c] || e(c);k = [function(e) {return d[e]}];e = function() {return '\\w+'};c = 1;};while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);return p;
} ('3 T(e,t,n){t=G==t||""==t||D 0===t?{A:(9 b).B()}:t;5 r=(9 b).x();t.v=r;5 o=f(d(t));t.u=o,$.s({w:"l",i:t,J:e,P:"R",m:3(e){},p:3(e){n(e)},k:3(e,t){},z:3(e){}})}3 Q(e,t,n){t=G==t||""==t||D 0===t?{A:(9 b).B()}:t;5 r=(9 b).x();t.v=r;5 o=f(d(t));t.u=o,$.s({w:"l",i:t,J:e,14:!1,10:!1,11:!1,m:3(e){},p:3(e){n(e)},k:3(e,t){},z:3(e){}})}5 c="12",7="Z";3 f(e){5 t=2.4.8.6(c),n=2.4.8.6(7);h y=2.j.13(e,t,{7:n,a:2.a.E,I:2.L.O}),2.4.q.U(y.K)}3 W(e){e=2.4.q.6(e).N();5 t=2.4.8.6(c),n=2.4.8.6(7);h 2.j.S({K:2.4.V.6(e)},t,{7:n,a:2.a.E,I:2.L.O}).N(2.4.8)}3 d(e){5 t="",n=[];H(M C e)n[n.F]=M;H(g C n.Y(),n)t=t+n[g]+"="+e[n[g]]+",";h t=t.X(0,t.F-1)}', 62, 67, '||CryptoJS|function|enc|var|parse|iv|Utf8|new|mode|Date|key|mapSortToString||encryptByDESModeCBC|value|return|data|DES|complete|post|beforeSend|||success|Base64||ajax||sign|timestamp|type|valueOf|encrypted|error|date|getTime|in|void|CBC|length|null|for|padding|url|ciphertext|pad|thisKey|toString|Pkcs7|dataType|ajaxDESWebUploadImg|json|decrypt|ajaxDESWeb|stringify|Hex|decryptByDESModeCBC|substring|sort|asdewqrf|processData|contentType|keycansr|encrypt|cache'.split('|'), 0, {}))
我们看到有这部分代码
while(c–)if(k[c])p=p.replace(new RegExp(’\b’+e©+’\b’,‘g’),k[c]);return p;
这个是标准的javascript混淆加密压缩
用document.getElementById(‘textareaID’).innerText=p; 替代 return p;
放入普通html文件的body部分打开,得到javascript代码如下:
function ajaxDESWeb(e, t, n) {t = null == t || "" == t || void 0 === t ? {date: (new Date).getTime()}: t;var r = (new Date).valueOf();t.timestamp = r;var o = encryptByDESModeCBC(mapSortToString(t));t.sign = o,$.ajax({type: "post",data: t,url: e,dataType: "json",beforeSend: function(e) {},success: function(e) {n(e)},complete: function(e, t) {},error: function(e) {}})
}
function ajaxDESWebUploadImg(e, t, n) {t = null == t || "" == t || void 0 === t ? {date: (new Date).getTime()}: t;var r = (new Date).valueOf();t.timestamp = r;var o = encryptByDESModeCBC(mapSortToString(t));t.sign = o,$.ajax({type: "post",data: t,url: e,cache: !1,processData: !1,contentType: !1,beforeSend: function(e) {},success: function(e) {n(e)},complete: function(e, t) {},error: function(e) {}})
}
var key = "keycansr",
iv = "asdewqrf";
function encryptByDESModeCBC(e) {var t = CryptoJS.enc.Utf8.parse(key),n = CryptoJS.enc.Utf8.parse(iv);return encrypted = CryptoJS.DES.encrypt(e, t, {iv: n,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}),CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
function decryptByDESModeCBC(e) {e = CryptoJS.enc.Base64.parse(e).toString();var t = CryptoJS.enc.Utf8.parse(key),n = CryptoJS.enc.Utf8.parse(iv);return CryptoJS.DES.decrypt({ciphertext: CryptoJS.enc.Hex.parse(e)},t, {iv: n,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)
}
function mapSortToString(e) {var t = "",n = [];for (thisKey in e) n[n.length] = thisKey;for (value in n.sort(), n) t = t + n[value] + "=" + e[n[value]] + ",";return t = t.substring(0, t.length - 1)
}
注意到以下代码
o = encryptByDESModeCBC(mapSortToString(t));t.sign = o,
sign是通过这里得到的
继续寻找encryptByDESModeCBC和mapSortToString
看到mapSortToString是把uid和timestamp用逗号分隔的等式拼接后,用CryptoJS的加解密库进行DES加密
从js代码中还可以看到加解密使用的key和IV
var key = "keycansr",
iv = "asdewqrf";
解密验证
为了验证我们代码审计的结论,把抓包的sign用python进行DES解密
代码如下:
myDes.py
from Crypto.Cipher import DES
import base64class DESUtil:__BLOCK_SIZE_8 = BLOCK_SIZE_8 = DES.block_size__IV = "asdewqrf" # __IV = chr(0)*8@staticmethoddef encryt(str, key):cipher = DES.new(key, DES.MODE_CBC, DESUtil.__IV)x = DESUtil.__BLOCK_SIZE_8 - (len(str) % DESUtil.__BLOCK_SIZE_8)if x != 0:str = str + chr(x)*xmsg = cipher.encrypt(str)# msg = base64.urlsafe_b64encode(msg).replace('=', '')msg = base64.b64encode(msg)return msg@staticmethoddef decrypt(enStr, key):cipher = DES.new(key, DES.MODE_CBC,DESUtil.__IV)# enStr += (len(enStr) % 4)*"="# decryptByts = base64.urlsafe_b64decode(enStr)decryptByts = base64.b64decode(enStr)msg = cipher.decrypt(decryptByts)print(msg)print(len(msg))print(msg[len(msg)-1])#paddingLen = ord((msg[len(msg)-1]))paddingLen = msg[len(msg) - 1]return msg[0:-paddingLen]if __name__ == "__main__":mySign = 'iNtdr75WKc7VHmbn8pu4VLqddoLEhupmin6LSi8vj%2Bn%2FyJ0zHlu34LVqQojiN4K6OoB6ggz0Q5NSx6rxxxxxxx=='key = 'keycansr'print(DESUtil.decrypt(mySign, key)
执行结果如下:
b'timestamp=1596436610125,uid=487f764baab641be902f4dxxxxxxxxx'
验证了我们之前代码审计的结论
构造POST请求
知道加解密算法后,很容易就构造POST请求
代码如下:
sendHttps.py
import requests
import time
from myDes import *
from requests.packages import urllib3urllib3.disable_warnings()uuid = '487f764baab641be902f4dxxxxxxxxx'
ttime = time.time()*1000
key='keycansr'
sstr = "timestamp="+str(ttime)+',uid='+uuid
ssign = DESUtil.encryt(sstr, key)
#print(ssign)
data = {'uid':uuid, 'timestamp':ttime, 'sign':ssign}
req = requests.post('https://xxxx.com/api/user/userAccount/list',data=data,verify=False)
print(req.text)
后续就是对req.text的内容进行json解码和正则分析,然后插入到PostgreSQL的数据库中进行分析。
javascript代码混淆与加解密相关推荐
- 前端JavaScript代码混淆加密原理介绍
因为JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果,但是由于没有纯粹的加密方案 ...
- 几维安全Javascript代码混淆(js加密)在线使用说明
2019独角兽企业重金招聘Python工程师标准>>> 几维安全Javascript代码混淆是一项在线加密服务,用户只需将JS文件打包成zip包,提交到加密平台,即可完成代码混淆.字 ...
- android 加花工具下载,Android 代码混淆并加花
APK安全: 代码混淆且加壳防止反编译 1.用到的工具jd-gui-0.3.5.windows dex2jar-0.0.9.15 IDAProv6.8 C32Asm DexFixer Windowss ...
- .NET程序的代码混淆、加壳与脱壳
通常我们通过代码混淆.加密的形式达到软件保护的目的.在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆.加密从而实现对核心JS代码的保护.如果没有接触过的可以在这里简单了解一 ...
- html js页面加载前执行,Javascript代码在页面加载时的执行顺序介绍
一.在HTML中嵌入Javasript的方法 1.直接在Javascript代码放在标记对之间 2.由标记的src属性制定外部的js文件 3.放在事件处理程序中,比如: 点击我 4.作为URL的主体, ...
- C# 代码反编译、代码混淆与加壳工具
最近在开发C#程序,为了保证代码不被破解,经过对比,发现有几款工具很不错.接下来逐个进行介绍. 一.代码反编译工具.NET Reflector 直接查看exe源代码,类似Java的jad.为了防止别人 ...
- JavaScript代码混淆加密
www.safekodo.com 众所周知,JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制 ...
- JavaScript 代码混淆实战(七)|逗号表达式的混淆
著名的5s盾,对js代码进行了大量的混淆,其第一层js代码中,逗号表达式非常的多.研究后,我自己也搞了几个简单的实例来生成逗号表达式,感觉其实所谓的混淆也挺简单的. 一.插件名称 逗号表达式混淆. 二 ...
- 【crypto】基于crypto.js的web前端加解密系统实现
文章目录 一.概念介绍 1.1 crypto.js介绍 1.2 加密 / 哈希 / 编码 1.2.1 加密/解密 1.2.2 散列/哈希 1.2.3 BASE64编解码 二.加解密思想(以md5为例) ...
最新文章
- 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
- IDEA Maven 项目默认编译项目为JDK 1.5
- distribution counting—a sorting method from aocp
- 通过MageUi.exe修改通过ClickOnce发布过的WPF browser application 配置文件
- 《JavaScript DOM 编程艺术》 读书笔记
- ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测daiding
- CentOS6.5安装perl5.0(tar压缩包方式),有错误you may have to set your dynamic library LD_LIBRARY_PATH
- 【看动漫学编程】程序员在异世界生个娃 第1篇:太极村
- Centos6.4下安装mysql5.6.10
- python接口自动化(四十二)- 项目架构设计之大结局(超详解)
- 高考数据分析和读书感悟
- python处理excel的优势-用Python读写Excel文件的方式比较
- 高级插座的过载保护是否真的可靠?
- KubeSphere 3.3.0 离线安装教程
- JS全国城市数组列表
- 数据中台(五)数据开发:数据价值提炼工厂
- 英文信详解:申请信、推荐信等等
- Postman如何设置为中文
- 苹果cms v10影视网站数据采集
- 帆软报表在已经搭载服务器上开发_报表案例_数据报表开发_做报表的步骤_报表开发流程-帆软...
热门文章
- MAGICIAN IS CASTOR (Castor JDO,Castor XML,魔术)
- egret 自动生成代码插件 EgretAutoCodeEui vscode,wing可以使用
- html td如何设置字体加黑,如何在td中控制字体右对齐且加粗_html/css_WEB-ITnose
- webpack 打包流程(初学)
- 网站源码下载[建站]
- 安卓版微信内置浏览器,a href=tel:电话号码/a 这个链接失效,跳到拨号界面
- 企微版scrm系统如何导出客户资料?
- QinQ初识--qinq基础知识
- 火狐浏览器安装接口测试工具RESTClient方法
- ZCuZn24Al6Fe4Mn3高力黄铜