sqli-labs大冒险
0.介绍
很多时候新手在学习sql注入的时候,往往找不到合适的靶场进行练习操作。而sqli-labs就是一个适合新手去练习注入的一个专业的SQL注入练习平台,
是一个印度程序员写的程序,用来学习sql注入的一个游戏教程。其中包含了各种各样的注入姿势,并适用于GET和POST等场景,包含了以下注入:
- 基于错误的注入(Union Select)
字符串
整数 - 报错注入
- 盲注(基于Bool数据类型注入、基于时间注入)
- mysql 读写文件
- 更新查询注入(update )
- 插入查询注入(insert )
- Header头部注入(基于Referer注入、基于UserAgent注入、基于cookie注入)
- 二次注入
- 绕过WAF
绕过黑名单\过滤器\剥离\注释剥离 OR&AND 剥离空格和注释剥离 UNION和SELECT - 绕过addslashes()函数
- 绕过mysql_real_escape_string()函数(在特殊条件下)
- 堆叠注入(堆查询注入)
等…
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
2.通过数字值不同返回的内容也不同,所以我们输入的内容是带入到数据库里面查询了。
3.接下来我们判断sql语句是否是拼接,且是字符型还是数字型。
4.可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。
1.2联合注入
第一步:首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
1 | ?id=1'order by 3 --+ |
第二步:爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。
1 | ?id=-1'union select 1,2,3--+ |
第三步:获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26。
1 | ?id=-1'union select 1,database(),version()--+ |
第四步: 爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。
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'--+ |
第六步:通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。
1 | ?id=-1' union select 1,2,group_concat(username ,id , password) from users--+ |
lesson2
和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。那步骤和我们第一关是差不多的,
1 | "SELECT * FROM users WHERE id=$id LIMIT 0,1" |