首页 > 其他分享 >使用阿里 Druid 实现应用级waf

使用阿里 Druid 实现应用级waf

时间:2024-06-01 21:44:17浏览次数:29  
标签:checksql String waf Druid re 阿里 sql return check

Druid内置了语义级的waf,为何我们要把waf能力集成到应用中呢?

1)流量waf还是存在各种解析差异导致的bypass,类似于该 例子

2)k8s的逐渐流行,在应用中实现waf能力能减少架构层设计负担

缺点:

1)需要应用安全工程师不间断配合

2)对代码质量较好的开发团队会显得多此一举

 

本次使用springboot2、mysql5.7、Druid12.23

先看看输入接口

@RequestMapping("list2")
public User getList2(String name) {
    if (name == null) {
        name = "dato";
    }
    String x = CheckSqlInjection(name);
    if (x != null) {
        User u = new User();
        u.setName(x);
        return u;
    }
    //@Select("select * from user where name='${name}'")
    return userMapper.getUserByName3(name);
}

其中 CheckSqlInjection 内容就是调用Druid进行语义分析的逻辑

public static String CheckSqlInjection(String sql) {
       if (sql == null || sql.length() < 6) {
           return null;
       }
       //首先开展基础的sql正则表达式检查
       //正则表达式检查
       //.......正则检查开始..........
       //正则表达式检查结束

       //启动druid检查
       WallConfig config = new WallConfig("/");
       MySqlWallProvider newSqlWallProvider = new MySqlWallProvider(config);
       //入参类型包含无符号、单引号、双引号
       //也隐藏包含了 SELECT `id`,`uid` from x WHERE `id` LIKE '%2%' 这种like注入
       List < String > quotes = Arrays.asList("", "'", "\"");
       String checksql;
       String re;
       for (String quote: quotes) {
           checksql = "select id from x where id = " + quote + sql + quote;
           WallCheckResult check_quote = newSqlWallProvider.check(checksql);
           re = Violation_Message(checksql, check_quote);
           if (re != null) {
               return re;
           }
       }

       //order by注入的情况下进行校验,order by情况下无单引号或双引号
       //似乎和上面的无符号情况一致,可以省略?
       /*
       checksql = "select id,uid from x order by " + sql;
       WallCheckResult check_order_by = newSqlWallProvider.check(checksql);
       re = Violation_Message(checksql, check_order_by);
       if (re != null) {
           return re;
       }
       */

       //sql的in语句也可以形成sql注入,也需要小心
       checksql = "Select id,uid,pid from x where id in (" + sql + ")";
       WallCheckResult check_in = newSqlWallProvider.check(checksql);
       re = Violation_Message(checksql, check_in);
       if (re != null) {
           return re;
       }
       return null;
   }

   private static String Violation_Message(String Sql, WallCheckResult check) {
       List < Violation > violations = check.getViolations();
       if (!violations.isEmpty()) {
           int firstViolation = violations.get(0).getErrorCode();
           //1001是sql语法不正确、未知错误为9999,它俩应忽略掉,因为正常的用户输入都不可能是sql注入
           //错误码在druid/wall/violation/ErrorCode.java之中
           if (firstViolation != 1001 && firstViolation != 9999) {
               //System.out.println("sqlAtt&ck: " + violations.get(0).getMessage() + " : " + Sql + "\n---------");
               return violations.get(0).getMessage();
           }
       }
       return null;
   }

通过sqlmap不断的测试发现Druid存在bug,无法解析RLIKE注入已经提交给官方,issues地址

所以也将sqlmap中涉及到root用户注入的敏感库和函数都放到了黑名单之中

 

总结:

1)这个库很成熟了,除了RLIKE这个bug,已经可以完全在输入时就完成语义sql注入校验

2)整体没有什么难度,可以很快就复现传达给同事

 

标签:checksql,String,waf,Druid,re,阿里,sql,return,check
From: https://www.cnblogs.com/k4n5ha0/p/18226456

相关文章

  • 阿里云创建k8s集群实例
    阿里云创建k8s集群实例创建两个8G内存的抢占实例(青岛),能ssh默认关闭防火墙,且没有交换分区配置k8s仓库桥接#重置containerd配置环境重置初始Kubernetes(k8s)集群环境通常涉及一系列步骤,以确保集群被正确地清理并准备好重新部署。以下是基于参考文章提供的信息,整理出......
  • wafw00f一键检测目标防火墙信息(KALI工具系列十五)
    目录1、KALILINUX简介2、wafw00f工具简介 3、在KALI中使用lbd3.1查看可检测的防火墙对象3.2目标防火墙种类检测3.3 目标防火墙详细信息检测3.4将检查结果输出4、总结1、KALILINUX简介KaliLinux是一个功能强大、多才多艺的Linux发行版,广泛用于网络安全......
  • 雷池waf功能代码剖析
      看到他们发文章​-动态防护功能?了解一下具体是什么功能 就是处理了一下html和js  看一下雷池代码的构成是后台的代码Go语言使用Gin框架启动一个API服务器 ......
  • 一站式链路追踪:阿里云的端到端解决方案
    作者:涯海炎炎夏日,当你打开外卖APP购买奶茶却发现下单失败;五一佳节,当你自驾游途中发现导航响应缓慢,频繁错过路口;深更半夜,当你辅导孩子功课,却发现GPT应用迟迟无法应答。不知你有没有想过,这些程序运行的背后到底是怎样的世界,每一次点击,每一次交互,又到底发生了什么?如果你是一名......
  • 半导体Wafer Map-“Ink-Less Format“概述
    在半导体行业中,"Ink-LessFormat"(无墨格式)通常指的是一种不依赖于传统标记或墨水系统来标识晶圆片(Wafer)上芯片(Die)的测试和分类方法。这种方法可能涉及到使用激光标记、电子标记或其他非墨水的标识技术。在设计WaferMap软件时,实现Ink-LessFormat的业务需要考虑以下几个关键方......
  • 一次绕过waf进行xss的经历
    今天室友遇到一个好玩的网站,下面是一些尝试绕过Waf进行XSS的记录。首先该网站没有对左右尖号和单双引号做任何过滤或转义。且有未知的waf或者其他阻止恶意访问的手段。 首先我的访问为login.asp?f=1时候,页面关键源码为可能是表示登录次数的一个东西?(猜测)现在我们知道的......
  • 阿里云日志搜索
    阿里云日志搜索(SLS日志搜索)查找多个关键词,使用and逻辑:content:"关键词1"andcontent:"关键词2"使用or逻辑:content:"关键词1"orcontent:"关键词2"模糊查询:在关键词后面使用星号,可以模糊查询。如果关键词后面带有一些中文符号,也可以用星号代替。"关键词*"......
  • ESP8266 连接阿里云物联网平台
    项目代码1#include<ESP8266WiFi.h>2#include<PubSubClient.h>3#include"DHT.h"456/*配置WIFI7*/8#defineWIFI_SSID"*****"//WIFI名称9#defineWIFI_PASSWD"*****"//WIFI密码10......
  • Navicat远程连接阿里云mysql失败,提示2013,2003错误解决方案
    前情提要总结下使用过的各种解决方式,如修改cnf,修改安全组端口,修改防火墙,总有一款方案适合你(如果使用其他方式解决请评论补充,感谢)环境:本文全部使用yum方式安装服务,使用阿里云服务器centos7下文需要格外注意手动配置端口的部分确认已安装好mysql服务(yum安装)......
  • 阿里面试:全国14亿人,统计出重名最多的前100个姓名
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......