某安全网关前端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.webdriverget_phantomjs()- 通过window.navigator.userAgent检测PhantomJSget_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_Recorderget_navigator_for_tool()- 检测window.navigator.languagesget_canvas_for_tool()- 检测window.document.createElement('canvas').getContextget_storage_for_tool()- 检测window.localStorage和window.sessionStorageget_consol()- 检测window.console.log(1)get_awvs()- 检测AWVS扫描器特征:SimpleDOMXSSClass, MarvinHooks, MarvinPageExplorer, HashDOMXSSClassget_appscan()- 检测AppScan扫描器特征:appScanSendReplacement, appScanOnReadyStateChangeReplacement, appScanLoadHandler, appScanSetPageLoaded
3.2 浏览器特征检测(get_browser_feature)
检测浏览器环境特征:
get_indexedDB()-window.indexedDBget_openDatabase()-window.openDatabaseget_localStorage()-window.localStorageget_sessionStorage()-window.sessionStorageget_audio()-window.AudioContext.destinationget_file()- 检测File对象类型isCanvasSupported()- 检测Canvas支持isWebGlSupported()- 检测WebGL支持get_plugins()-window.navigator.pluginsget_languages()-window.navigator.languagesget_platform()-window.navigator.platformget_cpuClass()-_navigator.cpuClassget_hardwareConcurrency()-_navigator.hardwareConcurrencyget_namespaces()-window.document.namespacesget_documentMode()-window.document.documentModeget_ActivexObject()-window.document.ActivexObjectget_StyleMedia()-window.StyleMediaget_opera()-window.operaget_firefox()- 检测Firefoxget_chrome()- 检测Chromeget_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)加密后存入cookie8PHkpr8yset_fingerprint()- 将浏览器指纹(fingerprint)加密后存入cookieJF7cGtR5
四、事件监听机制
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
- 调用
- GET请求:调用
五、加密机制分析
5.1 数据加密流程
- 采集window/navigator的特征值
- 按位计算形成整数
- 使用RC4算法加密
- 指纹特征存入cookie
JF7cGtR5 - 工具特征存入cookie
8PHkpr8y
- 指纹特征存入cookie
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作为数据传输载体
防御核心在于特征采集的全面性和加密机制的可靠性,对抗此类防御需要深入理解其检测逻辑和加密流程。