我们得到目标网站的一般信息和技术分析信息之后,我们接下来,就开始寻找注入点和测试注入点

1.常用注入点在哪里?

1.常用注入点

我们一般在三个地方,寻找注入点

A.表单中的输入域

B.URL的参数

除非特别说明,否则其它的默认我们叫URL的参数中进行发挥

也是url中最重要,发挥的最好的一部分

C.Cookie或者隐藏域

因此对表单中的输入域、Cookie或者隐藏域,需要对网页的输入输出机制有充分的分析和了解

2.如何发现注入点?

我们先来看看这些注入点,有什么特点

1.表单中的输入域,Cookie或者隐藏域

​ 需要对网页的漏洞进行分析,也就是需要我们对网页的输入输出机制进行充分的分析、过滤和提取,并了解其执行注入SQL的可能机制是什么,这需要我们不断地测试,比如一些输入域,field,cookie,url参数,它的变量名是什么,如何传递给数据库引擎

2.URL的参数

我们第三部分主要是对url参数里面进行发挥的SQL注入攻击

URL参数的一个特点,我们来实际的操作,了解一下

我们打开目标的网站

在这里插入图片描述

我们把这url加载下来

在这里插入图片描述

我们看到url是这样的,page=1,是第一页,一共有两页

但下面有分类信息,我们把这个参数进行分开一下,点击Split URL

在这里插入图片描述

我们发现这些传入的都是数字,因此,我们初步猜测,这些注入点,应该是整数的注入点,我们注意位置的问题,在100的后面,我们输and 1=2,这个是空集,我们执行一下,看跟前边学习的空集逻辑显示的是否一样,因为他的位置不同,显示的结果是没有变化的

在这里插入图片描述

我们发现仍然是两页,那么这个到底是不是注入点,这是另外一个问题,那么结果我们显示的是两页,而空集的结果,并没有空,所以,我们暂且不要下结论,或者,我们暂且判断没有注入点

那么放到473的位置,到这个位置,and 1=2,我们在执行一遍

在这里插入图片描述

我们发现是空集,那么就说明这个位置是个注入点,因此,我们要注意,注入点是讲究位置的,在473后面是个注入点

我们放到最后,and 1=2,我们执行一下

在这里插入图片描述

我们发现,放到最后,也是注入点,也就是说,在URL中,最少有两个注入点,473后边是个注入点,mid后面也是个注入点

那么在page=1,后面是否有注入点,我们在测试一下,& and 1=2,空集逻辑,我们在执行一下

在这里插入图片描述

我们发现这里仍然是两页,好像没有变化,这就说明注入点有两个,而这个是整型测试的

接下来,我们演示一下字符串是如何测试的

如果是字符串,当然,我们是and ‘1’=‘2’,我们看一下结果是怎么样的

在这里插入图片描述

我们发现是错的,网页显示直接是错的,并没有返回空的框架,这对我们来说没有什么意义,但是,我们可以得到一个结论,我们在这里输入字符串,显然是不正确的,这也反向证明了这里是整型注入点

那整型注入点和字符串注入点有什么区别吗

注入点一般,通过三个对比测试,一个是不变的逻辑,一个是空集逻辑,至少有两个这样的对比,如果两个对比之后,我们还可以用全集的逻辑,全集的逻辑是测试网页对数据量的处理是否变化

如果,他有变化的话,那对于这个注入点进一步的确认,整数类型,必不需要单引号

相对应的,如果是字符串的类型,那么是要用单引号的,单引号我们就要考虑是否需要闭合

字符类型参数:单引号’或双引号测试是否可以闭合

​ ’ and ‘1’='1 不变逻辑,测试网页或者程序显示正确

比如类似这种情况,前面有个单引号的目标,是为了前面变量的单引号进行闭合,后面1这个单引号,后面为什么不需要,是为了配合程序中本身的后面一个单引号,这样,可以进行一个单引号的闭合

​ ’ and ‘1’='2 空集逻辑,测试网页或者程序显示不正确或者报错

​ ’ or ‘1’='1 全集逻辑,测试网页对数据量的处理是否变化

其它和整数,并没有区别,只不过多了个单引号括起来,不变逻辑、空集逻辑、全集逻辑它们的任务都是一致的

整数类型参数:

​ and 1=1 不变逻辑,测试网页或者程序显示正确

​ and 1=2 空集逻辑,测试网页或者程序显示不正确或者报错

​ or 1=1 全集逻辑,测试网页对数据量的处理是否变化

我们看一下,验证一下全集逻辑,全集逻辑,我们使用or 1=1,然后,我们执行一下

在这里插入图片描述

我们发现,全集逻辑中,这不是两页,而是N页,甚至是对整表的查询,或者是对select条件全部结果的查询,甚至后面还有更多,这只是一个注入点的发现

我们知道常用的注入点在那里,然后我们就要去测试它,测试的基本是1=1,或者1=2,or 1=1,这是最基本的测试

3.探子回报应用–数据类型确认

一旦,我们发现注入点之后,我们就可以放个探子进去,探子一般有两个函数,一个是Version(),另一个是user()

我们在这里还进行进一步的确认,比如,我们希望获得版本的第一位,如果我们输入4,结果是怎么样的,and left(version(),1)=4

