目标网站首页:aHR0cDovL2dnenkuendmd2IudGouZ292LmNu/
分析页面:aHR0cDovL2dnenkuendmd2IudGouZ292LmNuL3h3engvaW5kZXhfMi5qaHRtbA==
话不多说,开始今天的分析。
看着都非常的正常,打开元素面板查看每一个链接的URL
也很正常:
丝毫没有看到加密的点在哪里。难不成是恰了一篇水文凑字数?
当然不是了,当点击元素面板中的a标签对应的href
属性时:
神奇的事情发生了,403。很奇怪,一定是哪里不对劲,多刷新几次试试结果还是一样,那这样爬虫还爬个锤子 。
但是当点击页面上的标题时,又可以请求到数据。
URL和之前有很大的出入,大概率是加密了。对比看一下:
# 加密前
http://ggzy.zwfwb.tj.gov.cn/zwyw/978333.jhtml
# 加密后
http://ggzy.zwfwb.tj.gov.cn/zwyw/cDthJYqIKN1rPbfp+eK5kg.jhtml
既然是加密了,又到了逆向环节。
加密分析
当鼠标点击标题时,标题会跳转到新的窗口并且URL
会发生变化,所以我们可以找到对应标题的a对应的事件监听click
点击进入,随便打几个断点。根据经验是AES
加密。
剩下的就是抠代码,然后将a标签中的URL
拿到放进去加密,就可以得到结果了。
看完分析流程后,可以自己动手试一下。
代码
代码就没有细扣了,因为是一个AES标准加密,直接调用第三方库就没问题了
npm install crypto-js
const CryptoJS = require('crypto-js');
function getRealUrl(hh) {
var s = "qnbyzzwmdgghmcnm";
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];
return bbbb;
}
}
getRealUrl()