• 宝塔人机识别验证


    案例地址:https://www.amec-inc.com
    案例内容:某站点宝塔人机识别的cookie分析。(案例很简单,清空cookie后刷新页面可触发人机识别)
    在这里插入图片描述

    通过观察,可以发现在人机识别后多了一个cookie参数 e50222e9c8393a251cb491679ef73186。

    在这里插入图片描述

    从本地请求返回的代码中进行分析,先查看加载的Js代码。

     <script type="text/javascript" src="/renji_296d626f_32f3b5e96be67b639c72b3614aaac541.js?id=1660718301"></script>
    
    • 1

    把代码复制到本地后格式化,(不能直接从浏览器页面复制,代码不全),需要从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)
    
    • 1

    把代码拿出来运行,发现有报错。
    在这里插入图片描述

    报错: 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    流程分析清楚后,在本地复现代码即可。

    需要注意的是目前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'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    【Python】【数据结构】【集合的实现】
    [大三上]区块链和分布式计算
    【MyBatis】#{ } 和 ${ } 的区别
    黑猫带你学Makefile第6篇:Makefile重要规则
    【面试题】2023虹软计算机视觉一面
    六 游戏基础知识和SHAPE
    淘宝销量展示方式变更背后的逻辑
    Visualize Data by Adding Charts to WPF Spreadsheets
    QtColorButton——Qt自带的颜色选择按钮
    C/C++/Windows/Linux文件操作
  • 原文地址:https://blog.csdn.net/weixin_43582101/article/details/126385805