第一次接触sql,也是第一次接触web,在学长的指导下借助sqllabs靶场来对sql注入进行学习。不知不觉二十多天过去了,学长给的靶场任务也完成了。现在写一些东西来记录一下。
首先要了解什么是sql注入,sql注入就是通过将恶意的sql语句插入原本的查询语句中。之后通过服务器对恶意sql语句的查询来实现爆库
接下来我们一起来看一个简单sql语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1
很明显可以看出,这句sql语句显而易见是指从user表中进行查询,通过第一张表的第一列与输入进去的id进行校验。
这时如果我们向url里面添加
?id=1'#
这是什么意思呢,很简单。1代表永真, ' 这个单引号是为了和原本sql语句中id前面的单引号形成闭合。#这个井字符是什么意思,相信有一部分人已经猜到了,这个符号是起一个注释的作用。将后面的东西全都注释掉,以便为了让自己的payload可以顺利的拼接进入sql语句。
我们通常先用?id=1 and 1=1 和?id=1 and 1=2,来判断是否为数字型闭合。若输入这两个语句的界面不同。则说明这是数字型闭合,反之则说明是字符型闭合。
若是数字型闭合我们就可以直接使用?id=1 xxxxxxxx#来实现sql注入了,若是字符型闭合我们则需要进一步判断闭合点,一般情况下有 ' " ') ") 这四种情况。逐一验证即可。我们这里以
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1
这个开头的简单sql语句为例。我们输入的 ' 单引号会与sql语句中的id前面的那个单引号形成闭合,而原有的sql语句后面的单引号被 “冷落” 了,因此就会出现报错。这个时候我们在输入的payload后面加上注释符将后面的 ' 单引号注释掉即可另外的三种情况与此相同,类比即可。
前面我们已经讲解了如何寻找闭合点,接下来我们来说一说如何拼接自己payload来实现目的。这里我们还是以
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1
这个简单的sql语句为例。我们输入的 ' 单引号与前面的单引号形成了闭合,注释符又将后面的sql语句给注释掉了,所以单引号与注释符之间就形成了一个”真空区域“,在这个区域里面我们可以拼接我们想要拼接的任意语句
至此我们讲完了payload的大致组成,接下来我们来讲讲一些常见的注入类型以及对应的具体语句
首先向我们要将的是联合查询
使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目
看完了联合查询到介绍接下来我们讲讲处理联合查询的步骤,首先我们应该先判断列数
?id=1' union select order by 3#
不断地更改数字来进行判断,假设order by 3回显正常,order by 4回显错误则说明列数应为3列,接下来我们应该判断回显位
?id=1' union select 1,2,3#
我在sqllbs靶场中遇到的情况绝大多数都是回显一个2一个3,这说明什么呢,这说明在2和3那里是可以正常回显的,即当我们在2和3处使用的查询语句是可以把结果正常展现出来的。接下来我们就可以开始愉快的爆库爆数据了
?id=1' union select 1,database(),version()#
这里的database()和version()分别对应数据库名和版本
数据库名知道了,我们接下来就可以进行爆表了
?id=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
这里的group_concat起到一个拼接数据的作用,即将数据拼接为一行,一次全部爆出来,值得注意的是当数据过多,超过一行的时候,我们就不能这么做了。我们就需要使用limit函数一个一个的进行查询了
limit函数的形式一般为
(select column_name from information_schema.columns where table_name='table_name' limit 0,1)
limit后面的两个数字分别查询的起始位置,查询的数量。查询位置以0为起点开始,查询数量以1为最小查询量
接下来我们查询列名
?id=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
最后我们进行报数据
?id=1' union select group_concat(username),group_concat(password)from users#
至此我们的联合注入就结束了
由于笔者刚学一二十天,所以文章有很多不足之处,望见谅。
标签:语句,sqlilabs,单引号,查询,我们,sql,靶场,心得,id From: https://www.cnblogs.com/XYY-J/p/16893461.html