本次注入sql-labs的第二关
1.进入第二关后,我们可以看到英语 please input the id as parameter with numeric value,请输入ID作为参数和数值。首先我们可以判断出这是一个GET请求作为注入点的题目,那么我们就需要去URL上拼接ID的值,首先把值赋为1来试试。
2.如上图片所示,我们可以看到id为1那么就显示出来了第一个用户的名字与密码,接着我们试着把id的值改为2
可以看到名字与密码的参数都发生了变化,也就是这两个地方的值是要与数据库进行交互的,那么这两个地方也有可能会是我们将来注入时回显内容的地方。
3.接着我们来判断一下这是一个字符型还是一个数字型的注入
我们可以先随便丢一个引号试试,看看有没有提示
现在页面已经给出了错误,可以看到多了一个引号就报错,并且根据提示,我们可以看出这是一个数字型的注入,那么就不需要去考虑闭合的问题了。
4.下面我们要去查看一下页面的列数,可以使用group by这个函数的二分法来进行判断
根据页面提示可以看出列数为3
5.构造SQL语句,查看信息会在哪个地方进行回显
我们使用联合查询临时表1,2,3会发现没有显示内容,这是因为现在的值把显示内容的地方占有了,我们需要让页面无法显示正常的内容从而让他去显示我们要查询的内容。
现在我们可以看到Login name与Password这两个地方可以去显示我们要查询的内容,现在开始先查询数据库
数据库为security,下一步就是要去查找这个数据库下面的所有表。MYSQL数据库的所有表的信息都存储在了information_schema数据库里面的tables这个表里(information_schema.tables中两列table_schema是数据库名,table_name中表名。)
由此可以构造SQL语句:
http://sqli-labs:8088/Less-2?id=-2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
group_concat(table_name)就是把多行的table_name在一行里面显示
from information_schema.tables即table_name的内容在这个数据库里的tables表里查询,并且有个条件是table_name这个表所属的数据库是security
查询出security数据库里的所有表如上图
6.一般账号与密码都会存储在users这个表里面,所以我们要去查看users这个表里面的值,为了需要准确的得出账号与密码,可以先对里面的字段进行查询(information_schema.columns表中三列table_schema是数据库名,
table_name中表名,column_name是列名。)
构造SQL语句
http://sqli-labs:8088/Less-2?id=-2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'
很显然,账号密码存储在sercurity数据库里面的users表里面的username与password字段里面,现在对账号与密码进行查询
构造SQL语句
http://sqli-labs:8088/Less-2?id=-2 union select 1,2,group_concat(username,'-',password) from security.users
大功告成,最终拿下了所有的账号与密码。