WAF web应用防火墙概述
WWW(万维网)概述
由互联网为基础 由许多超文本互联组成的咨询系统
有三大组件:
- html 超文本标记语言 构筑前端页面
- http 超文本传输协议 传输html页面
- url 统一资源定位符 唯一的标识系统资源
现如今 web功能越来越强大 漏洞也随着web便捷性提高而逐渐显露
从静态页面到动态页面: - 静态页面:
- 通过http请求后加载到浏览器
- 由html、xml、shtml等标记语言构成
- 页面内容 显示效果基本没有变化
- 动态页面:
- 不是简单的前端页面 存在后端结合数据库程序 能够实现交互
- 可编程性提高 通过cgi、ajax、asp、php、jsp等脚本 请求解析数据
- 由于交互性提高 也更加危险 攻击面广
由于web应用的广泛 且其功能强大 sql注入 中间件漏洞 xss等web漏洞层出不穷 web应用需要得到保护
url基本格式:
协议类型://用户名:用户密码@域名:端口/子目录?键=值#锚点数据(由浏览器处理 有定位作用)
http://user@pass@www.test.com:80/index.php?key=value#test
上面这个url 首先协议类型为http 首先 访问test.com 服务器进行身份认证 通过后访问服务器web资源中的index.php 传入参数key值为value 定位到页面中test的位置
http:
超文本传输协议 用于浏览器与web服务器之间通讯 是无状态的传输协议(不会记录识别用户)平时使用cookie来记录识别用户
在使用时 一般是由服务器首次完成身份验证后 返回一个响应 其中setcookie会指定客户端后面需要携带的cookie值
cookie分为:
-
cookie:键值对形式 如user:abc passwd:xxxx 通常存储在客户端本地 发起请求时带上cookie
服务器通过比对数据库 识别用户 缺点在于每次请求都会携带cookie 而这个cookie被他人窃取后能进行身份的伪造 -
session:客户端cookie中不存储数据 而是存储一个sessionid session存储在服务器内存中 当客户端访问服务器时带上sessionid 服务器取出对应session文件中数据 与数据库比对 识别用户 能安全一点 但sessionid泄露仍然会存在问题
-
token:验证信息存储在cookie中不依靠服务器或客户端存储 验证身份通过公钥机制 token分为三部分:header payload signature 签名部分是由服务器的公钥签名 服务器收到jwt后 通过解析header中的签名 hash算法 对jwt用自己的私钥解密 并使用同样的hash算法 比对hash 如果一致 身份验证成功 再到数据库中比对 识别用户
其中的payload的hash值就是验证身份的关键
我们常常使用secure或者httponly的形式防止cookie的泄露:
secure能防止cookie暴露在不安全网络中 设定secure后 只能通过https传递cookie
httponly能防止cookie被js代码访问 可以避免攻击者通过xss抓取cookie
http请求报文格式:
请求行:请求方法与url
首部:一些标识符 ua、content-type、XFF、cookie等
空行:分割首部与主体
主体:请求参数 内容
get方法一般没有主体
常用请求方法:
get:请求uri
post:请求uri 携带数据 传递数据到服务器
head:请求http报文首部
option:协商资源相关选项 获取服务器支持的请求方法
http响应格式:
状态行:状态码 原因语句 200 ok
消息首部:content-type content-length等响应
响应正文:传输的数据
https:
即http+ssl/tls
我们来了解一下tls/ssl的加密过程:
首先科普证书 证书为服务器信息加服务器公钥 通过第三方可信机构私钥签名后产生的
- 首先客户端发起请求 携带随机数1 并协商可支持的加密算法、协议(如rsa aes md5)等
- 服务收到客户端请求 得到随机数1 返回一个数据包 携带可支持的算法 加密协议 表示确认
- 服务器再次发送数据包 该数据包携带证书 以及公钥的hash值 以及一个公钥加密的随机数2
- 客户端收到服务器数据包 通过第三方公钥解密证书 取出服务器公钥 hash后对比如果一致 认为信道可信 使用公钥解密 得到随机数2
- 客户端生成随机数3 使用服务器公钥加密随机数3 发送给服务器 服务器解密后取出随机数3
- 客户端和服务器用三个随机数使用对称秘钥算法生成对称秘钥
WAF(web应用防火墙)
waf提供的防护主要有:网页防篡改 敏感信息泄露 http协议异常 目录遍历 webshell 盗链 扫描
暴力破解 owasptop10漏洞
waf的部署模式:
串联:二层透明模式 串联到网络中 最简单最广泛 用户访问的是真是的服务器地址 不能负载均衡
牵引:使用路由策略 策略路由等流量控制方式把流量牵引至waf设备然后回注 一对一 不能负载均衡可以ha 可以路由切换
监听:使用次数很少 不会对危险操作做出防御行为 用于测试 waf上线测试
反向代理、单臂:dns引流 把网站解析到waf设备 waf代理服务器进行交互 可以负载均衡
反向代理 也就是waf代替web服务器 接收流量 经过检查后 再把目标地址转变为目标服务器 进行转发 理解为dnat 可以ha可以dns切换
协议正规化防护:
主要是防护针对 请求头(cookie防护) 请求行
利用方式:
1.使用畸形请求 占用缓冲区 将缓冲区占满后 恶意代码最后入栈 会溢出到其它程序 其他程序正在执行恶意代码挤入运行的程序后 会导致恶意代码被执行
2.进行dos消耗服务器处理性能
3.恶意请求类型:delete put option方法禁止使用
4.恶意url:一般web漏洞使用get方法利用漏洞时请求头部较长 限制长度可以防止大部分简单攻击
5.元字符攻击:通过元字符逃逸请求检测 最好是禁止使用元字符
5.编码攻击:编码问题是比较常见的 近期著名的cve2024phpcgi漏洞就是利用了主机编码与网页编码不一致导致的
6.针对cookie的攻击:限制cookie长度 限制cookie数量 也需要针对cookie防护 有时cookie可以进行sql注入
7.针对请求头的攻击:请求头中存在大量字段 常见字段ua是区别用户与程序访问的重要方式 字段重复 字段长度 这些都会影响服务器的解析 可以采取对字段限制长度 限制个数 来防止攻击
waf的防护手段 主要有两大类型 分别是基于语义分析 基于正则匹配
基于语义分析的waf 有国产著名的雷池 基于正则有著名的引擎aws owasp 这些
web漏洞防护:
著名的有:
- sql注入:服务端不对用户的输入进行检测 并且是直接进行拼接 没有预编译参数化处理 导致sql语句直接拼接到原有的查询语句后 用户能够任意执行sql语句
- 防御方法:禁止转义字符 实体化编码 进行过滤 预编译处理参数化输入
- xss:跨站脚本执行 浏览器解析非法用户传入的前端代码 直接执行js脚本 获取cookie或者直接配合csrf进行操作
- 防御方法:过滤字符 实体化编码 引入csp禁止加载不信任的脚本
- csrf:跨站请求攻击 通过利用其它用户的身份 进行不合法的操作 常与xss结合
- 防御方法:操作进行验证 操作嵌入token 验证refer
- 命令行注入:用户请求直接由操作系统解析 并处理返回 导致用户任意执行计算机命令
- 防御方法:对操作命令进行过滤 只允许执行特定操作 设定acl 对web服务权限进行限制 加入虚拟系统 减少主机暴露
这些漏洞 waf防控的方法大部分为正则过滤
扫描防护:
在渗透初期 常常需要对目标的应用进行扫描 或者有时会使用爬虫
此时就需要对用户的访问频率进行限制
文件上传:
在web站点中 常常会有恶意用户上传脚本或者上传代码 让服务器触发运行 此时就要对文件内容进行检测 或者对文件直接进行重命名操作 注意保护htaccess user.ini文件 防止修改可解析文件类型或者直接包含
信息泄露:
有时请求的返回数据会泄露部分信息 通过waf对某些信息可以屏蔽隐藏
如 请求头 服务路径 敏感文件 关键文件 项目源码 等
反向代理waf部署:
代理模式一般用于需要ssl证书进行认证的情况下
分为
普通模式:进行http服务代理
单向卸载:服务器运行http服务 客户端请求waf时使用https 需要导入服务器的私钥和公钥(证书)
双向加载:服务器运行https waf与客户端交互使用https的方式 需要在waf设备中导入证书和私钥
透明代理:
waf三层方式运行 配置vlanif接口 访问时 将代理地址写入内容与真实服务地址一样 使用卸载方式 开启透明代理禁止nat
单向卸载:
二层组网:配置代理地址 配置vlanif接口 代理地址设为漂浮地址服务器地址为真实服务器地址 注意使用nat 转换原地址为vlanif接口地址
三层组网:直接使用漂浮地址 对外访问不用nat 除非单臂组网