WAF/Web应用安全(拦截恶意非法请求)

Web 应用防火墙(Web Application Firewall, WAF)通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击,保护 Web 服务安全稳定。

Web 安全是所有互联网应用必须具备的功能,没有安全防护的应用犹如怀揣珠宝的儿童独自行走在盗贼环伺的黑夜里。我们准备开发一个 Web 应用防火墙,该防火墙可作为 Web 插件,部署在 Web 应用或者微服务网关等 HTTP 服务的入口,拦截恶意请求,保护系统安全。我们准备开发的 Web 应用防火墙名称为“SkyNet 天网”。

需求分析

HTTP 请求发送到 Web 服务器时,请求首先到达 SkyNet 防火墙,防火墙判断请求中是否包含恶意攻击信息。如果包含,防火墙根据配置策略,可选择拒绝请求,返回 418 状态码;也可以将请求中的恶意数据进行消毒处理,也就是对恶意数据进行替换,或者插入某些字符,从而使请求数据不再具有攻击性,然后再调用应用程序处理。如下图:

SkyNet需要处理的攻击和安全漏洞列表:

概要设计

SkyNet能够发现恶意攻击请求的主要手段,是对 HTTP 请求内容进行正则表达式匹配,将各种攻击类型可能包含的恶意内容构造成正则表达式,然后对 HTTP 请求头和请求体进行匹配。如果匹配成功,那么就触发相关的处理逻辑,直接拒绝请求;或者将请求中的恶意内容进行消毒,即进行字符替换,使攻击无法生效。

其中,恶意内容正则表达式是通过远程配置来获取的。如果发现了新的攻击漏洞,远程配置的漏洞攻击正则表达式就会进行更新,并在所有运行了 SkyNet防火墙的服务器上生效,拦截新的攻击。组件图如下:

HTTP 请求先到达请求过滤器,请求过滤器提取 HTTP 请求头和 HTTP 请求体中的数据,这个过滤器其实就是 Java 中的 Filter。过滤器调用漏洞策略处理器进行处理,而漏洞策略处理器需要调用漏洞定义文件加载模块获得漏洞定义规则,漏洞定义文件加载模块缓存了各种漏洞定义规则文件,如果缓存超时,就从远程配置中心重新加载漏洞定义规则。

漏洞定义规则文件是 SkyNet的核心,该文件定义了攻击的正则表达式,过滤器正是通过使用这些正则表达式匹配 HTTP 请求头和 HTTP 请求体的方式,识别出 HTTP 请求中是否存在攻击内容。同时,漏洞定义规则文件中还定义了发现攻击内容后的处理方式:是拒绝请求,跳转到出错页面,还是采用消毒的方式,将攻击内容字符进行替换。

漏洞规则定义文件采用 XML 格式,示例如下:

<?xml version="1.0"?>

<recipe

attacktype="Sql"

path="^/protectfolder/.*$"

description="Sql injection attacks"

>

<ruleSet

stage = "request"

condition = "or"

>

<action

name="forward"

arg="error.html"

/>

<rule

operator = "regex"

arg = "paramNames[*]"

value = "select|update|delete|count|*|sum|master|script|'|declare|

          or|execute|alter|statement|executeQuery|count|executeUpdate"

/>

</ruleSet>

<ruleSet

stage = "response"

condition = "or"

>

<action

name ="replace"

arg = " "

/>

<rule

operator = "regex"

arg = " responseBody "

value = "(//.+\n)|(/\*\*.+\*/)|(<!--.*-->)"

/>

</ruleSet>

</recipe>

recipe 是漏洞定义文件的根标签,属性 attacktype 表示处理的攻击类型,有以下几种。

SQL: SQL 注入攻击

XSS: 跨站点脚本攻击

CSC: 注释与异常信息泄露

CSRF: 跨站点请求伪造

FB: 路径遍历与强制浏览

path 表示要处理的请求路径,可以为空,表示处理所有请求路径。

ruleSet 是漏洞处理规则集合,一个漏洞文件可以包含多个 ruleSet。stage 标签表示处理的阶段,请求阶段:request,响应阶段:response。condition 表示和其他规则的逻辑关系,“or”表示“或”关系,即该规则处理完成后,其他规则不需要再处理;“and”表示“与”关系,该规则处理完成后,其他规则还需要再处理。

action 表示发现攻击后的处理动作。“forward”表示表示跳转到出错页面,后面的“arg”表示要跳转的路径;“replace”表示对攻击内容进行替换,即所谓的消毒,使其不再具有攻击性,后面的“arg”表示要替换的内容。

