sqli-labs小试

这个是第二次写这篇博客,我没想到居然忘记保存了,泪目。。

sql注入

首先我觉得可能要先理解一下什么是sql注入
sql注入

指的是,web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序事先定义好的
查询语句的结尾添加额外的SQL语句,在管理员不知情的情况下事先非法操作,以此实现欺骗数据库服务器执行非授权的命令。

sql注入的类型
1.字符型注入2.数字型注入

这是一个写到第三关的补充

我在想为什么加入一个单引号或者‘)就可以实现注入,就可以进行操作,在思考一番过后,我发现是这样的:
就拿第一关来说吧

img

当我输入的是?id=1’的时候,看这个错误代码:

1
2
 use near ''1'' LIMIT 0,1' at line 1
SELECT * FROM users WHERE id='1'' LIMIT 0,1//这个是我在文件里面加入的提示sql执行的语句

当我输入and1=1后

可以发现他的错误提示是

1
2
 use near 'and1=1' LIMIT 0,1' at line 1
SELECT * FROM users WHERE id='1'and1=1' LIMIT 0,1

这里是来自第23关的一个更正

1所以就又重新思考了一下,加上资料查找:闭合指的是双引号成对存在,所以我们看上面的语句 当我们加入了一个引号的时候,此时的引号一共是有五个的,所以必然存在一个多余的单引号,那么我们需要去掉哪个引号才不会影响我们的语句呢?

**2.**注释符 会将后面所有内容给注释掉 ,,,所以在这个语句中’’2’and1=1’ LIMIT 0,1’,我们先解析一下, 首尾各有一个引号,切2前面和1后面各有一个引号,这个是’$id’ 在源码中出现的两个引号,而首尾的引号是后来出现的,我们在2后多加了一个单引号后,导致引号之间不配对了,所以出现错误,这个时候我们需要将1后面的单引号,limit,这样2前面的单引号就和我们的插入的但引号配对成功了
那么当然也有不注释的方法:就是让所有的引号都找到自己的另一半,也就是说我们在这里多加一个单引号就可以了
**1.**这边有几个问题需要说一下,引号内的数据要合法,要保证连贯性,他前后是可以互相拼接的比如’=1’就不行,还有就是引号的闭合好像是有就近原则,我刚才试了一下 发现 ‘1’and 1=1’’这个就不行,可能是因为 最后两个引号直接无数据导致出错了,然后两个引号之间闭合,引号的内容会变成字符串,所以这个时候我们就无法使用order by 来查询字符段数目。因为order by需要的是数字,这个时候我们直接使用 union select尝试即可。

这是来自后面的复习,如果要参考的看这个就够了
关于单引号,我们知道 我们输入1’
代入到select查询语句是这样的: SELECT * FROM users WHERE id=’1’’ LIMIT 0,1
注意到1后面多了一个’,此时 是不符合语法的,因为有个单引号落空了。所以这个时候我们就有两个方案
1.注释掉后面的单引号 这里以#作为演示:SELECT * FROM users WHERE id=’1’#’ LIMIT 0,1此时这个语句在mysql里面是这样SELECT * FROM users WHERE id=’1’#去执行的,因为后面都被注释掉了,这个时候就符合语法,后面可以加入其它语句了再举个例子,以union联合注入为例:
SELECT * FROM users WHERE id=’1’union select database()#’ LIMIT 0,1 代入到mysql是这样的:
SELECT * FROM users WHERE id=’1’union select database()#

2.闭合后面单引号SELECT * FROM users WHERE id=’1’or1=1’1’ LIMIT 0,1 这个语句也是符合语法的 代入到mysql是这样的:
SELECT * FROM users WHERE id=’1’(查询id=1) or 1=1(这是执行了一个永恒为真的或语句) ‘1’(输入了一个1) LIMIT 0,1

less1

1.根据这个题目中的get-error based-single quotes,我们就可以知道这题是单引号引起的字符型输入,所以我们直接输入?id=1。
2.接下来我们输入一个单引号’
3.可以发现,网页开始报错了内容是

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’1’’ LIMIT 0,1’ at line 1
SELECT * FROM users WHERE id=’1’’ LIMIT 0,1 在这个当中单引号被包括进去了,但是却报错了,而当我尝试其他符号的时候,发现是可以正常显示的。接着我们用and 1=1 和and1=2来测试,

这里补充一个知识点, and 1=1代表永恒为真, and 1=2 代表永恒为假 我们判断有没有注入的时候可以利用这点来判断,如果页面不一样,就代表我们的语句生效了,存在注入点!

接下来我们需要知道查询表的字段数,我们才能利用union+select查询我们所需要的信息
因为 select (),(),(), 有几个括号是要和该表的字段数所对应,
在这里我们需要引入一个order by命令
在这里 order by 的作用是用来查询字段数,当你order by (一个数字)的时候,如果有这么多字段数,那么输出结果就不会报错,如果没有,就会报错
而我们通常会将order by 结合二分法这个时候就可以很快的查询到字段数(核心是猜)

知道字段数吼,并且知道我们就可以利用注入点,添加一些命令语句,获得我们想要的信息。

然后这里需要了解一个union命令 :

两个要联合的SQL语句 字段个数必须一样,而且字段类型要一致

这个union命令可以拼接语句,使得将两个select语句联合起来使用,这个时候我们可以让前面那个select为假使用不了,这样后面的语句就可以使用了。

这个时候使用 ?id=1’ and 0 union select 1,2,3 –+ 就可以发现页面变成img

这个样子,说明字段2代表的是登录名一栏,字段3代表的是密码一栏

接下来,我们要做的就是让可以显示的这几栏我们想要的信息:img

当我们输入select 1,database (),3 –+的时候 我们就可以得知其中数据库的名字,为security

紧接着,我们就可以再利用select 查询这个库名里面的表名
接下来我们在union后面添加 select 1,group_concat(table_name),3 from information _schema.tables where table_schema =’security’ –+ 那这个时候

img就出现了这个数据库中的所有表名,

接下来我们知道了库名,知道了表名,就可以去找表中的字段名了
差找字段名的语句是这样的 select 1,group_concat(column_name),3 from information_schema.columns where table_schema=’security’ and table_name=’emails’–+
也可以直接是 select 1,group_concat(column_name),3 from information_schema.columns where table_name=’emails’–+

根据这段语句,我们就可以获得emalis这个表中的字段名

img

含有一个id 一个email_id 这个时候我们就爆一下字段名

这个时候我们使用 select 1,email_id,3 from emails –+ 就可以知道这个字段名下的数据
img

这样就大功告成了

这个时候补充一些知识:

mysql5.0版本之后 会在数据库中存放一个information_schema的数据库,在该库,我们需要记住三个表名,分别是schemata,tables,colums

在schemata表中存储该用户创建的所有数据库的库名,在该表中 记录数据库库名的字段名为:schema_name

tables中存储该用户创建的所有数据的库名和表名,在这个表中记录数据库库名和表名的字段名分别为 table_schema和table_name

columns表存储该用户创建的所有数据库的库名,表名和字段名,在该表中记录数据库库名,表名和字段名的字段名为table_schema,table_name,column_name;

group_concat()函数

功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

在我们这题中我们是用group_concat(column_name)意思是将这个表中所有字段名连接起来并返回数据。
https://www.cnblogs.com/wang-yaz/p/10862627.html
这个是参考链接

Author

vague huang

Posted on

2020-10-24

Updated on

2021-01-26

Licensed under

Comments