2015年5月24日星期日

SQL Injection: Time Based Injection

之前一直都不是很了解Time Based的适用场景。
前段时间拿了一个站点,该站点只能用盲注拿下,当初是用sqlmap跑回来的。
而且sqlmap的给出的注入方法是Boolean Based。
后来反反复复思考了很久,发现这个站点其实应该只能用Stacked Query + Time Based拿下。这是今天重新扫的结果。

 (看到截图里的Warning没有,连目标又AntiXSS都发现了。因为确实在该页面的代码里发现了一段对id参数进行AntiXSS处理的代码。大小尖括号这种东西,肯定被HTML编码替换了。)

今天又重新翻了一下webconfig,发现当前数据库连接的用户是sa。直接用stacked query+xp_cmdshell提权就好了= =。还费那么大力气找后台,用上传漏洞

注入点在URL里,参数为id=1
构造id=1'后直接报错,重定向蹈了一个通用错误页面。
构造id=1' and '1'='1后结果同上。
构造id=1-0后显示了一个不包含任何内容的正常页面。

拿下Server以后第一件事情不是跑去提权,而是去翻www目录里对应站点的Source Code。
才发现了问题的所在。
原来id参数被带入的两个sql语句中。

String SqlStr1 = "select * from [news] where id = '" +id + "'";

String SqlStr2 = "select  * from [news]  WHERE (id NOT IN ('" + id + "')) order by  NewsID()";

之前注入构造的参数仅能满足第一个SQL正常执行,但是不能保证第二条SQL正常被执行。
因此无法构造出一个同时满足两条sql语句都正常执行。

这里就会用到Time Based了。因为Time Based只要被带入,就会执行。并产生延时效果。
因为String SqlStr1 = "select * from [news] where id = '" +id + "'";首先被执行,因此只要构造id=1'; WAITFOR DELAY '0:0:5'--
然后观察一下是不是5秒之后才被重定向到通用错误页面,即可判断当前的id是不是一个注入点了。

其实也是今天才发现,当初用来注入的,其实是另一个页面的注入点。一个纯string类型的。

没有评论:

发表评论