rule 表示漏洞规则,触发漏洞规则,就会引起 action 处理动作。operator 表示如何匹配内容中的攻击内容,“regex”表示正则表达式匹配,“urlmatch”表示 URL 路径匹配。“arg”表示要匹配的目标,可以是 HTTP 请求参数名、请求参数值、请求头、响应体、ULR 路径。“value”就是匹配攻击内容的正则表达式。

详细设计

SkyNet 可以处理的攻击类型有哪些?它们的原理是什么?SkyNet 对应的处理方法又是什么?详细设计将解决这些问题。

XSS 跨站点脚本攻击

XSS 攻击即跨站点脚本攻击 (Cross Site Script),指黑客通过篡改网页,注入恶意 JavaScript 脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

常见的 XSS 攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的。如图:

攻击者发布的微博中有一个含有恶意脚本的 URL(在实际应用中,该脚本在攻击者自己的服务器 www.2kt.cn 上,URL 中包含脚本的链接),用户点击该 URL,会自动关注攻击者的新浪微博 ID,发布含有恶意脚本 URL 的微博,攻击就被扩散了。

另外一种 XSS 攻击是持久型 XSS 攻击,黑客提交含有恶意脚本的请求,保存在被攻击的 Web 站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的。如图:

此种攻击经常使用在论坛、博客等 Web 应用中。

SkyNet 采用正则表达式匹配含有 XSS 攻击内容的请求,正则表达式如下:

"(?:\b(?:on(?:(?:mo(?:use(?:o(?:ver|ut)|down|move|up)|ve)|key(?:press|down|up)|c(?:hange|lick)|s(?:elec|ubmi)t|(?:un)?load|dragdrop|resize|focus|blur)\b\W*?=|abort\b)|(?:l(?:owsrc\b\W*?\b(?:(?:java|vb)script|shell)|ivescript)|(?:href|url)\b\W*?\b(?:(?:java|vb)script|shell)|background-image|mocha):|type\b\W*?\b(?:text\b(?:\W*?\b(?:j(?:ava)?|ecma)script\b|[vbscript])|application\b\W*?\bx-(?:java|vb)script\b)|s(?:(?:tyle\b\W*=.*\bexpression\b\W*|ettimeout\b\W*?)\(|rc\b\W*?\b(?:(?:java|vb)script|shell|http):)|(?:c(?:opyparentfolder|reatetextrange)|get(?:special|parent)folder)\b|a(?:ctivexobject\b|lert\b\W*?\())|<(?:(?:body\b.*?\b(?:backgroun|onloa)d|input\b.*?\\btype\b\W*?\bimage)\b|!\[CDATA\[|script|meta)|(?:\.(?:(?:execscrip|addimpor)t|(?:fromcharcod|cooki)e|innerhtml)|\@import)\b)"

匹配成功后,根据漏洞定义文件,可以选择 forward 到错误页面,也可以采用 replace 方式进行消毒,replace 消毒表如下:

在 XSS 攻击字符前后加上“&nbsp;”字符串,使得攻击脚本无法运行,同时在浏览器显示的时候不会影响显示内容。

SQL 注入攻击

SQL 注入攻击的原理如下:

攻击者在 HTTP 请求中注入恶意 SQL 命令 (drop table users;),服务器用请求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。

如果在 Web 页面中有个输入框,要求用户输入姓名,普通用户输入一个普通的姓名 Frank,那么最后提交的 HTTP 请求如下:

http://www.a.com?username=Frank

服务器在处理计算后,向数据库提交的 SQL 查询命令如下:

Select id from users where username='Frank';

但是恶意攻击者可能会提交这样的 HTTP 请求:

http://www.a.com?username=Frank';drop table users;--

即输入的 uername 是:

Frank';drop table users;--

这样,服务器在处理后,最后生成的 SQL 是这样的:

Select id from users where username='Frank';drop table users;--';

事实上,这是两条 SQL,一条 select 查询 SQL,一条 drop table 删除表 SQL。数据库在执行完查询后,就将 users 表删除了,系统崩溃了。

处理 SQL 注入攻击的 rule 正则表达式如下。

