某安全网关前端JS分析
字数 3574 2025-08-29 08:30:36

安全网关前端JS防御机制深度分析

〇、前言

xxx安全网关是一款用于前端防御自动化工具的安全系统,其核心工作机制如下:

  • 核心代码由服务器下发给客户端执行
  • 通过cookie将执行结果带回服务器
  • 根据JS获取的前端数据分析判断用户是否异常
  • 完成安全检测流程

一、代码入口分析

1.1 核心参数

JS计算结果通过以下三个cookie参数名传递给服务器:

  • 8PHkpr8y - 工具特征
  • JF7cGtR5 - 浏览器指纹
  • SflKxwRJ - 令牌(token)

1.2 代码结构

核心逻辑位于ng_dynamic_defend文件的尾部几行,代码以明文形式存储,未经过混淆或加密。

二、配置读取机制

2.1 配置获取流程

window.config = 'eyJmaW5nZXIiOnsibmFtZSI6IkpGN2NHdFI1In0sImJvdCI6eyJlbmFibGVkIjp0cnVlLCJuYW1lIjoiOFBIa3ByOHkifSwic3VibWl0Ijp7ImVuYWJsZWQiOnRydWUsIm5hbWUiOiJVVmpES082biIsInVybCI6IiJ9LCJ0b2tlbiI6eyJlbmFibGVkIjp0cnVlLCJuYW1lIjoiU2ZsS3h3UkoiLCJ1cmwiOiJqc190ZXN0LmNvbTsiLCJpc19jaGVja191cmkiOnRydWUsImlzX2NoZWNrX2dldCI6dHJ1ZX0sImNvbnRlbnQiOnsiZW5hYmxlZCI6ZmFsc2UsIm5hbWUiOiJTZmxLeHdSSiIsImNvbmZ1c2VfdHlwZSI6IjAifSwic2NyaXB0Ijp7ImlzX2FudGlfZGVidWciOmZhbHNlfX0=';

!function(global) {
    function _base64_parse(e) {
        return CryptoJS.enc.Base64.parse(e).toString(CryptoJS.enc.Utf8)
    }
    function get_global() {
        var e = _base64_parse(global.config),
            t = JSON.parse(e);
        _global_config = global.nY1vq7Gi = t
    }
}(window);

2.2 配置内容解析

解码后的配置JSON:

{
    "finger": {
        "name": "JF7cGtR5"
    },
    "bot": {
        "enabled": true,
        "name": "8PHkpr8y"
    },
    "submit": {
        "enabled": true,
        "name": "UVjDKO6n",
        "url": ""
    },
    "token": {
        "enabled": true,
        "name": "SflKxwRJ",
        "url": "js_test.com;",
        "is_check_uri": true,
        "is_check_get": true
    },
    "content": {
        "enabled": false,
        "name": "SflKxwRJ",
        "confuse_type": "0"
    },
    "script": {
        "is_anti_debug": false
    }
}

三、数据采集机制

3.1 工具特征检测(get_tool_feature)

检测自动化工具特征:

  • get_webdriver() - 检测window.navigator.webdriver
  • get_phantomjs() - 通过window.navigator.userAgent检测PhantomJS
  • get_bot() - 检测以下关键字:
    __webdriver_evaluate, __selenium_evaluate, __webdriver_script_function, 
    __webdriver_script_func, __webdriver_script_fn, __fxdriver_evaluate, 
    __driver_unwrapped, __webdriver_unwrapped, __driver_evaluate, 
    __selenium_unwrapped, __fxdriver_unwrapped, _phantom, __nightmare, 
    _selenium, callPhantom, callSelenium, _Selenium_IDE_Recorder
    
  • get_navigator_for_tool() - 检测window.navigator.languages
  • get_canvas_for_tool() - 检测window.document.createElement('canvas').getContext
  • get_storage_for_tool() - 检测window.localStoragewindow.sessionStorage
  • get_consol() - 检测window.console.log(1)
  • get_awvs() - 检测AWVS扫描器特征:
    SimpleDOMXSSClass, MarvinHooks, MarvinPageExplorer, HashDOMXSSClass
    
  • get_appscan() - 检测AppScan扫描器特征:
    appScanSendReplacement, appScanOnReadyStateChangeReplacement, 
    appScanLoadHandler, appScanSetPageLoaded
    

3.2 浏览器特征检测(get_browser_feature)

检测浏览器环境特征:

  • get_indexedDB() - window.indexedDB
  • get_openDatabase() - window.openDatabase
  • get_localStorage() - window.localStorage
  • get_sessionStorage() - window.sessionStorage
  • get_audio() - window.AudioContext.destination
  • get_file() - 检测File对象类型
  • isCanvasSupported() - 检测Canvas支持
  • isWebGlSupported() - 检测WebGL支持
  • get_plugins() - window.navigator.plugins
  • get_languages() - window.navigator.languages
  • get_platform() - window.navigator.platform
  • get_cpuClass() - _navigator.cpuClass
  • get_hardwareConcurrency() - _navigator.hardwareConcurrency
  • get_namespaces() - window.document.namespaces
  • get_documentMode() - window.document.documentMode
  • get_ActivexObject() - window.document.ActivexObject
  • get_StyleMedia() - window.StyleMedia
  • get_opera() - window.opera
  • get_firefox() - 检测Firefox
  • get_chrome() - 检测Chrome
  • get_safari() - 检测Safari

