0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

一、前言
对于真实的渗透测试环境来说,遇到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()*/;
三、绕过安全狗
安全级别: 高级
测试关卡: Less-11
防御效果检测: 成功拦截
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语句
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
测试结果:
3、空格替换绕过
1)绕过原理
基本原理:数据库空格可使用其它字符替代,比如多行注释和空白符
因为注释符#、-- 都是把后面的语句全部注释掉了,而多行注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass。
常用的注释多行注释符:
/**/ : 会被拦截
/*--*/ :会被拦截
/*//*/:不会被拦截
常见的空白符:%09,%0a,%0c,%0d,%a0
绕过技巧: 在各个空格处使用多种符号进行替换
2)实战测试
payload:
uname=1'+and/*//*/updatexml(1,concat((@@version),0x7e),2)/**/--+&passwd=admion123&submit=Submit
测试效果:
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
导入插件:
配置分块参数: 右键—>Extentions—>chunked-coding-converter 0.4.0 —>chunked-coding-converter —>config
在发送数据包前进行编码: 右键—>Extentions—>chunked-coding-converter 0.4.0 —>chunked-coding-converter—> Encodeing Request body
3) 实战测试
未启用插件的情况下,成功被拦截:
启用插件的情况下,成功绕过:
小结:WAF是绕过了,但是没回显内容了,我傻眼,菜鸟学会了但是感觉又没学会,老脚本小子了,唉。
四、绕过云锁
防护情况: 全部开启
防护效果:
1、超大数据包绕过
1)绕过原理
WAF检测资源长度限制
假如HTTP请求POST BODY太大,检测所有内容,WAF集群消耗太多的CPU、内存资源。因此许多WAF只检测前面的2M或4M的内容。
对于攻击者而言,只需要在POST BODY前面添加许多无用的数据,把攻击的payload放在最后即可绕过WAF检测。
2)实战测试
基本方法: 在POST模式下,添加脏数据,让Content-Length头长度大于7300,正常参数在脏数据后面,否则无效。
测试效果:
添加了未知参数,使数据包长度大于7300后,成功造成注入:
2、畸形boundary绕过
1)绕过原理:
基本原理: HTTP协议兼容性,HTTP Body的多样性,以及WAF对boundary识别的局限性
PHP在解析multipart data的时候有自己的特性,对于boundary的识别,只取了逗号前面的内容,例如我们设置的boundary为——aaaa,123456,php解析的时候只识别了——aaaa,后面的内容均没有识别。然而WAF在做解析的时候,有可能获取的是整个字符串,此时可能就会出现绕过。
2)实战测试
先来一个正常的注入包,可见成功被拦截:
修改传输数据编码:右键—>cahnge body encoding
修改boundary的值:
可见修改了boundary的值后,成功绕过。
五、参考资料
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)