Bootstrap

反爬虫SSL TLS指纹识别和绕过JA3算法.md

0x00 前言

​ 有时候会发现一种情况,用正常浏览器可以访问,但是用脚本或者挂一下代理访问https的网站就直接405禁止访问了。

​ 这种情况就有可能是 识别了你的TLS指纹,这种情况换随机UA都是没什么用的。

image-20220208160912763

​ 查阅资料之后,发现应该是waf识别你的TLS指纹,标记为恶意直接禁止了,其中识别的算法主要是利用JA3和JA3S实现TLS指纹识别功能,所以学习了一下。

0x01 实际测试一下

测试代码

第一步,我们就看看我们的特征是什么,测试一下到底改hearder方法行不行。代码是测试代码,主要就是重复发包看一下特征。

主要有三种:修改过tls的,原生的,改header头的

# author: Zeo
# python: 3.7 
# software: PyCharm

"""
文件说明:
"""
import requests
import random
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

ORIGIN_CIPHERS = (
    'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES')


class DESAdapter(HTTPAdapter):
    def __init__(self, *args, **kwargs):
        # 在请求中重新启用 3DES 支持的 TransportAdapter
        CIPHERS = ORIGIN_CIPHERS.split(":")
        random.shuffle(CIPHERS)
        # print("1:", CIPHERS)
        CIPHERS = ":".join(CIPHERS)
        # print("2:", CIPHERS)
        self.COPHERS = CIPHERS + ":!aNULL:!eNULL:!MD5"
        super(DESAdapter, self).__init__(*args, **kwargs)

    # 在一般情况下,当我们实现一个子类的时候,__init__的第一行应该是super().__init__(*args, **kwargs),
    # 但是由于init_poolmanager和proxy_manager_for是复写了父类的两个方法,
    # 这两个方法是在执行super().__init__(*args, **kwargs)的时候就执行的。
    # 所以,我们随机设置 Cipher Suits 的时候,需要放在super().__init__(*args, **kwargs)的前面。
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=self.COPHERS)
        kwargs["ssl_context"] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=self.COPHERS)
        kwargs["ssl_context"] = context


if __name__ == '__main__':
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'}
    s = requests.Session()
    s.headers.update(headers)

    print("修改TSL 加密算发")
    for _ in range(3):
        # 其中,s.mount的第一个参数表示这个适配器只在https://ja3er.com开头的网址中生效
        s.mount("https://ja3er.com", DESAdapter())
        response = s.get("https://ja3er.com/json").json()
        print(response)

    print("原生 requests.get")
    for _ in range(3):
        res = requests.get(url="https://ja3er.com/json").json()
        print(res)
    print("修改 hearder requests.get")
    for _ in range(3):
        SignHeaders = {
   
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
            'Accept': 'application/json, text/plain, */*',
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Accept-Encoding': 'gzip, deflate',
            'Connection': 'close',
            'Referer': 'https://www.baidu.com/',
        }
        res = requests.get(url="https://ja3er.com/json", headers=SignHeaders).json(
;