开发一个python的程序,功能很简单,对某个网页发送post请求,把response的结果解析后存入数据库,供后续分析。

抓包

首先是抓包,使用burp suite,发现该网页原始的post请求如下:

因存在隐私信息,部分字段值已修改

uid=487f764baab641be902f4dxxxxxxxxx&timestamp=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代码混淆与加解密相关推荐

  1. 前端JavaScript代码混淆加密原理介绍

    因为JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果,但是由于没有纯粹的加密方案 ...

  2. 几维安全Javascript代码混淆(js加密)在线使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 几维安全Javascript代码混淆是一项在线加密服务,用户只需将JS文件打包成zip包,提交到加密平台,即可完成代码混淆.字 ...

  3. android 加花工具下载,Android 代码混淆并加花

    APK安全: 代码混淆且加壳防止反编译 1.用到的工具jd-gui-0.3.5.windows dex2jar-0.0.9.15 IDAProv6.8 C32Asm DexFixer Windowss ...

  4. .NET程序的代码混淆、加壳与脱壳

    通常我们通过代码混淆.加密的形式达到软件保护的目的.在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆.加密从而实现对核心JS代码的保护.如果没有接触过的可以在这里简单了解一 ...

  5. html js页面加载前执行,Javascript代码在页面加载时的执行顺序介绍

    一.在HTML中嵌入Javasript的方法 1.直接在Javascript代码放在标记对之间 2.由标记的src属性制定外部的js文件 3.放在事件处理程序中,比如: 点击我 4.作为URL的主体, ...

  6. C# 代码反编译、代码混淆与加壳工具

    最近在开发C#程序,为了保证代码不被破解,经过对比,发现有几款工具很不错.接下来逐个进行介绍. 一.代码反编译工具.NET Reflector 直接查看exe源代码,类似Java的jad.为了防止别人 ...

  7. JavaScript代码混淆加密

    www.safekodo.com 众所周知,JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制 ...

  8. JavaScript 代码混淆实战(七)|逗号表达式的混淆

    著名的5s盾,对js代码进行了大量的混淆,其第一层js代码中,逗号表达式非常的多.研究后,我自己也搞了几个简单的实例来生成逗号表达式,感觉其实所谓的混淆也挺简单的. 一.插件名称 逗号表达式混淆. 二 ...

  9. 【crypto】基于crypto.js的web前端加解密系统实现

    文章目录 一.概念介绍 1.1 crypto.js介绍 1.2 加密 / 哈希 / 编码 1.2.1 加密/解密 1.2.2 散列/哈希 1.2.3 BASE64编解码 二.加解密思想(以md5为例) ...

最新文章

  1. 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
  2. IDEA Maven 项目默认编译项目为JDK 1.5
  3. distribution counting—a sorting method from aocp
  4. 通过MageUi.exe修改通过ClickOnce发布过的WPF browser application 配置文件
  5. 《JavaScript DOM 编程艺术》 读书笔记
  6. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测daiding
  7. CentOS6.5安装perl5.0(tar压缩包方式),有错误you may have to set your dynamic library LD_LIBRARY_PATH
  8. 【看动漫学编程】程序员在异世界生个娃 第1篇:太极村
  9. Centos6.4下安装mysql5.6.10
  10. python接口自动化(四十二)- 项目架构设计之大结局(超详解)
  11. 高考数据分析和读书感悟
  12. python处理excel的优势-用Python读写Excel文件的方式比较
  13. 高级插座的过载保护是否真的可靠?
  14. KubeSphere 3.3.0 离线安装教程
  15. JS全国城市数组列表
  16. 数据中台(五)数据开发:数据价值提炼工厂
  17. 英文信详解:申请信、推荐信等等
  18. Postman如何设置为中文
  19. 苹果cms v10影视网站数据采集
  20. 帆软报表在已经搭载服务器上开发_报表案例_数据报表开发_做报表的步骤_报表开发流程-帆软...

热门文章

  1. MAGICIAN IS CASTOR (Castor JDO,Castor XML,魔术)
  2. egret 自动生成代码插件 EgretAutoCodeEui vscode,wing可以使用
  3. html td如何设置字体加黑,如何在td中控制字体右对齐且加粗_html/css_WEB-ITnose
  4. webpack 打包流程(初学)
  5. 网站源码下载[建站]
  6. 安卓版微信内置浏览器,a href=tel:电话号码/a 这个链接失效,跳到拨号界面
  7. 企微版scrm系统如何导出客户资料?
  8. QinQ初识--qinq基础知识
  9. 火狐浏览器安装接口测试工具RESTClient方法
  10. ZCuZn24Al6Fe4Mn3高力黄铜