浏览器JS反调试与绕过

  • A+
所属分类:安全文章

一、背景介绍

在读《风控要略:互联网业务反欺诈之路》的时候,设备指纹章节中提到了可以通过检测控制台是否开启作为WEB作弊环境的检测方案之一。

可见:第四章 设备指纹

又想到之前在真实环境中遇到过,所以学习一下。

二、反调试

有时候我们在测试一个站点的时候,刚打开F12,就发现暂停了,如下图所示,便可以判断目标页面做了JS反调试处理

浏览器JS反调试与绕过

做JS反调试通常是通过检测控制台是否开启,当检测到控制台开启了,则进入反调试逻辑

检测控制台是否开启的一些方案:

1、监听按键

如用户按F12、Ctrl+Shift+i的时候

2、窗口尺寸变化

利用打开控制台后HTML窗口的尺寸变化作为判断标准,如下是一个采用此方案作为检测依据的项目

https://github.com/sindresorhus/devtools-detect

3、debugger命令的执行时间

打开开发者工具后,在遇到debugger时,会进入暂停,在debugger之前记录时间start,debugger之后记录时间end,通过判断end与start的时间差来判断用户是否开启控制台。

尝试写一个简单的反调试代码,用浏览器访问的时候正常显示,打开开发者工具后则会暂停

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>Debugger</title>
</head>
<body>
   <h2>Hello Debugger</h2>
   <script type="module">
       setInterval(function() {
           debugger
      }, 1000);
   </script>
</body>
</html>

三、绕过反调试

我的Chrome是英文显示,Firefox是中文显示

1.停用断点功能

停用断点功能,简单粗暴,缺点是你自己也无法使用断点。

Chrome - Sources - Deactivate breakpoints (Ctrl + F8)

浏览器JS反调试与绕过

FireFox - 调试器 - 停用断点

浏览器JS反调试与绕过

2.设置断点条件

为断点设置条件,当设置的条件表达式为真时,调试器才会暂停。当设置为false时,则永远不会暂停。

Chrome - 右键 - Add Contitional Breakpoint

浏览器JS反调试与绕过

设置为false

浏览器JS反调试与绕过

Firefox - 右键 - 添加条件

浏览器JS反调试与绕过

3.不在此处暂停

类似白名单,在指定的位置不暂停。

Chrome - 右键 - Never Pause Here

浏览器JS反调试与绕过

Firefox - 右键 - 永不在此处暂停

浏览器JS反调试与绕过

4.响应包替换关键字

可以直接替换响应包中的debugger关键字

BurpSuite - Proxy - Options - Match and Replace 将debugger关键字设置为console.log('debugger')

浏览器JS反调试与绕过

这个时候我们再打开开发者工具时,便可以看到没有进入暂停页面

浏览器JS反调试与绕过

四、案例分析

在fofa中搜索body里面有bebugger关键字的WEB站点,选一个 http://www.fyw0.cn/

反调试逻辑

1、每1ms执行一次检测

2、在开启开发者工具的时候进入调试

2、通过debugger语句执行的时间是否小于50ms,判断是否重载页面

浏览器JS反调试与绕过

这里的逻辑比较简单且只有一个debugger,所以通过设置断点条件不在此处暂停绕过反调试非常快捷。

五、相关文档

https://stackoverflow.com/questions/7798748/find-out-whether-chrome-console-is-open


本文始发于微信公众号(thelostworld):浏览器JS反调试与绕过

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: