超级干货:动态防御WAF技术原理及编程实战!
本文带给大家的内容是动态防御WAF的技术原理及编程实战。
将通过介绍ShareWAF的核心技术点,向大家展示动态防御的优势、实现思路,并以编程实战的方式向大家展示如何在WAF产品开发过程中应用动态防御技术。
ShareWAF是一款动态防御型WAF产品,其在反自动化攻击、反爬虫等领域应用了动态防御技术。
相比于传统WAF,动态防御型的WAF,有非常显著的优势:
【动态防御优势、原理】
概括而言,优势体现为两个词:主动防御、不可预见
传统WAF,是静待攻击来临、识别攻击,再抵御攻击。
应用动态防御技术后,WAF将逆转攻防模式:不再被动,而是时刻处于主动出击、积极防护状态。
举个例子:
假如打开一扇门:
传统WAF状态下,门后的景象总是一样的。
如果是动态防御WAF,每次打开门看到的将是不同的景色,可能是草原、可能是麦田。即:随机变化 、不可预测。
再举个例子:
比如射箭:
传统WAF状态下,箭靶是固定的。
如果是动态防御WAF,箭靶将是随机移动的。即:动态变化,目标不可预测。
具体到WAF产品中。
比如反暴力破解,传统WAF可能采用一套规则,例如:访问者IP或设备指纹+持续登录行为+连续尝试登录次数+登录失败次数,通过规则判断是否属于暴力破解行为。
这是正统的、中规中矩的防卫理念,是被动式的。
在这个进程中,攻击者是可以发起持续攻击的。而且,攻击者可以通过使用代理、修改设备特征等方式,规避WAF规则,尝试对WAF进行Bypass。
而如果是动态防御
以ShareWAF为例,在对抗暴力破解这一功能点上,采取的方式是完全不同的:
ShareWAF会对被破解的某个关键点,进行动态封装,比如:用户名。
具体而言:保护前,用户名在网页中经常是username之类的固定元素名称。暴力破解攻击者会用自动化的工具或脚本,自动对其赋值,然后发起请求、尝试登录,反复进行此操作即是攻击过程。
ShareWAF会对username进行封装,而且是动态的,用户端发起访问请求得到的将不再是username,每次得到的都是某个随机数符串。
这样,自动化的工具或脚本,就无法对关键的暴力破解点进行定位、赋值。攻击行为在前端就被终结。
ShareWAF的反爬虫也采用类似的理念。
【动态防御WAF编程实战】
前面是理论,接下来是实战,证明理论的可行性、演示如何在安全编程开发中应用动态防护技术。
将通过例程,分别演示ShareWAF的反自动化攻击、反爬虫功能的核心实现。
反自动化攻击
这里将通过一个例程,一个最简单的登录页面,模拟ShareWAF如何利用动态防御技术对暴力破解这类自动化攻击进行防御。
登录页而的关键内容,通常是这样的:
<form>
User:<input name=”username”/>
Pass:<input name=”password”/>
</form>
展现在浏览器端是一个简单的登录页,提供用户名、密码输入,并进行登录。
攻击者进行暴力破解时,可能采取的方式是:对username元素进行赋值,并发起登录;或用Burp Suite等工具拦截数据并修改数据包进行枚举破解。
这里且不再谈传统WAF的应对手段,直入主题,看ShareWAF是如何进行动态防御的。
例程代码只有几十行,展示最核心的”动态”概念。
这是一段NodeJS代码,实现了一个web服务,其中融入了ShareWAF的动态防御理念。
代码功能简单分析:
重点一:动态变形池,用于存放username和动态变形内容的对应关系;
重点二:在页面访问时,进行username元素动态变形、将变形对应关系存储到变形池,并将变形后的内容发送到浏览器端。这一步完成时,浏览器端原本一成不变的username元素将在每次访问或刷新时发生动态变化:
留意上方的name值,原本应该是username,而这时随机变化的字符串,两张图中name值是不同的,事实上,每次都是不同的。
假如攻击者原本采用自动化破解脚本:document.getElementById(“username”).value=”***”,这时将失效,因为username不见了,而且不可预见。
Burp Suite之类的数据包嗅探、截取、修改工具也失效了,因为关键字段username不见了。
动态防御的理念即是如此。当然,这并不是全部,只是动态防御的一小部分应用。
重点三、动态变形过的username当然是需要还原的,否则将影响原有的业务功能。代码中的”变形池”存放的是username和”变形码(即:随机变形的字符串)”对应关系。通过对应关系,可以很轻松的还原回username,在WAF功能中,这时该将还原后的数据再转发给被保护网站,实现正常的业务流程。
如图:username已被还原:
反爬虫
前一个例子是应用了针对内容的动态防御,在反爬虫领域,动态防御又有所不同。
爬虫有多种类型,下面要讲的反爬虫,准确的是说反内容爬虫,防止内容被爬取,也可以理解为防止网页内容被复制。
反内容爬虫,惯用的一种方式是进行字体加密,即使用自定义字体。
但一般来说,自定义字体反爬容易被破解:攻击者获取字体后,很容易进行逆向分析,得出字码对应逻辑,进而还原出原本内容。ShareWAF的反内容爬虫,在自定义字体的基础上,加入了”动态”概念:
使字体成为动态路径、字体文件不可被下载。
这部分功能的实现,原理与之前类似,同样是在将数据发往浏览器之前先对特定的内容:字体路径,做动态变化处理,在收到请求时,再还原为原始正确路径,使文件可读取。
有一点特殊之处是:为了防止从网页源码中查看字体路径、下载字体文件,又对”动态”路径增加了访问时间限制、使用一次即失效功能。如此,达到了:加载网页时文件可以正常读取,但非法获取文件路径却不能打开的目的。
效果展示:
在这两张图中可以看到:字体路径是变化的、从浏览器打开文件地址,文件不能读取和下载。
使字体成为动态字体,防止逆向分析。
动态自定义字体技术,在ShareWAF中称其为:动态字体变码加密。
如果是传统的自定义字体加密,相当于一种密码技术,也类似于传呼台数字代码表:
即用某个或某几个数字,代替某个或某几个文字。
具体到网页文字内容加密反爬,是如下的效果:
也就是网页中显示正常的”文字”,但在源码中实际并不存在,存在的是”文字”对应的密码字符。
这种文字,是不可复制的,整体复制网页中的文字时,”密码文字”部分将会缺失:
那么,爬虫也就无法复制、无法爬取内容。
这种技术的实现依赖于自定义字体,即网页源码中的css引入字体文件功能:
也就是需要引入自定义的字体文件。
自定义字体文件的相关知识不是本文的重点,在此略过。我们的重点是实现”动态自定义自体文件”。
这样做的原因是:
如果使用一个固定的自定义字体文件,字体和数字的对应关系是可以被分析得出的。如上面:
Ԕ;表示”我”,ԕ;表示”你”等等。
为了防止被分析出对应关系,我们需要对字体的加密码也进行动态处理。
在本例中,提供了一种方法,用于生成新的变码字体:
这是运行效果:
可以看到,出现了新的对应关系,与之前Ԕ;表示”我”,ԕ;表示”你”是不同的。
这样动态的改变字体编码,就可以防止文字和数字编码的对应关系被分析获取。
以上,便是ShareWAF动态防御技术在反自动化攻击、反爬虫场景中的应用。