(?:\b(?:(?:s(?:elect\b(?:.{1,100}?\b(?:(?:length|count|top)\b.{1,100}?\bfrom|from\b.{1,100}?\bwhere)|.*?\b(?:d(?:ump\b.*\bfrom|ata_type)|(?:to_(?:numbe|cha)|inst)r))|p_(?:(?:addextendedpro|sqlexe)c|(?:oacreat|prepar)e|execute(?:sql)?|makewebtask)|ql_(?:longvarchar|variant))|xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|e(?:xecresultset|numdsn)|(?:terminat|dirtre)e|availablemedia|loginconfig|cmdshell|filelist|makecab|ntsec)|u(?:nion\b.{1,100}?\bselect|tl_(?:file|http))|group\b.*\bby\b.{1,100}?\bhaving|load\b\W*?\bdata\b.*\binfile|(?:n?varcha|tbcreato)r|autonomous_transaction|open(?:rowset|query)|dbms_java)\b|i(?:n(?:to\b\W*?\b(?:dump|out)file|sert\b\W*?\binto|ner\b\W*?\bjoin)\b|(?:f(?:\b\W*?\(\W*?\bbenchmark|null\b)|snull\b)\W*?\()|(?:having|or|and)\b\s+?(?:\d{1,10}|'[^=]{1,10}')\s*?[=<>]+|(?:print\]\b\W*?\@|root)\@|c(?:ast\b\W*?\(|oalesce\b))|(?:;\W*?\b(?:shutdown|drop)|\@\@version)\b|'(?:s(?:qloledb|a)|msdasql|dbo)')

从请求中匹配到 SQL 注入攻击内容后,可以设置跳转错误页面,也可以选择消毒 replace,replace 表如下:

CSRF 跨站点请求伪造攻击

CSRF(Cross Site Request Forgery,跨站点请求伪造),攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易、发表评论等,如图:

CSRF 的主要手法是利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。其核心是利用了浏览器 Cookie 或服务器 Session 策略,盗取用户身份。

SkyNet的防攻击策略,是过滤器自动在所有响应页面的表单 form 中添加一个隐藏字段,合法用户在提交请求的时候,会将这个隐藏字段发送到服务器,防火墙检查隐藏字段值是否正确,来确定是否为 CSRF 攻击。恶意用户的请求是自己伪造的,无法构造这个隐藏字段,就会被防火墙拦截。

注释与异常信息泄露

为调试程序方便或其他不恰当的原因,有时程序开发人员会在前端页面程序中使用 HTML 注释语法进行程序注释,这些 HTML 注释就会显示在客户端浏览器,给黑客造成攻击便利。

此外,许多 Web 服务器默认是打开异常信息输出的,即服务器端未处理的异常堆栈信息会直接输出到客户端浏览器,这种方式虽然对程序调试和错误报告有好处,但同时也给黑客造成可乘之机。黑客通过故意制造非法输入,使系统运行时出错,获得异常信息,从而寻找系统漏洞进行攻击。

匹配 HTML 注释的正则表达式如下:

“&lt;!--(.|&#x000A;|&#x000D;)*--&gt;”

如果匹配到 HTML 注释,就用空字符串 replace 该注释。

对于异常信息泄露,SkyNet会检查响应状态码。如果响应状态码为 500 系列错误,则会进一步匹配响应体内容,检查是否存在错误堆栈信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 下centos 查看 -std 是否支持 C17

实际工作中&#xff0c;可能会遇到c的一些高级特性&#xff0c;例如std::invoke&#xff0c;此函数是c17才引入的&#xff0c;如何判断当前的gcc是否支持c17呢&#xff0c;这里提供两种办法。 1.根据gcc的版本号来推断 gcc --version&#xff0c;可以查看版本号&#xff0c;笔者…

Vue上传图片返回base64并在页面展示,并图片上canvas进行红框框选标记

https://www.cnblogs.com/szqtiger/p/12100754.html vue如何显示base64图片_vue显示base64_不断学习的码农的博客-CSDN博客 图片上进行红框框选_时小帅的博客-CSDN博客 设置canvas画布大小_canvas设置画布大小_最凶残的小海豹的博客-CSDN博客 图片回显 结合以上&#xff0…

Idea maven窗口 展示不分级 maven层级混乱

1. 正在写分布式im 开源项目&#xff1a;nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate&#xff08;长连接服务&#xff09; logic &#xff08;业务&#xff09; lsb &#xff08;负载均衡&#xff09;store&#xff08;存储&#xff09; - Gitee.com …

vue学习笔记(三)

1.vue开发存在SEO问题 前端开发采用vue开发后是单页面 单页面里面&#xff0c;前后端分离&#xff0c;渲染过程是js写的&#xff0c;在js调用接口返回数据之前&#xff0c;页面已经被打开了 实际上就是空白页面&#xff0c;这个时候右键点击查看源代码&#xff0c;实际上是都…

前端学习——Vue (Day2)

指令补充 指令修饰符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

两天学会用Webpack打包前端代码-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 什么是 Webpack&#xff1f; 使用 Webpack 体验webpack打包过程 修改 Webpack 打包入口和出口 入口 出…

vue3+taro+Nutui 开发小程序(一)

前言&#xff1a;最近在调研开发小程序&#xff0c;发现现在taro框架逐渐成熟&#xff0c;能完美地使用vue3来进行开发&#xff0c;调研中发现京东的Nutui也不错所以准备写一个由0到1的vue3taroNutui的小程序。 这篇我们首先搭建一个框架&#xff1a; vscode插件准备环节&…

Sublime Text 4 激活教程(Windows+Mac)

下载安装 官网 https://www.sublimetext.com 点击跳转 2023.7.21 版本为4143 Windows激活方式 一、激活License方式 入口在菜单栏中"Help” -> “Enter License” 注意格式&#xff0c;可能会过期失效&#xff0c;失效就用方式二 Mifeng User Single User License E…

F.interpolate 数组采样操作

功能&#xff1a;利用插值方法&#xff0c;对输入的张量数组进行上\下采样操作&#xff0c;换句话说就是科学合理地改变数组的尺寸大小&#xff0c;尽量保持数据完整。 在计算机视觉中&#xff0c;interpolate函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中&…

《Unix环境高级编程》第三版源代码编译

CentOS 7.6 进行编译 使用cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810 (Core)&#xff0c;使用uname -r看到内核是3.10.0-957.el7.x86_64&#xff0c;gcc --version可以看到gcc版本是4.8.5。 wget http://www.apuebook.com/src.3e.tar.gz下载《Uni…

java学习路程之篇一、进阶知识、面向对象高级、static关键字、继承、final关键字、this、super

文章目录 1、面向对象高级2、static关键字3、继承4、final关键字 1、面向对象高级 2、static关键字 3、继承 4、final关键字

MyBatis学习笔记——4

MyBatis学习笔记——4 一、MyBatis的高级映射及延迟加载1.1、多对一1.1.1、第一种方式&#xff1a;级联属性映射1.1.2、第二种方式&#xff1a;association1.1.3、第三种方式&#xff1a;分步查询 1.2、一对多1.2.1、第一种方式&#xff1a;collection1.2.1、第二种方式&#x…

【OAuth2】OAuth2概述及使用GitHub登录第三方网站

【OAuth2】OAuth2概述及使用GitHub登录第三方网站 文章目录 【OAuth2】OAuth2概述及使用GitHub登录第三方网站0. 导言1. OAuth2 简介2. OAuth2 认证授权总体流程3. OAuth2 标准接口4. OAuth2 四种授权模式4.1 授权码模式4.2 简化模式4.3 密码模式4.4 客户端模式 5. GitHub授权登…

Docker 的数据管理、容器互联、镜像创建

目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联&#xff08;使用centos镜像&#xff09; 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像&#xff0c;在容器里修改 1.2将修改后的容器提交为新的镜像&#xff0c;需使用该容器的id号创建新镜像 …

电脑显示连接上WiFi,但没办法上网

问题: 电脑显示已经连接上WiFi。但是百度不出来东西&#xff0c;也没办法打开任何网页。 解决方法&#xff1a; win10系统 在左下角搜索栏&#xff0c;搜索“代理服务器设置”。 找到手动设置代理 —》关闭“使用代理服务” 【默认是打开的】 关闭之后即可上网~~

【Git】分支合并冲突产生与解决

文章学习自&#xff1a;麦兜搞IT&#xff0c;如有侵权&#xff0c;告知删除 文章目录 前言1 Fast Forword 合并1.1 核心原理1.2 举个栗子1.3 经验之谈 2 three way merge2.1 核心原理2.2 举个栗子&#xff08;不带冲突&#xff09;2.3 带冲突的three way merge 3 变基rebase3.…

Android WiFi框架概览

概览 Android 提供默认 Android 框架实现&#xff0c;其中包括对各种 WLAN 协议和模式的支持&#xff0c;这些协议和模式包括&#xff1a; WLAN 基础架构 (STA)网络共享模式或仅限本地模式下的 WLAN 热点 (Soft AP)WLAN 直连&#xff08;点对点&#xff09;WLAN 感知 (NAN)WL…

【简单认识MySQL主从复制与读写分离】

文章目录 一、MySQL主从复制1、配置主从复制的原因&#xff1a;2、主从复制原理1、 MySQL的复制类型2、 MySQL主从复制的工作过程;1、 MySQL主从复制延迟2、优化方案&#xff1a;3、 MySQL 有几种同步方式&#xff1a; 三种4、异步复制&#xff08;Async Replication&#xff0…

Stream流List转Map报错Duplicate key StreamMap

项目场景&#xff1a; JDK8引入了Stream流&#xff0c;让程序员在开发中更方便进行集合之间的转换&#xff0c;在使用Stream流将List转为Map时&#xff0c;如果Map的key有重复的情况下&#xff0c;就会抛出java.lang.IllegalStateException: Duplicate key StreamMap这个异常。…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表&#xff1a;树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表&#xff0c;这样效率会高一些。 数组模拟单链表 邻接表&#xff1a;存储图和树 实…