• 高校教务系统登录页面JS分析——皖西学院


    高校教务系统密码加密逻辑及JS逆向

    本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。

    本文仅供交流学习,勿用于非法用途。

    一、密码加密基本概念

    密码加密是一种保护信息安全的技术手段,它通过将明文(原始信息)转换为密文(加密后的信息),以防止未经授权的访问和篡改。常见的密码加密算法有MD5、SHA-1、SHA-256等。

    1.1 加密过程

    加密过程通常包括以下步骤:

    1. 密钥扩展:将密钥扩展为多个轮值,每个轮值都与明文的一部分有关。
    2. 初始轮值生成:将扩展后的密钥与轮常数进行某种运算,生成第一轮加密的密文。
    3. 多轮迭代:对密文进行多轮迭代操作,每轮操作都包括非线性函数、模运算和轮常数的变换。
    4. 最终密文:经过多轮迭代后,得到最终的密文。

    1.2 解密过程

    解密过程与加密过程相反,通过反向操作来恢复原始明文。通常需要知道加密时使用的密钥和算法。

    二、高校教务系统密码加密逻辑分析

    2.1 抓包

    我们首先打开教务系统的登录页面,我们可以看到,只有学号和密码,有的高校会有验证码,或者有的高校是错误一次密码,会验证验证码。

    我们打开开发者工具,尝试登录抓包,网页会返回这样的数据接口。

    我们可以看到,用户名和密码是一样的,也就是说加密方法也是一样的(因为我们用户名和密码是一样的,通过加密之后,得到的值也是一样的)。

    2.2 分析加密参数

    我们接下来,就是来分析这个密码是怎么加密的。我们全局搜索password。定位到加密的位置。

    我们可以看到,这里用了encrypt函数,把输入的用户名和密码,和checkkey一起传给了这个函数。我们接下来就是定位encrypt

    三、JS逆向分析方法

    逆向分析是指从已知的加密文本或程序中还原出原始信息的过程。在本例中,我们将使用JavaScript编写一个简单的逆向分析工具,用于逆向高校教务系统的密码。

    环境使用

    • python 3.9
    • pycharm
    • node

    我们全局搜索encrypt,我们可以定位到这个函数,我们接下来就是扣这个函数吗,看缺什么补什么。

    代码实现

    我们先把这些代码扣下来,运行看看缺什么补什么。

    1. var CryptoJS = require("crypto-js");
    2. var password = encrypt('1234', '1697296385978')
    3. function encrypt(msg, checkkey) {
    4. var base64 = new Base64();
    5. var key = CryptoJS.enc.Base64.parse(base64.encode("iam" + checkkey));
    6. var iv = CryptoJS.enc.Base64.parse(base64.encode("iam" + checkkey));
    7. var encrypted = CryptoJS.AES.encrypt(msg, key, {
    8. iv: iv,
    9. padding: CryptoJS.pad.Pkcs7,
    10. mode: CryptoJS.mode.CBC
    11. });
    12. var cipherText = encrypted.ciphertext.toString();
    13. return cipherText
    14. }
    15. function Base64() {
    16. // private property
    17. _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    18. // public method for encoding
    19. this.encode = function (input) {
    20. var output = "";
    21. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    22. var i = 0;
    23. input = _utf8_encode(input);
    24. while (i < input.length) {
    25. chr1 = input.charCodeAt(i++);
    26. chr2 = input.charCodeAt(i++);
    27. chr3 = input.charCodeAt(i++);
    28. enc1 = chr1 >> 2;
    29. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    30. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    31. enc4 = chr3 & 63;
    32. if (isNaN(chr2)) {
    33. enc3 = enc4 = 64;
    34. } else if (isNaN(chr3)) {
    35. enc4 = 64;
    36. }
    37. output = output +
    38. _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
    39. _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
    40. }
    41. return output;
    42. }
    43. // public method for decoding
    44. this.decode = function (input) {
    45. var output = "";
    46. var chr1, chr2, chr3;
    47. var enc1, enc2, enc3, enc4;
    48. var i = 0;
    49. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    50. while (i < input.length) {
    51. enc1 = _keyStr.indexOf(input.charAt(i++));
    52. enc2 = _keyStr.indexOf(input.charAt(i++));
    53. enc3 = _keyStr.indexOf(input.charAt(i++));
    54. enc4 = _keyStr.indexOf(input.charAt(i++));
    55. chr1 = (enc1 << 2) | (enc2 >> 4);
    56. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    57. chr3 = ((enc3 & 3) << 6) | enc4;
    58. output = output + String.fromCharCode(chr1);
    59. if (enc3 != 64) {
    60. output = output + String.fromCharCode(chr2);
    61. }
    62. if (enc4 != 64) {
    63. output = output + String.fromCharCode(chr3);
    64. }
    65. }
    66. output = _utf8_decode(output);
    67. return output;
    68. }
    69. // private method for UTF-8 encoding
    70. _utf8_encode = function (string) {
    71. string = string.replace(/\r\n/g, "\n");
    72. var utftext = "";
    73. for (var n = 0; n < string.length; n++) {
    74. var c = string.charCodeAt(n);
    75. if (c < 128) {
    76. utftext += String.fromCharCode(c);
    77. } else if ((c > 127) && (c < 2048)) {
    78. utftext += String.fromCharCode((c >> 6) | 192);
    79. utftext += String.fromCharCode((c & 63) | 128);
    80. } else {
    81. utftext += String.fromCharCode((c >> 12) | 224);
    82. utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    83. utftext += String.fromCharCode((c & 63) | 128);
    84. }
    85. }
    86. return utftext;
    87. }
    88. // private method for UTF-8 decoding
    89. _utf8_decode = function (utftext) {
    90. var string = "";
    91. var i = 0;
    92. var c = c1 = c2 = 0;
    93. while (i < utftext.length) {
    94. c = utftext.charCodeAt(i);
    95. if (c < 128) {
    96. string += String.fromCharCode(c);
    97. i++;
    98. } else if ((c > 191) && (c < 224)) {
    99. c2 = utftext.charCodeAt(i + 1);
    100. string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
    101. i += 2;
    102. } else {
    103. c2 = utftext.charCodeAt(i + 1);
    104. c3 = utftext.charCodeAt(i + 2);
    105. string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
    106. i += 3;
    107. }
    108. }
    109. return string;
    110. }
    111. }
    112. console.log(password)

    我们这里的checkkey,要和网页一样的,大家感兴趣的话,可以去看看这个是怎么生成的。

    var password= encrypt('1234', '1697296385978')

    实现效果

    dbaf402bc440a615427564a1163bf2d8
    

     四、总结

    本文介绍了高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的方法。通过学习这些知识,你可以更好地理解密码加密技术的原理,并掌握一定的逆向分析技巧。请注意,逆向分析可能涉及到法律问题,请在合法范围内进行研究和实践。

    五、累计更新

    争取到到底早日更新30所高校,大家可以在评论区留言。

    往期作品可以查看专栏👇👇👇

    全国高校教务系统登录页面JS分析_爱吃饼干的小白鼠的博客-CSDN博客

    6adf31c8c5dd4e6a83314f4805b30bc1.jpg

     

  • 相关阅读:
    食之无味?App Startup 可能比你想象中要简单
    【nginx】Nginx配置:
    (十四)MyBatis的分页与PageHelper插件
    Matlab:转换日期向量返回意外输出
    JavaScript用浏览器书签制作插件(爬虫)
    如何完美解决前端数字计算精度丢失与数字格式化问题?
    软件测试|selenium执行js脚本
    go select 使用总结
    redis集群模式详解
    nginx服务器
  • 原文地址:https://blog.csdn.net/BROKEN__Y/article/details/133833805