方法一、加密方式通过python重构
1、模拟登陆:
使用python重构了rsa加密方式,得到加密之后的密码
从网页源码中获取到了csrfmiddlewaretoken和pk
携带data发送post进行模拟登陆
2、遇到RSA加密的
如果加密代码不是很长,复制所有的
如果加密代码比较长,最好使用python重构一下加密过程(需要得到重构时所必须的一些参数)
分析:首先需要的参数:
username:
password: KaYiT7HiFfadM2S7S31w3mgTHA/Z5idogLXrVi6hdROy6M837ilwXVaV+m4hbLE/SRXTiB+sjbbGP0VsNKK5TNdnuq3/ukRSbr5WtAMF8eoH2f/NhSa4OmZZR3BN+JcOSmdk8qLgsI9FaR8xCRu+P6hc+n/liAq+DfEfjgfI31I=
csrfmiddlewaretoken: HS5stw6ug7ZVnj5WP6eEoxG96NydfsYToEQ2eYPLlBc2uhbyLvKEhk6PKs3vr4Cd
搜索password:
索索到
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,{}))
}这种基本上就是经过加密的,
通过以下链接进行解密查看源代码:解密工具地址:http://www.ab173.com/enc/eval_package.php
经过解密之后:
function doLogin() {
var password_old = $("#MemberPassword").val(); # 输入密码
var encrypt = new JSEncrypt(); # 加密类
var public_key = $("#pk").val(); # 源码中可以获得pk(公钥)
encrypt.setPublicKey(public_key); # 由setPublickKey函数基本可以确定是RSA加密
var pass_new = encrypt.encrypt(password_old);# 进行加密
$("#MemberPassword").val(pass_new);
$("#login_button").submit()
}
这里因为是引入了外部加密文件,加密代码比较长,这里使用方法通过python重构加密过程
# 安装需要的包: pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as cry_pksc1_v1_5
import base64
# Pk公钥 password 密码
def encrypto(pk, password):
"""
使用公钥对密码进行加密处理
:param pk: 公钥
:param password: 明文密码
:return: RAS加密之后的密码
"""
public_key = "-----BEGIN PUBLIC KEY-----\n{}\n-----END PUBLIC KEY-----".format(pk)
# 导入公钥 返回一个RSA秘钥对象
rsakey = RSA.importKey(public_key)
# 对需要加密的内容进行PKCS#1 v1.5加密
cipher = cry_pksc1_v1_5.new(rsakey)
# 使用公钥加密密码 密码必须是二进制
miwen_encode = cipher.encrypt(password.encode())
# 再使用Base64对类似字节的对象进行编码
cipher_text = base64.b64encode(miwen_encode).decode()
return cipher_text
import requests
from shanzhi_rsa import encrypto
from lxml import etree
# lxml.etree._Element
from lxml.etree import _Element
url = 'http://shanzhi.spbeen.com/login/'
header = {
'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',
'Cookie': 'shanzhi_kmer=h9wm0ptr9kcuza527as3a43a6zuwzsid; csrftoken=yHdq0AaPEO1pyiC2zji4MmeyLRNcXVcZLNoHCT3izQ52lwvASvHv0jgsGG9kEXUN'
}
# 先从网页源码中得到csrfmiddlewaretoken和pk
reponse_obj = requests.get(url, headers=header)
tree = etree.HTML(reponse_obj.text)
csrfmiddlewaretoken = tree.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
pk = tree.xpath('//input[@id="pk"]/@value')[0]
old_password = 'logic_00'
password = encrypto(pk, old_password)
data_dict = {
'username': 'logic_00',
'password': password,
'csrfmiddlewaretoken': csrfmiddlewaretoken
}
res = requests.post(url, headers=header, data=data_dict)
print(res.text)