3.3 浏览器指纹采集(get_fingerprint)

采集浏览器指纹信息:

  • get_indexedDB()
  • get_openDatabase()
  • get_localStorage()
  • get_sessionStorage()
  • get_audio()
  • get_file()
  • get_canvas() - Canvas指纹
  • get_webgl() - WebGL指纹
  • get_webgl_render()
  • get_plugins()
  • get_language() - 浏览器语言
  • get_languages()
  • get_platform()
  • get_cpuClass()
  • get_hardwareConcurrency()
  • get_timezone_offset() - 时区偏移
  • get_timezone() - 时区信息
  • get_screen_ratio() - 屏幕比例
  • get_screen_resolution() - 屏幕分辨率
  • get_touch_support() - 触摸支持
  • get_media_devices() - 媒体设备
  • get_battery() - 电池信息
  • get_adBlock() - 广告拦截检测
  • get_userAgent() - 用户代理

3.4 数据处理与存储

采集的数据经过处理后存入cookie:

  • set_bot_cookie() - 将工具特征(tool_feature)加密后存入cookie 8PHkpr8y
  • set_fingerprint() - 将浏览器指纹(fingerprint)加密后存入cookie JF7cGtR5

四、事件监听机制

4.1 链接(a标签)监听

  • 设置EventListenerEx()监听
  • 页面加载完成时触发load_func(),对当前cookie执行base64编码操作,并设置参数名为KBwtGA
function confuse_cookie() {
    var e;
    _document.cookie && 0 != _global_config.content.enabled && 
    '1' == _global_config.content.confuse_type && 
    (e = _document.cookie, clearAllCookie(), 
    CookieUtil.set('KBwtGA', btoa(e)))
}
  • 点击事件触发a_click_handler(),对请求地址添加令牌(token),参数名为SflKxwRJ
  • replace_url()调用get_token()生成加密token

4.2 表单(form)监听

  • 设置EventListenerEx()监听
  • 表单事件触发form_hook()
    • 调用get_submit()对表单数据加密,参数名为UVjDKO6n
    • 调用get_token()生成加密token,参数名为SflKxwRJ

4.3 AJAX请求监听

  • AJAX事件触发ajax_hook()
    • GET请求:调用get_body_for_get()对args数据使用get_token()加密
    • POST请求:
      • 调用get_body_for_post()对请求体使用get_submit()加密
      • 对URL使用replace_url()调用get_token()生成加密token

五、加密机制分析

5.1 数据加密流程

  1. 采集window/navigator的特征值
  2. 按位计算形成整数
  3. 使用RC4算法加密
    • 指纹特征存入cookie JF7cGtR5
    • 工具特征存入cookie 8PHkpr8y

5.2 请求加密流程

  1. 监听a标签、form表单、ajax请求
  2. 触发时:
    • 对数据内容调用get_submit()使用RC4算法加密
    • 对URL调用get_token()使用RC4算法计算token令牌

六、防御绕过思路

6.1 检测点规避

  1. WebDriver检测

    • 修改navigator.webdriver属性
    • 避免使用明显的自动化工具特征
  2. 指纹一致性

    • 保持指纹特征的一致性
    • 避免异常的设备参数
  3. 行为模拟

    • 添加合理的操作间隔
    • 模拟人类操作模式

6.2 加密处理

  1. Cookie处理

    • 正确处理8PHkpr8yJF7cGtR5SflKxwRJ三个关键cookie
    • 确保加密参数符合预期
  2. 请求处理

    • 对表单和AJAX请求进行适当的加密
    • 确保token参数正确附加

七、总结

该安全网关的前端防御机制主要特点:

  1. 通过多维度特征采集构建浏览器指纹
  2. 使用RC4算法对关键数据进行加密
  3. 通过事件监听确保交互行为的安全性
  4. 关键检测点集中在自动化工具特征识别
  5. 采用cookie作为数据传输载体

防御核心在于特征采集的全面性和加密机制的可靠性,对抗此类防御需要深入理解其检测逻辑和加密流程。

