方法一、加密方式通过python重构

1、模拟登陆:
使用python重构了rsa加密方式,得到加密之后的密码
从网页源码中获取到了csrfmiddlewaretoken和pk
携带data发送post进行模拟登陆
2、遇到RSA加密的
如果加密代码不是很长,复制所有的
如果加密代码比较长,最好使用python重构一下加密过程(需要得到重构时所必须的一些参数)

  1. 分析:首先需要的参数:
  2. username:
  3. password: KaYiT7HiFfadM2S7S31w3mgTHA/Z5idogLXrVi6hdROy6M837ilwXVaV+m4hbLE/SRXTiB+sjbbGP0VsNKK5TNdnuq3/ukRSbr5WtAMF8eoH2f/NhSa4OmZZR3BN+JcOSmdk8qLgsI9FaR8xCRu+P6hc+n/liAq+DfEfjgfI31I=
  4. csrfmiddlewaretoken: HS5stw6ug7ZVnj5WP6eEoxG96NydfsYToEQ2eYPLlBc2uhbyLvKEhk6PKs3vr4Cd
  5. 搜索password:
  6. 索索到
  7. 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}('4 2(){e 8=$("#1").d();e 3=6 0();e a=$("#9").d();3.b(a);e 7=3.3(8);$("#1").d(7);$("#5").c()}',62,15,'JSEncrypt|MemberPassword|doLogin|encrypt|function|login_button|new|pass_new|password_old|pk|public_key|setPublicKey|submit|val|var'.split('|'),0,{}))
  8. }这种基本上就是经过加密的,
  9. 通过以下链接进行解密查看源代码:解密工具地址:http://www.ab173.com/enc/eval_package.php
  10. 经过解密之后:
  11. function doLogin() {
  12. var password_old = $("#MemberPassword").val(); # 输入密码
  13. var encrypt = new JSEncrypt(); # 加密类
  14. var public_key = $("#pk").val(); # 源码中可以获得pk(公钥)
  15. encrypt.setPublicKey(public_key); # 由setPublickKey函数基本可以确定是RSA加密
  16. var pass_new = encrypt.encrypt(password_old);# 进行加密
  17. $("#MemberPassword").val(pass_new);
  18. $("#login_button").submit()
  19. }
  1. 这里因为是引入了外部加密文件,加密代码比较长,这里使用方法通过python重构加密过程
  2. # 安装需要的包: pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
  3. from Crypto.PublicKey import RSA
  4. from Crypto.Cipher import PKCS1_v1_5 as cry_pksc1_v1_5
  5. import base64
  6. # Pk公钥 password 密码
  7. def encrypto(pk, password):
  8. """
  9. 使用公钥对密码进行加密处理
  10. :param pk: 公钥
  11. :param password: 明文密码
  12. :return: RAS加密之后的密码
  13. """
  14. public_key = "-----BEGIN PUBLIC KEY-----\n{}\n-----END PUBLIC KEY-----".format(pk)
  15. # 导入公钥 返回一个RSA秘钥对象
  16. rsakey = RSA.importKey(public_key)
  17. # 对需要加密的内容进行PKCS#1 v1.5加密
  18. cipher = cry_pksc1_v1_5.new(rsakey)
  19. # 使用公钥加密密码 密码必须是二进制
  20. miwen_encode = cipher.encrypt(password.encode())
  21. # 再使用Base64对类似字节的对象进行编码
  22. cipher_text = base64.b64encode(miwen_encode).decode()
  23. return cipher_text
  1. import requests
  2. from shanzhi_rsa import encrypto
  3. from lxml import etree
  4. # lxml.etree._Element
  5. from lxml.etree import _Element
  6. url = 'http://shanzhi.spbeen.com/login/'
  7. header = {
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
  9. 'Cookie': 'shanzhi_kmer=h9wm0ptr9kcuza527as3a43a6zuwzsid; csrftoken=yHdq0AaPEO1pyiC2zji4MmeyLRNcXVcZLNoHCT3izQ52lwvASvHv0jgsGG9kEXUN'
  10. }
  11. # 先从网页源码中得到csrfmiddlewaretoken和pk
  12. reponse_obj = requests.get(url, headers=header)
  13. tree = etree.HTML(reponse_obj.text)
  14. csrfmiddlewaretoken = tree.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
  15. pk = tree.xpath('//input[@id="pk"]/@value')[0]
  16. old_password = 'logic_00'
  17. password = encrypto(pk, old_password)
  18. data_dict = {
  19. 'username': 'logic_00',
  20. 'password': password,
  21. 'csrfmiddlewaretoken': csrfmiddlewaretoken
  22. }
  23. res = requests.post(url, headers=header, data=data_dict)
  24. print(res.text)