记录雷池动态防护的一个 bug

1,327 阅读2分钟

问题背景

雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。

版本信息

  • 雷池版本 6.2.0
  • Docker 24.0.5
  • ShowDoc v3.2.2

雷池社区版 6.0.0 推出了动态加密功能

站点高级防护新增动态防护(BETA),能自动动态加密网站的 html 和 js 源码,阻止爬虫和攻击自动化程序的分析

问题发现

笔者在第一时间就进行了体验,但在测试的时候发现部署的其中的一个网站(开源的 ShowDoc)出现了“业务级别异常的错误”:

image.png

问题排查过程

雷池在几个版本后似乎还没有修复该问题,但出于对技术的好奇和探索精神,我决定自己先找出原因:

首先,查看了错误所在的 JS:

image.png

断点

在报错的关键位置设置了断点:

image.png

通过刷新页面,发现返回的 data 数据存在异常。

image.png

对比

为了对比,我关闭了对该网站的动态防护功能,观察是否有区别:

状态图片
开启image.png
关闭image.png

通过对比可以发现似乎是开启动态加密后雷池返回了一个页面而不是 JSON,尝试对比 Network 信息。

标题
开启image.png
关闭image.png

通过对比 Network 信息,可以看出,雷池在开启动态加密后,返回的是一个页面而不是 JSON 格式数据。

分析与猜想

雷池因为某种原因对接进行了加密,分析为什么会错误地使用加密。

首先,雷池是如何知道自己是否需要加密请求呢?

Content-Type 用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

因此我估计雷池是通过 Content-Type 来决定是否执行网页加密:

image.png

ShowDoc 在响应的时候没有按照标准的 HTTP 规范来响应,此处应该是 application/json,通过响应头进一步验证了猜想。

总结

雷池的动态加密功能在提高网站安全性方面具有显著优势,但在该版本(及其以上)可能会因为响应格式的不规范而误触发加密,导致业务异常。同时也希望雷池能够尽快解决该问题。