龙岩建设局网站,小红书推广有用吗,郑州谷歌优化外包,杭州市建设厅网站目录 一、网站分析二、定位监听三、熟悉AES-ECB四、调试分析五、node运行js六、Python执行js 一、网站分析
三年前的案例#xff0c;我的原始文章网站 #xff0c;如图我们直接点击标题进入到详情页#xff0c;链接会发生跳转#xff0c;且与我们在详情看到的链接#xf… 目录 一、网站分析二、定位监听三、熟悉AES-ECB四、调试分析五、node运行js六、Python执行js 一、网站分析
三年前的案例我的原始文章网站 如图我们直接点击标题进入到详情页链接会发生跳转且与我们在详情看到的链接与在列表页看到的链接完全不一样如果拿列表页的链接直接新建标签页打开的话详情页也是403而只有触发点击的模式才能拿看到真实的详情链接假详情链接 http://ggzy.zwfwb.tj.gov.cn:80/jyxxcggg/1025448.jhtml真详情链接 http://ggzy.zwfwb.tj.gov.cn/jyxxcggg/Hw5fFNS%5EhnOR3wD5T5hxxA.jhtml
二、定位监听
谷歌浏览器点中a标签 火狐浏览器有自带的event事件监听
三、熟悉AES-ECB
1、分析前需要熟悉下aes加密是什么熟悉的可能是md5加密md5加密是哈希算法不可逆不能从结果推出明文而aes是对称加密算法区别之一可加密可解密即可反推明文 2、 AES的ECB模式只需要找到key密钥就可以加密解密了 在线调试AES加密解密 3、AES加密解密代码
四、调试分析 以谷歌浏览器为例子 开始添加断点嗯~ 在定义变量这里打个断点试试然后在点击列表链接会发现js停在了断点处然后咱们就一步一步的往下调试会发现列表的url是如何加密的了而其中最核心的加密算法其实是用了CryptoJS的对称加密AES加密并且使用的是ECB模式Pkcs7填充密钥在调试这部分的时候可以看到是何值 抠出js将整个js文件全部复制下来在console面板可直接运行以下是将关键js扣出来并在新建js脚本运行后的结果大功告成下面我用python来还原
五、node运行js
前端定义的CryptoJS我并没有直接复制而是通过本地的node直接导入CryptoJS库此时只需要将关键代码扣出来即可本地需安装node环境然后再安装crypto-js库 npm install crypto-js -g重要参数key是密钥指定模式默认ECB模式padding是用来填充数据的如果需要加密的数据的字节码的长度不是块大小的整数倍就需要填充方式1扣js缺啥补啥var CryptoJS require(crypto-js);
var req function(hh) {
var s qnbyzzwmdgghmcnm;
var ee _blank;
var aa hh.split(/);
var aaa aa.length;
var bbb aa[aaa - 1].split(.);
var ccc bbb[0];
var cccc bbb[1];
var r /^\?[1-9][0-9]*$/;
if (r.test(ccc) cccc.indexOf(jhtml) ! -1) {var srcs CryptoJS.enc.Utf8.parse(ccc);var k CryptoJS.enc.Utf8.parse(s);var en CryptoJS.AES.encrypt(srcs, k, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});var ddd en.toString();ddd ddd.replace(/\//g, ^);ddd ddd.substring(0, ddd.length - 2);var bbbb ddd . bbb[1];aa[aaa - 1] bbbb;var uuu ;for (i 0; i aaa; i) {uuu aa[i] /}uuu uuu.substring(0, uuu.length - 1);return uuu;
}
}
console.log(req(http://ggzy.xzsp.tj.gov.cn:80/jyxxcggg/948547.jhtml));方式2js自带的模块CryptoJS加理解的逻辑var CryptoJS require(crypto-js);
var encrypt_req function(key,text) {var l CryptoJS.enc.Utf8.parse(text);var e CryptoJS.enc.Utf8.parse(key);var a CryptoJS.AES.encrypt(l, e, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})return a.toString() // 此方式返回base64 // return a.ciphertext.toString() // 返回hex格式的密文
}// ECB模式加密base64
console.log(encrypt_req(qnbyzzwmdgghmcnm, 1025528));六、Python执行js
python调用js三种方式 要么用python现有的模块替换js相同的逻辑即python还原要么通过execjs/ py_mini_racer等执行要么通过node部署服务开接口执行 python的execjs库调用js通过execjs执行js
import execjs # pip install execjs
from loguru import logger
list_url http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml
with open(./aes.js, r, encodingutf-8) as f:ctx execjs.compile(f.read())
true_url ctx.call(req, list_url)
logger.info(f详情的url:{list_url} 真实的url: {true_url})#######分割线#######
import execjs # pip install execjs
from loguru import logger
list_url http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml
ccc list_url.split(/)[-1].rstrip(.jhtml)
with open(./aes.js, r, encodingutf-8) as f:ctx execjs.compile(f.read())
suffix ctx.call(encrypt_req, qnbyzzwmdgghmcnm, 1025528).replace(/, ^)[:-2]
true_url fhttp://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/{suffix}.jhtml
logger.info(f详情的url:{list_url} 真实的url: {true_url}) python自带的aes库还原逻辑pip install pycryptodomefrom loguru import logger
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64def aes_ecb_encrypt_text(decrypt_text: str, key: str) - str:加密AES_ECB明文:param decrypt_text: 待加密的字符串:param key: 密钥:return: 加密后的数据aes2 AES.new(key.encode(utf-8), AES.MODE_ECB)encrypt_text aes2.encrypt(pad(decrypt_text.encode(utf-8), AES.block_size, stylepkcs7))encrypt_text str(base64.encodebytes(encrypt_text), encodingutf-8).replace(\n, )return encrypt_textlist_url http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml
ccc list_url.split(/)[-1].rstrip(.jhtml)
decrypt_str ccc
key_str qnbyzzwmdgghmcnm
encrypt_str aes_ecb_encrypt_text(decrypt_str, key_str).replace(/, ^)[:-2]
true_url list_url.replace(decrypt_str, encrypt_str)
logger.info(f详情的url:{list_url} 真实的url: {true_url})