某安全设备前端加解密爆破案例_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

某安全设备前端加解密爆破案例

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


某安全设备前端加解密爆破案例

某天,我大哥让我帮忙弄个设备的网页爆破脚本,说是前端加密了,算法看不懂是啥 于是打开网页瞅瞅(不贴登录界面图了,省的得罪人) 先查看网页源代码 一个简单的form表单,126行仅一个submit按钮,91行form也没有额外的提交事件 F12打开控制台,看看提交按钮的监听事件 有一个submit事件,点击链接跳转到login.js 又调用了evtMainAuth()函数,Ctrl+F搜索login.js中的evtMainAuth 在265、266行对maUser和maPass进行了处理,来看下这两个对象是如何定义的 第7行定义了变量 132、133行进行了赋值,返回的是name值为a和p的input框,就是登录页面的用户名和密码框 再来看加密函数 用户名仅做了去空字符处理,密码使用了$.fn.en进行处理,当前页面没有找到这个函数的定义,直接在266行打断点,然后登录一次 然后点击控制台右侧的进入函数内部(或者直接F11) 先是进入了Jquery的val()函数,这个不管 然后来到了jquery.plugin.js中 找到了fn.en的定义 d.fn.en = function (a) { f = l(); return 0 >= this.length && "string" === d.type(a) ? 0 >= a.length ? "" : h(a) : this.each(function () { var b = d(this), a = b.val(), c; 0 >= a.length || (c = b.data("v"), "string" === d.type(c) && 0 < c.length && (b.val(c), b.removeData("v")), c = h(a), b.val(c), b.data("v", a), b.one("input propertychange", k)) })} 其中的函数l()是 function l() { for (var a = 0; 0 >= a || 255 <= a;) a = Math.floor(255 * Math.random()); return a} 函数h()是 function g(a) { var b = ""; 16 > a && (b = "0"); return b + a.toString(16)}function h(a) { for (var b = [g(f)], e, c = 0, d = a.length; c < d; ++c) e = a.charCodeAt(c), 255 >= e ? b.push(g(e ^ f)) : (b.push(g(Math.floor(e / 256) ^ f)), b.push(g(e % 256 ^ f))); return b.join("").toUpperCase()} 开始分析加密算法 先看fn.en函数 第1行将l()函数的返回值赋值给定义的变量f l()函数代码如下 Math.random()是返回一个0<= number <1的随机数 Math.floor()是返回小于等于给定数字的最大整数 也就是说,l()返回了一个0<= number < 255的随机数 接着看fn.en,接下来是一个return语句,但用到了三目运算,为了方便阅读,这里将代码进行格式化 当this.length为0且a的变量类型为string时,返回8~16行的三目运算结果,否则,返回20~29行的函数 这里在控制台看一下 this在函数中为函数所属的对象,就是fn,过程中并没有见到对fn的length进行修改,所以恒为0 a是传入的密码,肯定为string类型 故返回值为8~16行的三目运算结果 再来看8~16行的表达式 当a(传入的密码)长度为0时,返回空字符串,否则返回h(a)的结果 h()就是加密的具体函数了,分析一下h()函数 先看循环的步数,起始是c=0,结束条件是c255的时候,就超出了ASCII的范围,属于UNICODE字符串了,先e/256再去按位异或f,再向b添加e对256取余后和f的按位异或结果 当e<=255,在ASCII时(a-zA-Z0-9特殊符号都在其中了),仅需正常返回g(e^f)即可 所以算法流程如图 搞清楚算法后,开始编写加密及解密脚本 对了,还有个数学知识,a^b=c,那么c^b=a 加密脚本 #!/usr/env python# author Waximport randomimport sys def getKey(): return int(255 * random.random()) def octToHexStr(number): if number < 16: return '0' + str(hex(number))[2:] return str(hex(number))[2:] def en(data, key): enData = "" if data == "": return enData if key == '': key = getKey() enData += octToHexStr(key) for chr in data: e = ord(chr) if e <= 255: enData += octToHexStr(e^key) else: enData += octToHexStr(int(e/256) ^ key) enData += octToHexStr(e % 256 ^ key) return enData.upper() if __name__ == '__main__': if len(sys.argv) > 1 and len(sys.argv) <=3: data = sys.argv[1].strip() key = '' if sys.argv[2]: key = int(sys.argv[2]) print('data:'+data) print('key :'+str(key)) print(en(data, key)) else: print('usage:') print('tpython encrypt.py data') print('tpython encrypt.py data key_oct') 解密脚本 #!/usr/env python# author Waximport sys def de(enData): key = HexStrToOct(enData[0:2]) enData = enData[2:] data = "" while len(enData)/2 > 0: chrHexStr = enData[0:2] data += chr(HexStrToOct(chrHexStr)^key) enData = enData[2:] return data def HexStrToOct(hexStr): return int.from_bytes(bytes.fromhex(hexStr)) if __name__ == '__main__': if len(sys.argv) == 2: enData = sys.argv[1] print(de(enData)) else: print('usage:') print('tpython decrypt.py data') 测试一下,先登录一次,密码输入的是12345 加密结果是8DBCBFBEB9B8 前两位8D就是生成的随机数,十进制是141 测试加解密脚本 ok~ 我大哥可以愉快的玩耍了 这里详细分析过程只是为了演示前端加密的分析,实际中可以借助AI的力量帮你分析,效率杠杠滴

某安全设备前端加解密爆破案例