案例地址:https://www.amec-inc.com
案例内容:某站点宝塔人机识别的cookie分析。(案例很简单,清空cookie后刷新页面可触发人机识别)
通过观察,可以发现在人机识别后多了一个cookie参数 e50222e9c8393a251cb491679ef73186。
从本地请求返回的代码中进行分析,先查看加载的Js代码。
<script type="text/javascript" src="/renji_296d626f_32f3b5e96be67b639c72b3614aaac541.js?id=1660718301"></script>
把代码复制到本地后格式化,(不能直接从浏览器页面复制,代码不全),需要从response里面复制。
复制后的内容如下
格式化后,观察代码可以发现进入人机识别的逻辑
那么着重分析这段 c.get
c.get 是XMLHttpRequest的GET请求,那么再次清空cookie,查看数据包。
发现在加载完Js后,发起了一次请求,Params中有三个参数
请求成功后返回了检验cookie。
接下来看一下请求的params是如何生成的,目前来看,似乎是固定的。
"/a20be899_96a6_40b2_88ba_32f1f75f1552_yanzheng_ip.php?type=96c4e20a0e951f471d32dae103e83881&key=" + key + "&value=" + md5encode(stringtoHex(value)
把代码拿出来运行,发现有报错。
报错: ReferenceError: window is not defined
补上:window = {}
报错:TypeError: window.addEventListener is not a function
补上:window.addEventListener = function (){}
再次运行成功输出结果。
window = {}
window.addEventListener = function (){}
// 代码过长省略掉
// 此处为从renji.js文件的response中复制出的代码
var key = "32f3b5e96be67b639c72b3614aaac541";
var value = "b20f96e5878b0a47ff8626c8f757e35b";
function stringtoHex(acSTR) {
var val = "";
for (var i = 0; i <= acSTR.length - 1; i++) {
var str = acSTR.charAt(i);
var code = str.charCodeAt();
val += code
}
;return val
};
function md5encode(word) {
return cx.MD5(word).toString()
};
var s="/a20be899_96a6_40b2_88ba_32f1f75f1552_yanzheng_ip.php?type=96c4e20a0e951f471d32dae103e83881&key=" + key + "&value=" + md5encode(stringtoHex(value))
console.log("https://www.amec-inc.com"+s)
流程分析清楚后,在本地复现代码即可。
需要注意的是目前key和value是固定值,所以不需要去js中提取,可直接请求接口获取cookie。
但是说不好什么时间就变了,大家记得动态解析。
测试代码:
import requests
from lxml import etree
headers={
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7",
"Cache-Control":"no-cache",
"Connection":"keep-alive",
"Host":"www.amec-inc.com",
"Pragma":"no-cache",
"Referer":"http://www.amec-inc.com/index/Lists/index/catid/97.html",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
url = 'https://www.amec-inc.com/index/Lists/index/catid/97.html'
curl = 'https://www.amec-inc.com/a20be899_96a6_40b2_88ba_32f1f75f1552_yanzheng_ip.php?type=96c4e20a0e951f471d32dae103e83881&key=32f3b5e96be67b639c72b3614aaac541&value=3bf9901397de25f7fc8d5c31e2059f5d'
sess = requests.session()
sess.get(curl, headers=headers)
html = sess.get(url, headers=headers).text
e = etree.HTML(html)
print(e.xpath('//div[@class="mews_Eone_ul"]/ul/li/a'))