宝塔人机识别验证

案例地址: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'))
点赞

发表回复