SQL注入ByPass的一些小技巧

01

前言

SQL注入从古至今都是一个经久不衰的影响严重的高危漏洞,但是网络安全发展到现在,如果想通过SQL注入直接获取数据或者权限,多多少少都需要绕过一些网站前面的WAF,无论是基于规则的还是带有自学习的WAF。除了实战中需要绕过WAF,在很多CTF中也需要绕过各种过滤。

所以到最后SQL注入漏洞的利用关键就成了Bypass防御,而Bypass防御方法是在持续攻防对抗中研究出来,可以说SQL注入Bypass是一门艺术。

本文不会给出也不可能给出全部的绕过技巧,只是在最近发现的一些比较有趣且实用的绕过技巧分享给大家,后续发现姿势继续更新。

02

SQL注入Bypass技巧

注入点识别

SQL注入的第一步就是失识别注入点,一般都是在参数后面简单的and 1=1和and 1=2等来判断是否有注入点或者是否有WAF拦截,如果简单的and 1=1这种被WAF拦截了,可以使用如下方法绕过:

使用这些字符进行注入点识别:

+,-,*,%,/,<<,>>,||,|,&,&&,也可以将and换成or,&&, ||等

也可以不使用and或者or,直接使用异或截断:

1^1^0,1^0^0

还可以使用{``operation}来识别注入点:

上面这些都可以绕过and1=1的拦截进行SQL注入点识别判断。当然更多的情况下是根据实际场景,灵活应用。

空白符

在SQL注入时当空格被过滤了,在MySQL中可以使用:

%09%0A %0B %0C %0D %A0 %20 /**/

注释符

在SQL注入中使用的注释符主要为:#, --+, /*xxx*/, /*!xxx*/, /*!50000xxx*/,在实际场景中可以将这些注释符嵌套应用,会有意想不到的效果,比如只需利用一个*/闭合多个/*!

(此方法目前可以绕过很多WAF哦)

特殊符号

经常在SQL注入时使用一些特殊符号即可绕过很多WAF规则,比如~, !, ``, @``, {x key}, 1.1, 1e1, (), emoji表情符号, @:=等,在实际场景中将这些符号灵活应用就可以绕过很多WAF:

Like和regexp

经常在通过盲注获取数据时需要使用MySQL自带函数,比如substring()等这些处理字符串的函数,但是如果WAF过滤了()时,这些函数就无法使用了导致无法猜测数据,这时可以使用like或者regexp获取数据:

爆库名、表名、字段名

通常情况下我们在手工注入数据库内容的时候都是使用MySQL自带的表名等,如下图:

但是在某些场景中(比如CTF)将MySQL自带的information_schema,SCHEMATA,TABLES,COLUMNS这些禁掉或者过滤了,导致无法使用上面的方法来获取数据库名和表名等内容,那么我们可以使用下面的方法:

爆库名:

原理就是当一个库中不存在的自定义函数他就会爆出当前库中没有此函数,如上图成功爆出ctf数据库名。

爆表名:

这里爆表名可以使用Polygon和linestring函数

爆字段名:

利用下面的方法一次爆出各个字段名:

原理就是在使用别名的时候,表中不能出现相同的字段名,否则就会报错,从而爆出字段名,在使用using函数依次爆出其他字段名。

过滤字段名获取数据

通常情况下获取到数据库名,表名,字段名后,就可以直接查询数据了,但是之前遇到一个场景就是过滤了字符处理函数和字段名,从而导致无法直接获取该字段的内容。场景伪代码如下图所示,通过username字段回显数据,这里我们需要获取password的内容,但是password在filter函数中被过滤了:

下面介绍两种方法在过滤字段名时获取该字段数据。

第一种方法:不适用字段获取数据

原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。

第二种方法:盲注法

我们来看一个例子:

可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。

当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:

最后将ASCII码转换成字符串就是我们想获取的字段内容。

其他技巧

因为ByPass技巧方法是需要在持续的攻防对抗中进行总结,验证,积累的,所以没有一种万能的ByPass方法,我们在遇到具体的场景中,跟进实际情况将上面的内容灵活应用,将多种方法结合,比如:

过滤逗号了可以使用join; 过滤了空格使用其他空白符; 过滤了关键字可以使用编码结合注释; 过滤常用函数可以找非常用函数代替等等。

最终还是需要结合实际情况,熟练掌握漏洞原理和数据库特性,举一反三灵活多变。

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-03-02

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

设计模式专题(二十) ——职责链模式

设计模式专题(二十)——职责链模式 (原创内容,转载请注明来源,谢谢) 一、概述 职责链模式(Chainof Responsibility),是使多个对象都有...

35590
来自专栏挖掘大数据

整合Kafka到spark-streaming实例

在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益。

2.3K90
来自专栏架构之路

Hive简介

转载自http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html Hive简介   首...

36930
来自专栏沃趣科技

MySQL的一个表最多可以有多少个字段

问题由来 引用我们客户的原话: *创建如下表,提示我:* ? *如果我将下面表中的varchar(200),修改成text(或blob):报错变为另一个:* ?...

84790
来自专栏友弟技术工作室

ElasticSearch入门实战1

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

【测试】两种数据库,四种分页算法的效率比较

分页算法本身没有什么快慢之分,对反应速度起到决定作用的是——能否有效地利用索引! 算法 评价 缺点 适用的数据库 max 效率最高的 只能有一...

30470
来自专栏Python爬虫与算法进阶

Scrapy中如何提高数据的插入速度

速度问题 最近工作中遇到这么一个问题,全站抓取时采用分布式:爬虫A与爬虫B,爬虫A给爬虫B喂饼,爬虫B由于各种原因运行的比较慢,达不到预期效果,所以必须对爬虫...

516110
来自专栏技术翻译

23个有用的Elasticsearch示例查询

为了说明Elasticsearch中的不同查询类型,我们将使用以下字段搜索书籍文档的集合:标题,作者,摘要,发布日期和评论数。

59520
来自专栏菩提树下的杨过

velocity模板引擎学习(1)

velocity与freemaker、jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVeloc...

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

分页解决方案 之 分页算法——Pager_SQL的思路和使用方法

      分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 20...

26880

扫码关注云+社区

领取腾讯云代金券