Web渗透测试之SQL注入:Level5

前言

  虽然你金盆洗手不再干拖库这种事了,但有一天你在网上冲浪时,无意中发现了这么一段话:“想要我的宝藏吗?如果想要的话,那就到www.xxx.com去找吧,我全部都放在那里。”看到这段话之后你热血沸腾,中二之魂熊熊燃烧,发誓一定要找到大宝藏。于是你访问了这个网站。

题目分析

网站首页如下:
网站首页
你按照提示输入id后结果如下:
输入id后的结果
改变输入的id的值时页面无变化:
页面无变化
  看到这你顿时觉得大事不妙:对比你之前攻击的那些网站,这次的网站没有将查询结果返回到页面显示出来,因此即便存在注入漏洞,也无法像前几次那样将写入的SQL语句执行后的结果显示出来。但不管怎样,目前确定是否存在注入漏洞才是首要的。
输入单引号结果如下:
单引号结果
因此可以判断存在注入漏洞,并且是利用单引号进行闭合的。
  那么现在的难题就是如何让写入的SQL语句执行得到的结果显示出来呢?你思来想去始终得不到答案,这让你非常恼火,只是一想到大宝藏,你又不得不再次冷静下来。终于你灵光一闪,想起了曾经学过的葵花宝典里的第二式——报错注入(其它方式本篇暂且不谈)。

注入原理

  那什么是报错注入呢?其原理就是通过制造错误,让SQL语句执行所得结果能够出现在错误信息中,这样就能解决无法让结果显示出来的难题了。那要制造什么样的错误才能达到我们的目的呢?这里介绍最常用的方法:利用XPATH语法错误进行报错注入。
  在利用函数对XML文档进行操作时有如下机制:当提供的XML路径非法时会进行报错,并将我们写入的SQL查询语句的结果显示出来。需要注意的是,无效和非法是两种概念。比如路径a:/xx/xx/,路径a是合法的,但如果不存在这个路径a,则路径a是无效的,并且无效路径不会报错;再来看路径b:&xx&xx&,路径b是非法的,即便字符xx正确,也会报错。因此我们只需将非法间隔符和SQL查询语句拼接在一起,就能产生报错注入。

注入所需函数介绍

  对XML文档进行操作的函数有两种:extractvalueupdatexml,二者都可以利用XPATH语法错误进行报错注入。还需注意的是,即便XML文档名错误也不会进行报错。

extractvalue(a,b)

extractvalue函数可以对XML文档进行查询操作,参数a为目标文档,b为路径,用法如下:
and extractvalue(1,concat(0x7f,(select database())))
这里的分隔符为了避免使用单引号,我们采用十六进制进行表示。
写入该语句后结果如下:
extractvalue报错注入
剩下的操作与之前的一致。

updatexml(a,b,c)

updatexml函数可以对XML文档进行更新操作,参数a为目标文档,b为路径,c为更新内容。用法如下:
and updatexml(1,concat(0x7f,(select database()),1))
写入该语句后结果如下:
updatexml报错注入
剩下的操作与之前的一致。

  对于这两个函数需要注意的是,二者返回结果均不大于32位,因此在获取字段这类数据时,为了查看32位之后的内容,我们可以使用函数substr进行指定位置的截取。用法如下:
extractvalue(1,concat(0x7f,substr(select database(),a,b)))
  该语句执行情况为:先调用extractvalue函数查询XML文档,接着concat函数将非法字符与SQL语句拼接在一起,当extractvalue函数在发现路径非法时进行报错并执行语句select database();最后substr函数将语句查询结果从a位到b位截取。
当a=2,b=5时执行结果如下:
利用substr函数进行截取

总结

  当确定存在SQL注入漏洞时,如果页面没有返回查询的结果,则可以尝试采用报错注入。而最常用的方法为利用XPATH语法错误机制进行报错注入。   以上就是本篇的全部内容,我们下篇见。