在这里插入图片描述

我们发现是空的,当版本是5的时候,and left(version(),1)=5

在这里插入图片描述

我们看到网页显示是正常的,那么就确认了这个注入点,探子的目标就确认了,这个注入点是可注入的,同时版本是5,说明了这个数据库是mysql数据库,不仅仅是得到这个信息,这个信息,说明了很多的问题,我们来看一下

数据类型确认:Version()

网页注入测试:and substring(version(),1,1)=5

返回正确说明:

1.数据库为mysql,并且它版本是5以上的版本

2.因为version是个函数,这就说明对执行数据库函数未过滤

3.又因为函数中有个括号,因此,就说明了对括号未过滤

4.又因为在mysql中,version函数,实际上可以当作查询对待,这也可能说明,对子查询未过滤

5.由此说明,可以注入复杂逻辑,复杂逻辑是等于,等于在这里是操作符,得出的结果是逻辑的结果,真还是假,实际上验证了,是否可以注入复杂逻辑的验证

6.同时可评估注入可进行的程度,因为它的探子能够执行成功,对子查询和复杂逻辑,就能够说明可以进行的程度,是相当深的,甚至,我们可以控制数据库、控制操作系统

这是一个初步的评估,那么接下来,我们就来确认这个注入点,它链接程序的用户,到底是否可以控制操作系统,是否可以控制数据库,又或者是否可以控制后台,它的可能性是怎么样的

4.探子回报应用–用户权限级别确认

我们验证一下,也就是用户权限级别的确认

首先,我们仍然是对这个注入点,判断一下,判断的目标,我们在前面的第二部分,已经讲过了,我们要得到任何信息,数据库中有两个字典库,一个是mysql字典库,一个是information_schema字典库

我们先来测试它对mysql字典库的权限,from mysql这个字典库,user表,我们进行查找,where user就等于当前的user,我们看有没有,如果有的话,那count(*)的数量肯定是1,或者是1以上,因此,这个结果肯定大于等于1,我们看一下结果,执行,

and (select count(*) from mysql.user where user=user())>=1

在这里插入图片描述

我们发现是空的,空的就说明这个返回是假,返回假,就意味着,可能对mysql.user没有权限,而这个,我们可以通过其它函数验证一下

比如说,length(user),因为对与user,它的字段肯定是大于1的,我们能够查询出结果,肯定是大于1,我们在执行一下,

and (select length(user) from mysql.user where user=user())>=1

在这里插入图片描述

我们发现也是空的,这就说明,整个表达式就是假,所以,我们的初步结论是对mysql字典中的user表,我们是没有权限的,如果没有权限,那么对于系统的交互,也就是数据库层的交互,或者操作系统层的交互,它的可能性就比较小,所以在下面的发挥,作用也不大

那我们来进行进一步的确认,下一步我们对information_schema库进行确认,我们查一下,当前数据库有多少张表,where table_schema等于当前的数据库,我们conunt(*),它应该是大于等于1的,毫无悬念,我们执行一下,

and (select count(*) from information_schema.tables where table_schema=database())>=1

在这里插入图片描述

我们发现执行成功,返回的是真,那么整个逻辑结构就是真,它是大于等于1的,同时说明了,对information_schema字典库,是有权限的,这就意味着,我们想要数据库中的任何信息,除了权限级别的信息之外,只要,我们想得到数据库中,有关数据库、表、字段等等

我们对权限级别确认进行概括

用户权限级别确认: user()

用户权限级别,我们一般是放user()函数来进行确认

网页注入测试:and (select length(user()) from mysql.user where user like ‘z%’)>1

如果网页测试,我们对mysql.user表进行测试、进行查询,如果它的长度,即使我们的目标,并不是得到它的长度,我们的目标是对mysql这个字典库,到底是否有权限,如果有权限,它的结果返回肯定是大于1,整个表达式就是真的,这才是,我们的目标

返回正确说明:

1.对mysql字典数据库有权限,否则无权限

如果对mysql字典库有权限的话,这样,我们就可以控制数据库目标与操作系统进行交互提权,否则的话

如无权限,则对密码获取受限,必须另想它法,如web网站后台,管理员密码获得的可能性有多大

因此,我们需要对下一步进行测试

2.如对mysql字典库无权限,则需要测试对information_schema字典库测试权限些信息,如果有权限,就可以获得WEB后台的管理员密码,这部分是没有悬念的,所以,我们下一步的目标是针对,WEB后台的密码获取,为一个目标点,我们只要想得到,都会得到,这是权限的一个确认

and (select count(*) from information_schema.tables where table_schema=database())>1

权限的测试,主要是对information_schema.tables,查一下,当前的数据库,有多少张表,其实,我们的目标并不是要查大于1的表数,我们的目标是,到底对information_schema库,到底有没有权限,这是我们需要得到确认的信息

返回正确则说明,对information_schema字典库有权限,可以获取所有数据库、所有表、所有字段信息。因此,对攻破web后台管理员权限是相当有帮助的

5.小结

1.常用注入点在哪里?

2.如何发现和测试注入点?

3.探子回报应用与测试

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