此处记录的是3月完成的Web应用防火墙的具体流程。该Web应用防火墙基于OpenResty构建,该Web应用防火墙的其他细节请查看博客安全分类下的其他文章。
Web应用防火墙的执行模块
执行模块是Web应用防火墙的核心部分。执行模块会处理所有的HTTP/HTTPS流量。用户代理(浏览器)发送给服务器的所有数据都会被执行模块拦截,只有符合Web应用防火墙定义的安全流量才会被继续发送给后端Web应用程序,当发现不符合Web应用防火墙安全策略的流量时,执行模块会对违反不同安全策略的流量做出不同的处理。执行模块的运行流程图如下图所示。
是否在IP白名单中?
执行模块首先会调用功能模块中的子功能判断当前用户代理(浏览器)的IP地址是否是预先定义的白名单IP,如果当前用户代理(浏览器)的IP地址是预先定义的白名单IP,那么跳过其他所有检查,让流量通过。这么做的主要目的是方便开发者开发,开发者添加自己的IP为白名单IP后,无论做什么操作都会被认为是合法操作,相当于预授权。
是否在IP黑名单中?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)的IP地址是否是预先定义的黑名单IP,如果当前用户代理(浏览器)的IP地址是预先定义的黑名单IP,那么跳过其他所有检查,返回403禁止访问。这么做的主要目的是将一些惯犯的IP标记起来,减少判断次数,当然考虑到目前大多数设备都使用了动态IP,或者多个设备共享同一个IP,黑名单IP需要定期清除、更新。
是否是CC攻击?
接下来,执行模块会调用功能模块中的子功能判断当前请求是否是CC攻击,判断CC攻击的标准由配置模块中的CC攻击标准配置项决定,默认限制是每秒60次每IP每URI。这意味着,同一个IP在一秒内累计访问同一个URI的次数达到60次,Web应用防火墙就会认为此IP访问此URI造成了CC攻击,此时,Web应用防火墙会对此IP访问此URI的所有后续请求返回503服务器忙。累计次数每秒会自动清零,这意味着在一秒内用户代理(浏览器)的访问只要不超过阈值就可以持续对URI进行访问。
是否是扫描器?
接下来,执行模块会调用功能模块中的子功能判断发起当前请求的用户代理(浏览器)是否是扫描器,判断是否是扫描器的标准是检查当前请求的特征是否符合任何已知扫描器特征的任意一项。这些扫描器的特征往往包含URL信息、Headers信息、Cookie信息、Body信息以及一些扫描器特定的字段信息。只要在当前用户代理(浏览器)的特征值中匹配到这些信息中的任何一项,那么就可以判断当前用户代理(浏览器)是扫描器。是否拦截扫描器在配置模块中的扫描器拦截开关配置项中配置,一旦开启了拦截扫描器开关,那么所有扫描器将会得到444空回应。
是否是白名单URI?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)请求的URI是否是白名单URI,如果当前用户代理(浏览器)请求的URI是白名单URI,那么跳过其他所有检查,请求通过。这样做的主要目的是方便开发者设置正在开发中的可以对所有人可见的页面,设置白名单URI之后,对该URI发送的任何有害请求都会被认为是合法请求,开启了白名单URI就意味着对该URI开启了预授权。
是否是黑名单UA?
接下来,执行模块会调用功能模块中的子功能判断发起当前用户代理(浏览器)是否是黑名单UA(User-Agent,用户代理),如果当前用户代理(浏览器)是黑名单UA,那么跳过其他所有检查,返回403禁止访问。这样做的主要目的是杜绝一些爬虫和小型扫描器的访问。
是否是黑名单URI?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)请求的URI是否是黑名单URI,如果当前用户代理(浏览器)请求的URI是黑名单URI,那么跳过其他所有检查,返回403禁止访问。这样做的主要目的是禁止一些敏感页面的对外展示。开启了黑名单URI之后,黑名单中的URI将只能由白名单IP中的用户代理(浏览器)访问到,达到了URI级别的访问控制。
GET请求中是否包含恶意参数?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)发送的GET请求中是否包含恶意数据。Web应用防火墙将会拦截所有GET请求中的数据,使用配置模块中的GET请求安全策略规则配置项中的配置作为正则匹配的规则,对拦截到的GET请求中的数据进行正则匹配,一旦匹配到GET请求安全策略规则中定义的任何一项恶意数据,该GET请求将会被拦截,返回403禁止访问。
Cookie中是否包含恶意参数?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)发送的Cookie信息中是否包含恶意数据。Web应用防火墙将会拦截所有Cookie中的数据,使用配置模块中的Cookie安全策略规则配置项中的配置作为正则匹配的规则,对拦截到的Cookie中的数据进行正则匹配,一旦匹配到Cookie安全策略规则中定义的任何一项恶意数据,该请求将会被拦截,返回403禁止访问。
POST请求中是否包含恶意参数?
接下来,执行模块会调用功能模块中的子功能判断当前用户代理(浏览器)发送的POST请求中是否包含恶意数据。Web应用防火墙首先会检查POST请求中是否有POST请求的特征关键字“边界”,确认包含“边界”关键字后才会进行下一步检查。POST请求中一般是表单中的数据,表单中的数据有四种编码形式。
POST请求中表单中数据的四种编码形式
第一种编码形式是form-data,这种编码形式能够传递键值对,文件、文件名,Web应用防火墙会判断当前POST请求中的数据是否是form-data编码的数据,之后会从这种形式编码的数据中解码获取文件名、键值对等数据。
第二种编码形式是,x-www-form-urlencoded,这种编码方式只能传递键值对,Web应用防火墙会判断当前POST请求中的数据是否是x-www-form-urlencoded编码的数据,之后只会检查键值对中是否存在恶意数据。
第三种编码形式是raw,即纯文本,这种编码形式只能传递纯文本,不能传递键值对也不能传递带文件名的文件,Web应用防火墙会判断当前POST请求中的数据是否是raw格式的数据,之后只会检查该纯文本中是否存在恶意数据。
第四种编码形式是binary形式,这种二进制数据类似纯文本,不能传递键值对也不能传递带文件名的文件,Web应用防火墙会判断当前POST请求中的数据是否是binary格式的数据,之后只会检查该二进制流中是否存在恶意数据。Web应用防火墙将会拦截所有POST请求中的数据,使用配置模块中的POST请求安全策略规则配置项中的配置作为正则匹配的规则,对拦截到的POST请求中的数据进行正则匹配,其中,除了对正常的键值对匹配,POST请求中传输的文件及文件名也会被匹配,一旦匹配到POST请求安全策略规则中定义的任何一项恶意数据,该POST请求将会被拦截,返回403禁止访问。
如果以上的检测都通过,那么该请求被认为是安全的请求,请求将会被发送给Web后端应用程序进行处理。
Comments | NOTHING