前言
在这次拖库过程中你非常幸运的没被其他管理员发现,但在了解了库里内容后你又觉得非常无趣,于是跳槽到了另一家网站做管理员。虽然这次给你的权限同样非常低,但有了前两次的经验,你也就觉得无所谓了。于是趁中午大伙都出去吃饭的空档干起了你的老本行。
题目分析
首页页面如下:
输入id=1后你非常得意的输入了一个 ‘ ,果然报错了:
你虽然对这报错并不熟悉,但你心中大定,因为你已经确定存在注入漏洞了。接着就是判断字符型还是整型漏洞了,那么要如何判断呢?你想起了在前一个网站的经验:先输入 and 1=1和and 1=2 看看结果怎么样:
两次结果均为正常,表明写入的逻辑判断无效,则很有可能是字符型注入漏洞。
输入 ’and ‘1’='1 ,其结果如下:
输入 ’and ‘1’='2 ,其结果如下:
此时已经可以完全判定是字符型注入漏洞,于是你非常自信的输入了 ‘order by 1,’ ,但真的会有这么顺利吗?结果如下:
不知为何你突然觉得报错才是一件很正常的事呢。但凡是总有个所以然,同样都是字符型漏洞,为何在第一个网站(Level1)行得通的语句为何到了第三个网站就不起作用了呢?就让我们一起来分析分析两个网站的报错情况吧:
在第一个网站中报错:’‘1’’ LIMIT 0,1’,由此我们推断出SQL语句为**……id=‘参数’** ;
在第二个网站中报错:’‘1’’) LIMIT 0,1’,由此我们推断出SQL语句为**……id=(‘参数’)** ;
因此关键点就在于这个 “ ) ”上,而要弄明白这个问题就得好好说一说闭合这个概念了。
闭合与注释
闭合
不知道大家有没有听说过虎符的概念。在古时候,虎符的一半交给领兵的大将军,另一半皇帝自己留着。等到皇帝想调兵的时候就派个臣子拿着一半虎符前往军营让大将军调兵,而大将军这边将两块虎符拼在一起勘合无误后才会派兵。
同样的道理,在SQL语句中,像 ’‘ 、()等都是成对出现地,一个不能多,一个也不能少。如果只有半块虎符那是调不了兵,如果出现了三个 半块虎符,因为三块都是真的,判断不了真假,同样不能调兵。因此当出现了一个 " ( " 时就必须有一个 “ ) ” 来与之闭合,SQL语句才能正常执行。这也就解释了为什么加一个 ’ 就能产生报错、逻辑判断中为什么要加那么多的单引号,这一切都跟闭合有关联。
简而言之,如果出现了引号括号等符号,要想让SQL语句执行,就必须使其成对存在。
所以Level1中采用了 ‘SQL语句’ 的笨方法来闭合左右各自动加上的一个 ’ 。那在Level3中是不是可以采用 ‘)(‘SQL语句 的方式来闭合左右自动加上的 (’ 和 ')呢?仔细想想就知道是不可以的啦,结果如下:
因为这么输入后就变成了 ……id= (‘参数’)(‘SQL语句’) ,此时写入的SQL语句同样无法执行。
那该怎么办呢?此时就要用到我们的注释啦。
注释
注释相当于是一种标记,当SQL语句执行到有这种标记的地方时就会跳过。因此我们可以利用这种机制,注释掉右边自动加上的 ‘) ,这样既闭合了左边的 (’ ,又可以让我们写入的SQL语句正常执行。那要怎么使用注释呢?最常用的有两种方法:
-
采用 # 注释:当我们写完SQL语句后加上一个 # 即可,但需要注意的是不能直接输入# 。因为在前端开发中,#表示一个锚,所以要使用转码 %23 的形式来进行注释。因此实际写入语句为:’)order by 1 %23 。
结果如下:
结果表明我们写入的语句可以被正常执行。 -
采用- -+注释(连续的两个减号一个加号):原本应该是- -后面接一个空格,但为了避免转码,所以用+代替空格。
因此实际写入语句为:’)order by 1–+ 。结果如下:
写入的语句同样可以被正常执行。
之后的操作与Level1一致,在此不做赘述。
总结
SQL语句只有在闭合状态下才能被正常执行,因此在写入语句时必须要关注是否闭合。为了方便操作,我们通常采用闭合左边、注释右边的方式来让我们写入的SQL语句执行。
以上就是本篇的全部内容,我们下篇见。