一、WAF及绕过WAF原理介绍
WAF的定义:
waf,即web应用防火墙,是通过执行一系列针对http/https的安全策略来专门位web应用提供保护的一款产品。
waf主要是通过内置的很多安全规则来进行放域,会对每个请求的内容根据安全规则进行检测并对不符合安全规则的做出响应的防御处理,从未保证web应用的安全性和合法性。
WAF是如何工作的?
规则库:使用一组规则来区分正常的请求和恶意的请求。
自学习:有些WAF会使用学习模式通过了解用户行为自动添加规则。
WAF的分类:
硬件waf,软件waf,云waf,网站内置waf类。
WAF绕过的原理:
1、一个何个的waf必须做好业务和安全的平衡,这个平衡不好就有可能被绕过或者是影响网站的业务。
2、waf为了考虑通用性的问题,无法100%覆盖某些语言、中间件、数据库的特性;
3、硬件waf自身存在漏洞;
WAF绕过的几个维度:
1、架构层面
2、协议、中间件、系统/数据库/编程语言
3、规则层面
二、手工及攻击识别WAF
1、手工识别的方式通常是通过访问不存在的页面或带入恶意的字符,触发WAF的防护规则;
2、查看服务端拦截后返回的信息,也可以通过网页的头部(header)信息进行判断;
方法:
1、构造恶意请求字符分析网站响应或敏感页面
2、发起http请求包,分析响应数据;
3、通过访问不存在的页面来分析页面提示
识别是什么waf
python3 sqlmap.py -u "http://www.chaitin.com"
三、绕过WAF的常见方式
1、pipline绕过。
pipline绕过是利用了http的管道化技术,当发起http请求,目标返回该请求的响应。WAF也同样如此,我们使用管道化连接可以在发起请求的同时发送多个HTTP的请求 ,一旦WAF仅判断第一个请求那么就可以成功绕过WAF。
pipline绕过首先要进行两点设置:
(1)burpsuite中去掉“update content-length”。
(2)将http请求包的连接状态改为持节连接的状态,即Connection:keep-alive
(3)进行完前两点设置后,开始下一步操作,将请求包复制到uid=1后面的位置,中间不需要空格。测试过程中服务端验证只需要带----cookie即可,也就是第一个请求报带即可。发送修改后的双请求,返回响应也是两次,大多数waf只检测第一个请求,忽略第二个请求,从而绕过WAF的检测。
2、宽字节注入
款自己注入主要是源于程序员设置数据库编码与php编码设置为不同的两个编码,这样就可能会产生宽字节注入。程序员设置mysql连接时错误配置为:set character_set_client=gbk
php代码:mysql_query("SET NAMES 'gbk' ");如果数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入。
(1)正常情况下当GPV开启或使用用addslashes函数过滤get或post提交的参数时,黑客使用的单引号‘就会被转义为:\’
(2)但如果存在款自己注入,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27,之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后mysql服务器会对查询语句进行GBK编码,从而导致了注入漏洞。
3、HTTP协议覆盖绕过
WAF在对content-type进行检查时,对multipart/from-data类型的检测比较少,或者把它当作文件上传进行检查,我们可以利用这一特性对WAF进行绕过。
方法:
通过狗仔multipart/from-data类型的方式绕过检测。构造内容实例:8765255278935,最后一--分隔符--结尾,表示请求体结束。
4、分块传输绕过
介绍:
分块传输编码是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由内网服务器发送给客户端应用(通常是网页浏览器)的数据可以分成多个部分。分块传输编码旨在HTTP协议1.1版本(HTTP/1.1)中提供。
原理:
(1)利用了HTTP分块传输编码的特性,将传输查询语句分块,从而绕过WAF的检查。
(2)首先,根据分块传输的格式,分块传输需要在请求头添加“Transfer-Encoding”,其值设为“chunked”,表示将用chunked编码传输内容。设置成功后就可以进行多个分块数据的传输,消息体由数量未定的块组成,并以最后一个大小为0的块为结束,最后用长度为的块表示终止块。
(3)最重要的是配置分块的数据,长度值必须为16进制,长度值为一行,数据值为一行。
代码审计-SQL注入
RuoYi4.2版本代码审计