知识补充:
前一篇提到了如何判断字符型与数字型以及字符型的闭合,不过在做sqli-labs靶场时,出现了id=(‘1’),甚至还有id=((‘1’))这样双括号包裹的,在这里笔者也是没想到,不过正常来说,开发人员是不会使用这种的,所以前篇提到的单引号双引号判断法,还是有用的。
其实页面有回显,判断出数字型以及字符型还有闭合,还是相对简单的,下面拿靶场举列
上图,我们将报错信息拿出来分析一下:
''1'' LIMIT 0,1'
将最外面的包裹引号去掉:
'1'' LIMIT 0,
不难看出,我们输入的是1’,而报错信息是’1’ ',这是因为我们多打了一个单引号而导致原来的单引号失效,所以会有报错,这里可以判断是字符型,并且是单引号闭合
再来看另外一个:
输入单引号:
输入双引号:
按照我们之前的判断法,这里就可以判断出是数字型了,在看下报错信息:
'' LIMIT 0,1'
'" LIMIT 0,1'
还是把最外面的包裹引号去掉:
' LIMIT 0,1
" LIMIT 0,1
从这里可以看出,不管输入单引号还是双引号,都会导致语法错误而报错,所以判断出是数字型。
这里在和上面第一张图的报错对比:
''1'' LIMIT 0,1' ——字符型
'' LIMIT 0,1' ——数字型
不难发现,如果是字符型,会有你输入的值加上单双引号,而如果是数字型,不会有输入的数值,只有单双引号
而利用回显报错方法,我们可以判断是sqli-labs第三关和第四关的闭合,如第三关:
''1'') LIMIT 0,1' ——— 拿掉包裹 ——— '1'') LIMIT 0,1
可以判断出,id=(‘1’),所以闭合的时候,需要在加一个)
第四关:
同样的:
'"1"") LIMIT 0,1' ———— "1"") LIMIT 0,1
可以判断出,id=(“1”),闭合为")
在后面的关卡中,还有双括号包裹的,所以在判断时需要注意,不过还是要强调一句,实战中基本不会遇见单括号和双括号的。
如果页面没有回显,但是有提示报错,那么就无法使用联合查询,这时候可以尝试使用报错注入
报错注入有很多种方法,最常见的就是使用floor(),rand()和group by组合产生报错,这种办法可以自行百度,下面我使用的是另外的方法。
之前提到过,mysql数据库现在基本都是5以后的版本了,所以我们的方法得以使用:
extratvalue(arg1,arg2)函数
arg1 string格式
arg2 Xpath格式
updatexml(arg1,arg2,arg3)函数
arg1为xml文档对象的名称
arg2为xpath格式的字符串
arg3为string格式,替换查找到的符合条件的数据
报错注入,简单来说就是利用了函数的格式不正确,从而产生报错信息,就拿updatexml来说,只要xpath格式的字符串不正确,那么就会报错,需要注意的是,这两个函数报错显示最大限制是32位,如果没办法显示完全,可以利用substr函数来截取,这里拿第五关来演示一下:
先输入id=1查看,发现没有回显信息:
单引号报错,判断有注入点,观察报错信息,判断是单引号闭合:
利用updatexml函数报错注入,发现有信息,但是并不完整:
这时候我们再利用concat尝试一下,爆出完整的版本信息了:
那么为什么要有concat连接才能爆出完整信息呢,那是因为xpath格式不正确,他会把校验失败的数据爆出来,这其实是方便开发人员调试的,所以想要爆出完整的信息,我们利用concat函数再加入非xpath格式,如0x7e,让它校验失败即可
明白了这些,下面就好办了,这里演示下爆出全部数据库名的操作,因为最大限制是32位,所以这里我没有用group_concat,而是使用了limit一个一个查看,当然也可以使用substr截取:
接下来的操作就和之前联合查询差不多,这里就不多说,直接用图片演示: