基于时间的 SQL注入研究
SQL注入攻击是业界一种非常流行的攻击方式,是由rfp在1998年《Phrack》杂志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的。时过境迁,相关SQL注入的技术和工具都进行了不断的发展和演化。目前 SQL注入漏洞已经是信息安全的一大领域,无论是小到个人网站,还是大到电子商务网站,都或多或少的存在SQL注入漏洞。为什么SQL注入漏洞会屡禁不止,原因就在于要想防御SQL注入漏洞,需要对SQL语句、业务流程行为、各种主流数据库相关机制都有较为深入的认识和理解,才能真正做好SQL注入的攻击和防范。
SQL注入和盲注
对于SQL注入的定义和一般的判断方法,无非就是著名的三段式。普通SQL注入是通过构造SQL语句,将敏感信息直接暴露在网页上,有两种方式,一种是通过报错方式,一种是通过union select联合查询方式。普通的SQL注入并不是完美的,一旦开发人员将错误页面进行处理,将unionselect关键字进行过滤,注入将不再有效。其实这种修复方式存在较大的问题。如果是在不采取其他措施的情况下,仅仅更换成统一的错误页面是不能避免SQL注入的,这将会产生一种更高级的SQL注入方式盲注。盲注是通过构造SQL判断语句,通过返回页面的不同将信息判断出来。返回页面有三种:有结果页面、0结果页面和错误过滤页面。只要有其中的两个页面,无论哪两个页面都可以,就可以判断存在注入漏洞。当然,这中间还有一个前提,就是这些不同的页面是由输入到URL中的SQL语句执行的不同造成的。但是普通的盲注也不是绝对有效的,一旦没有两个以上的差异页面,或者不能通过页面的不同来来判断 URL中SQL语句的有效性,此时就要使用基于时间的SQL盲注。基于时间的SQL盲注的特点和使用假设有这么一个文件,无论怎么注入,页面内容都一样,但此文件确实存在注入点。最关键的是通过普通盲注不能得到差异页面,没有差异也就没法进行盲注。为什么没有差异,有这么几种情况:
第一种情况:无论输入什么都只显示无信息页面,例如登陆页面。这种情况下可能只有登录失败页面,错误页面被屏蔽了,并且在没有密码的情况下,登录成功的页面一般情况下也不知道。在这种情况下,有可能基于时间的SQL注入会有效。
第二种情况:无论输入什么都只显示正常信息页面。例如,采集登录用户信息的模块页面。采集用户的 IP、浏览器类型、refer字段、session字段,无论用户输入什么,都显示正常页面。
第三种情况:差异页面不是由输入URL中的SQL语句来决定的。这种情况下,也只能使用基于时间的盲注。
总之,情况有很多种,只要无法通过差异页面来进行一般SQL盲注,基于时间的SQL盲注就都有存在的可能。
Oracle数据库盲注
Oracle中基于时间的盲注主要是使用了DBMS_PIPE.RECEIVE_MESSAGE()函数和CASEWHEN„THEN„语句。下面是一个示例:
5593=(CASE
WHEN
(ASCII(SUBSTRC((SELECT
NVL(CAST([ColumnName]
AS
VARCHAR(4000)),CHR(32)) FROM (SELECT [ColumnName],ROWNUM AS LIMIT FROM (SELECT
DISTINCT([ColumnName]) FROM [TableName])) WHERE LIMIT=[StringIndex]),[CharIndex],1))
[GuessChar])
THENDBMS_PIPE.RECEIVE_MESSAGE(CHR(90)||CHR(80)||CHR(71)||CHR(74),5)
ELSE 5593 END)
将[TableName]中的[ColumnName]字段下的所有数据选出,逐一选择每条数据,并且逐一选择每条数据中的每个字符,判断该字符的 ASCII码值是不是大于[GuessChar],如果大于,将等待 5秒,如果不大于将返回 5593,当为 5593时,整个判断条件为真。上面的语句是用来获取指定表指定列中的数据。我们还可以通过使用 user_tab_columns、all_tab_columns、
all_tables和user_tables等表或视图来获取想要的表名和列名。如果是过滤了“”、“”,可以使用 like来进行等价变化.MSSQL数据库盲注
1)普通注入方法
MSSQL中基于时间的盲注主要使用了waitfor delay和if语句。下面是一个示例:
;if(ascii(substring((SELECT top 1 name FROM [DatabaseName]..sysobjects where xtype=Uand name not in(SELECTtop [StringIndex] name FROM [DatabaseName]..sysobjects wherextype=U)),[CharIndex],1))%3E[GuessChar]) waitfor delay 0:0:4--选出[DatabaseName]数据库 sysobjects表中 name字段下的所有数据,并且逐一选择条目,每个条目中的字符逐一进行 ASCII码值的判断,如果大于[GuessChar]中指定的码值,将延迟 4秒钟响应。
2)高级注入方法
除了直接使用延迟函数的方法,MSSQL中还有另外一种方法,简单说就是MSSQL数据库中where子句的执行顺序问题。因为MSSQL数据库使用了CBR技术进行优化,因此where后的子句不一定按照子句的书写顺序来执行,是按照各个子句的复杂度来进行,数据库将先执行复杂度较小的子句,如果各个子句使用and来进行连接,那么较小子句的返回结果为false,导致整体的返回结果为 false,其它高复杂度的语句的结果将无关紧要,导致其它高复杂度的语句免于执行,又因为高复杂的子句消耗时间和系统资源较大,从而缩短系统执行时间。如果 where后面的各个子句不是并列关系,而是依赖关系或递进关系的话,则必须进行特殊处理,如 case when或子查询。
总之,复杂度较小的子句的返回结果的真假,将决定复杂度较大的子句是否执行,也就决定了整个 SQL语句执行下来的返回时间的长短。通过这样一个时间差,即可判断之前复杂度较小的子句是否执行成功。
3)使用示例
如果判断网站是否存在基于时间的盲注,那么可以使用下面的语句:
http://xxx/index.asp?id=1 and (SELECTcount(*) FROM syscolumns AS sys1,syscolumns assys2,syscolumns AS sys3,syscolumns AS sys4,syscolumns AS sys5,syscolumns AS sys6)0 and 1=1
其中(SELECT count(*) FROM syscolumns AS sys1, syscolumns as sys2,syscolumns AS
sys3,syscolumns AS sys4,syscolumns AS sys5,syscolumns AS sys6)0是复杂度较大的子句,1=1
是复杂度较小的语句。1=1返回为真,那么前面复杂度较大的子句将免于执行。整个查询结果将立即返回。如果为 1=2,那数据库将执行复杂度较大的子句,整个查询结果将会有很大的延迟。例如下面的语句可以用来判断当前用户权限是否够用。
http://xxx/index.asp?id=1 and (SELECT count(*) FROM syscolumns AS sys1, syscolumns assys2,syscolumns AS sys3,syscolumns AS sys4,syscolumns AS sys5,syscolumns AS sys6)0 and1=(SELECT IS_MEMBER(sysadmin))
MySQL数据库盲注
MySQL数据库基于时间的盲注在使用延迟函数上可以有两个选择,一个是BENCHMARK(count,expr)函数,一个是 sleep(time)函数。前者通过将 expr语句执行 count次来达到延迟的目的,后者是直接延迟 time时间。例如 benchmark函数的使用,可以写成:
id=1 union select 1,benchmark(1000000,md5(test)),1 from use where userid=1 and
ord(substring(username,1,1))=97 /*
也可以写成:
id=1
union
select
if(substring(password,1,1)=A,benchmark(10000000,sha(1)),0)
username,password from cms_users where username = admin/*
使用 sleep函数的示例如下:
8468=IF((ORD(MID((SELECT%20IFNULL(CAST([ColumnName]%20AS%20CHAR),0x20)%20FRO
M%20[DatabaseName].[TableName]%20LIMIT%20[StringIndex],1),[CharIndex],1))%20%3E%20[G
uessChar]),SLEEP([DelayTime]),8468)
其中,为了对付部分 waf防火墙,可以去掉 if关键字,也可以去掉“”、“”等符号,使用 like或 in来进行代替。
防御方法
对付基于时间的 SQL盲注和对付其它类型盲注的方法是一样的,无非是做好三个方面的工作:输入数据的过滤、输出数据的处理、SQL语句访问权限的设置。
返回信息是否进行过滤:仅仅控制返回信息不能完全避免注入漏洞的存在,仅仅是让利用难度大增,可能会相继存在明注、盲注、基于时间的盲注。即使将错误页面重定向,也不一定不能明注,比如说利用 union select走正规输入页面来输出。做好返回信息的过滤只是必要条件而不是充分条件。
连接权限是否为 sa:如果连接权限设置非常严密,那么利用系统表的注入就很难成功,只能通过暴力猜表名猜数据的方式,运气成分很大,但是如果有更新当前数据表的权限,就可以向普通业务表中插入或删除数据。输入数据是否进行过滤:输入数据过滤这部分说起来比较复杂,需要结合 waf、中间件、应用程序三者配合进行过滤,如果过滤严密,SQL注入将非常困难。但在某些特殊业务和某些特殊环境下,不可能将所有的关键字和符号都过滤掉,如果过滤掉,可能会导致业务不可用。
总结
无论对于普通SQL盲注,还是基于时间的SQL盲注,最重要的特点是不同点,只要有不同就能注入。这就是所谓的行不行。数据库的连接用户最好是管理员账号,否则就只能使用暴力破解。这就是所谓的难不难的问题。当然,这些都是在关键字和符号过滤不严的情况下进行的。上面提到的注入方法,也只能几个简单的例子。如果对数据库有足够的了解,可以任意发挥想象去构造 SQL语句来完成特定的功能。
基于时间的 SQL注入研究的更多相关文章
- 2019-9-9:渗透测试,基础学习,phpmyadmin getshell方法,基于时间的盲注,基于报错的注入,笔记
phpmyadmin getshell方法1,查看是否有导入导出设置 show global variables like '%secure-file-priv%';2,如果secure-file-p ...
- 详解基于MSSQL “order by”语句报错的SQL注入技术
SQL注入,又名黑客技术之母,是一种臭名昭著的安全漏洞,由于流毒甚广,已经给网络世界造成了巨大的破坏.当然,对于该漏洞的利用技术,也是花样繁多,如访问存储在数据库中的数据,使用MySQL的load和i ...
- 大哥带我们的mysql注入 基于时间的盲注
?id= and ,,sleep()) ?id= and ,,sleep()) if语句/if()函数 在基于时间型SQL盲注中,我们经常使用条件语句来判断我们的操作是否正确: ?id= and = ...
- 关于SQL注入,你应该知道的那些事
戴上你的黑帽,现在我们来学习一些关于SQL注入真正有趣的东西.请记住,你们都好好地用这些将要看到的东西,好吗? SQL注入攻击因如下几点而是一种特别有趣的冒险: 1.因为能自动规范输入的框架出现,写出 ...
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- SQL注入的分类
基于从服务器接收到的响应 基于错误的SQL注入 联合查询的类型 堆查询注射 SQL盲注 基于布尔SQL盲注 基于时间的SQL盲注 基于 ...
- SQL注入小结
分类学习有利于条理化知识,大致的SQL注入分为三种: 1.BealeanBase 2.TimeBase 3.ErrorBase 1.从最简单的说起,基于布尔类型是最常见的SQL注入方式 select ...
- sql注入分类
Sql注入根据数据提取通道的类型,从服务器接收到的响应等可以分为不同的类型. 基于从服务器接收到的响应 ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基 ...
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
随机推荐
- [POI2007]ODW-Weights(贪心)
在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数 ...
- poj 1611 The Suspects(并查集输出集合个数)
Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, wa ...
- Building Microservices with Spring Boot and Apache Thrift. Part 1 with servlet
https://dzone.com/articles/building-microservices-spring In the modern world of microservices it's i ...
- [luogu3834][可持久化线段树 1(主席树)]
题目链接 思路 裸的主席树.查询的时候,通过相减求出区间内左子树中数的个数a.然后判断要查找的k是否比这个z要大.如果比这个值大,那么就去右子树中查找第k - z大,否则去左子树中查找第k大. 代码 ...
- Java基本类型占用字节数(或 bit数)
背景:面试时候问到int类型占用几个字节,以及表示的大小,居然一脸懵逼,任何细节都不能放过. Java基本类型占用字节数(或 bit数) java是跨平台的语言,所以不论在什么系统中这些东西在内存中所 ...
- 关于Java中扫描仪next()与nextLine()的区别
首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后 ...
- 第十三节,卷积神经网络之经典网络LeNet-5、AlexNet、VGG-16、ResNet(三)(后面附有一些网络英文翻译文章链接)
一 实例探索 上一节我们介绍了卷积神经网络的基本构建,比如卷积层.池化层以及全连接层这些组件.事实上,过去几年计算机视觉研究中的大量研究都集中在如何把这些基本构件组合起来,形成有效的卷积神经网络.最直 ...
- 使用海康的某款摄像头以及v4l2的经验
Video Capture模式下发现使用MJPEG流和YUYV流相同分辨率视野却不同. 最后没找到怎么设物理窗口或图片窗口的方法,做实验知道了为什么. 设为1280×720 YUYV实际物理窗口是19 ...
- 做错的题目——给Array附加属性
- (数学) PTA 1005 继续(3n+1)猜想 (25 分)
1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...