我们已经完成了对注入点进行测试与发现,充分的发挥注入点,这个是SQL注入的本质,那需要发挥到什么程度,需要我们对他的特点进行分析
我们接下来,学习一下sql注入的类型,根据不同的类型,他的攻击策略是怎么样的,这是我们本篇文章,所要探讨的内容
1.SQL注入类型
按输出机制分类:
盲注:输出数据库的内容在网页中没有显示,只能进行逻辑判断,真或者假
盲注就是我们看不到,我们只能猜测
报错注入:充分利用程序、数据库报错的帮助,傻傻地告诉我们所有信息
我们在第二部分中,有说过一个自爆家底,是如何把库表,甚至用户名和密码暴露给我们的
显注:注入SQL查询语句的内容在网页中有显示。
就是我们看得见
其它:email,ftp,samba等协议
当然这是漏洞渗透的攻击,我们在sql注入里面不会涉及这种协议
接下来,我们将通过页面给大家简单的演示
2.盲注
特点是我们看不到,我们看不到结果
1.在网页中没有找到或者暂时没有找到输出的地方
2.确认输入变量可以执行逻辑判断,只得到对或者错,真或者假,两种结果
我们打开我们示例的一个网页
我们在注入点的测试和发现中,已经知道在这里是个注入点,我们在这里输入个真,and true,我们执行的结果应该是不变的
我们看到仍然是两页,没有变化,如果输入and false,我们看一下
我们看到网页中显示是不正常的,测试为空,所以这个就是我们暂时没有找到显示位的地方,所以这里我们就需要判断真或者假
只要真,这里显示的结果就是不变的,只要是假,显示的结果网页就是空的,但是这个框架还在,所以就利用这个特点,我们就可以判断到底是真还是假,来判断些内容出来
比如,我们需要对用户名的长度是多少,如果是大于10为真,那显示结果就正常,and (select length(user()))>10
那么这个结果,我们在第二部分中,如何猜测用户名已经得到一部分的接触,这是如何猜测用户,同时我们还可以猜测数据库是什么,比如database,我们先看他的长度为多少,我们看他是否大于10,and (select length(database()))>10
我们看到他肯定不是大于10的,那我们大于8看看,and (select length(database()))>=8
我们看到大于等于8是正确的,那就说明他在8、9、10之间,那我们试一下等于8,and (select length(database()))=8
这个时候,就说明他就是等于8,我们知道数据库有8个字符,那它第一位是什么呢,我们取一位,猜测一下,比如说,他等于z,我们看它是不是对的,and (select left(database(),1))=‘z’
我们看到数据库的最后一个字母叫z,我们用subtring的办法,从第二位取一位,我们取a,and (select substring(database(),2,1))=‘a’
我们会发现第二个字母是a,这样子,我们推测下去,这种就是盲注的猜测
类似于这种,我们只能执行逻辑判断,只能得到对或者错,特点就是盲目的,我们看不到,有时候,我们输入比较多的结果进行测试,才得出来
3.盲注困难,有时候需要借助工具进行盲注攻击,但花费时间也较长,需要有足够的耐心,才可以
3.报错注入
充分利用数据库报错和程序报错所提供的信息,让数据库引擎和程序,傻傻地,乖乖地把所需要的信息都暴露出来
select count(*),concat((select (select (SELECT schema_name FROM information_schema.schemata limit 0,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2)) x_col from information_schema.tables group by x_col
也就是我们前面所学到的自爆家底函数,这是个示例的方法,因为我们这边没有报错的地方,就不给大家演示报错注入的具体示例了
4.显注示例
在网页中寻找到可以把注入信息显示的位置,或者把注入者的信息替换为程序正常的信息(通常,我们叫第三者上位)
第三者上位的信息,需要我们通过union的办法显示出来
union需要在注入点union,union的结果是几个字符,一直union下去,一直得到,我们程序注入到底需要多少字段,我们去判断他,union select 1,2,3
我们看到这里是空的,显然他不是三个字段,那这就需要我们有一定的耐心,去尝试到底有多少字段,我们这里就输入,其实是我们进行足够的输入,当然,我们也会使用工具,给大家演示一下,是如何使用工具,来加快我们之间的测试,这里需要我们不断的测试,一直测试到36个,到时候我们看一下,后面我们输入–,输入两个–,是为了这个目标,把后面的注释掉,注释掉,我们看一下结果,union 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,26,27,28,29,30,31,32,33,34,35,36 –
我们看到结果已经出来了,说明上面处理的字段数,有36个字段,36个字段对于我们目标来说,目标并不是得到多少个字符,这当然对于我们来说,意义并不大
我们需要意义大的是上位者逻辑,第三者上位,就是到前面去,先给他一个空集逻辑,0=9,0=9,就等于空集逻辑,那么显示的就是我们的逻辑,
and 0=9 union 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,26,27,28,29,30,31,32,33,34,35,36 –
这个时候得到的,就是我们发现第10位就是第三者上位点,接下来,我们就要使用第十位进行充分的发挥,这就是显注所要完成的任务
因此,显注直接得到明文信息,不需要猜测,获得敏感信息非常容易和快速,通常,我们sql注入最重要的,就是找到显注的位置,这是第三者上位点
5.小结
1.SQL注入类型与特点
2.盲注
3.错注
4.显注