安全网关前端JS防御机制深度分析 〇、前言 xxx安全网关是一款用于前端防御自动化工具的安全系统,其核心工作机制如下: 核心代码由服务器下发给客户端执行 通过cookie将执行结果带回服务器 根据JS获取的前端数据分析判断用户是否异常 完成安全检测流程 一、代码入口分析 1.1 核心参数 JS计算结果通过以下三个cookie参数名传递给服务器: 8PHkpr8y - 工具特征 JF7cGtR5 - 浏览器指纹 SflKxwRJ - 令牌(token) 1.2 代码结构 核心逻辑位于 ng_dynamic_defend 文件的尾部几行,代码以明文形式存储,未经过混淆或加密。 二、配置读取机制 2.1 配置获取流程 2.2 配置内容解析 解码后的配置JSON: 三、数据采集机制 3.1 工具特征检测(get_ tool_ feature) 检测自动化工具特征: get_webdriver() - 检测 window.navigator.webdriver get_phantomjs() - 通过 window.navigator.userAgent 检测PhantomJS get_bot() - 检测以下关键字: get_navigator_for_tool() - 检测 window.navigator.languages get_canvas_for_tool() - 检测 window.document.createElement('canvas').getContext get_storage_for_tool() - 检测 window.localStorage 和 window.sessionStorage get_consol() - 检测 window.console.log(1) get_awvs() - 检测AWVS扫描器特征: get_appscan() - 检测AppScan扫描器特征: 3.2 浏览器特征检测(get_ browser_ feature) 检测浏览器环境特征: get_indexedDB() - window.indexedDB get_openDatabase() - window.openDatabase get_localStorage() - window.localStorage get_sessionStorage() - window.sessionStorage get_audio() - window.AudioContext.destination get_file() - 检测 File 对象类型 isCanvasSupported() - 检测Canvas支持 isWebGlSupported() - 检测WebGL支持 get_plugins() - window.navigator.plugins get_languages() - window.navigator.languages get_platform() - window.navigator.platform get_cpuClass() - _navigator.cpuClass get_hardwareConcurrency() - _navigator.hardwareConcurrency get_namespaces() - window.document.namespaces get_documentMode() - window.document.documentMode get_ActivexObject() - window.document.ActivexObject get_StyleMedia() - window.StyleMedia get_opera() - window.opera get_firefox() - 检测Firefox get_chrome() - 检测Chrome get_safari() - 检测Safari 3.3 浏览器指纹采集(get_ fingerprint) 采集浏览器指纹信息: get_indexedDB() get_openDatabase() get_localStorage() get_sessionStorage() get_audio() get_file() get_canvas() - Canvas指纹 get_webgl() - WebGL指纹 get_webgl_render() get_plugins() get_language() - 浏览器语言 get_languages() get_platform() get_cpuClass() get_hardwareConcurrency() get_timezone_offset() - 时区偏移 get_timezone() - 时区信息 get_screen_ratio() - 屏幕比例 get_screen_resolution() - 屏幕分辨率 get_touch_support() - 触摸支持 get_media_devices() - 媒体设备 get_battery() - 电池信息 get_adBlock() - 广告拦截检测 get_userAgent() - 用户代理 3.4 数据处理与存储 采集的数据经过处理后存入cookie: set_bot_cookie() - 将工具特征( tool_feature )加密后存入cookie 8PHkpr8y set_fingerprint() - 将浏览器指纹( fingerprint )加密后存入cookie JF7cGtR5 四、事件监听机制 4.1 链接(a标签)监听 设置 EventListenerEx() 监听 页面加载完成时触发 load_func() ,对当前cookie执行base64编码操作,并设置参数名为 KBwtGA 点击事件触发 a_click_handler() ,对请求地址添加令牌(token),参数名为 SflKxwRJ replace_url() 调用 get_token() 生成加密token 4.2 表单(form)监听 设置 EventListenerEx() 监听 表单事件触发 form_hook() 调用 get_submit() 对表单数据加密,参数名为 UVjDKO6n 调用 get_token() 生成加密token,参数名为 SflKxwRJ 4.3 AJAX请求监听 AJAX事件触发 ajax_hook() GET请求:调用 get_body_for_get() 对args数据使用 get_token() 加密 POST请求: 调用 get_body_for_post() 对请求体使用 get_submit() 加密 对URL使用 replace_url() 调用 get_token() 生成加密token 五、加密机制分析 5.1 数据加密流程 采集window/navigator的特征值 按位计算形成整数 使用RC4算法加密 指纹特征存入cookie JF7cGtR5 工具特征存入cookie 8PHkpr8y 5.2 请求加密流程 监听a标签、form表单、ajax请求 触发时: 对数据内容调用 get_submit() 使用RC4算法加密 对URL调用 get_token() 使用RC4算法计算token令牌 六、防御绕过思路 6.1 检测点规避 WebDriver检测 : 修改 navigator.webdriver 属性 避免使用明显的自动化工具特征 指纹一致性 : 保持指纹特征的一致性 避免异常的设备参数 行为模拟 : 添加合理的操作间隔 模拟人类操作模式 6.2 加密处理 Cookie处理 : 正确处理 8PHkpr8y 、 JF7cGtR5 、 SflKxwRJ 三个关键cookie 确保加密参数符合预期 请求处理 : 对表单和AJAX请求进行适当的加密 确保token参数正确附加 七、总结 该安全网关的前端防御机制主要特点: 通过多维度特征采集构建浏览器指纹 使用RC4算法对关键数据进行加密 通过事件监听确保交互行为的安全性 关键检测点集中在自动化工具特征识别 采用cookie作为数据传输载体 防御核心在于特征采集的全面性和加密机制的可靠性,对抗此类防御需要深入理解其检测逻辑和加密流程。