2009-08-10 上午 07:16

题外话:

       貌似好久没有写一点东西了.最近情绪一直不好,许多事情让人无法理解,尝试改变下自己,换个卑贱的生活.

       或许我已经老了,不懂年轻人在想什么了,迫使自己喜欢一直反感的东西,从QQ空间做起吧...忍住呕吐的冲动说:都来我QQ空间踩吧....

=============================================================================

作者:皇子    
来源:http://www.2chuizi.com/blog/read.php?355
技术虽不分国界 转载请保留来源

       通常在一个sql注射点上,我们总是试图使用多句执行sql语句来达到想要的目的.

       随着安全意识的普遍提高,参数的过滤变的越来越细致,有时不允许我们来多句完成某些操作.过去的几年里,";"被作为一个比较重要的多句执行判断标准,实际上我们都知道多句符号不至于这一点,TAB,空格,回车都可以用来SQL多句执行.我遇到过许多过滤了"--"的例子,有时候即使过滤了,由于种种情况,我们黑盒测试下没受到阻碍,不会对其在意,然而有时则不行.

       SQL注入漏洞的利用始终是由脚本来决定的.通常我们会觉得只有字符型或者搜索型注射点,因为要闭合最后的单引号,不得不使用"--"来注释后面多出来的字符,其实不完全是这样.数字型的注射点里也有许多要求使用注释符以后才能在多句执行的情况下成功运行.其实不管是字符型还是数字型,如果注释符无法使用导致我们不能完成操作时,其实并不是完全没有机会,仍然可以试一试,虽然无法保证一定能够成功,却也算多了几分机会.

       先说说为什么有时候我们觉得数字型的注射点不需要用"--"来注释后面的操作.一般的最常见的情况下,也是最基本的情况下.参数如果是一个数字,脚本里我们通常写作: "select * from news where id="&id,获取的参数后面没有内容了,我们的语句可以直接附加上去,只要保证我们多句执行的语句没有错误就可以了.字符型注射点里自然就是写作:"select * from news where name='"&name&"'",我们加上自己想要执行的语句后仍然会多出来一个单引号,所以在语句的结尾加上注释符使其无法发挥作用.

       那如果注释符被过滤,字符型的点就不好办了,通常我们都是拿来猜猜表什么的.或者干脆找一个数字型的点来利用.可惜数字型也不完全有机会,如果脚本里写作:"select * from news where classid="&classid&"order by id desc",我们附加上自己的语句以后,仍然有多出来的条件等因素破坏我们的语句,注释符的关键就体现出来了.如图:

关于SQL注入时无法使用注释符的一点手法

关于SQL注入时无法使用注释符的一点手法

关于SQL注入时无法使用注释符的一点手法

       其实能够突破注释符,使它不再关键的办法也很容易就可以想到,只是比较繁琐.拥有一个注射点,无论报错还是不报错,我们最基本的能做什么?一般情况下猜猜表和字段及其内容还是可以做到的.我们可以打开注射点,看看当前数据库里显示给我们的内容是什么,通过文件名,内容分类,内容正文,或者干脆使用注射点暴力猜解,不难猜到当前注射点使用的是哪一个表,甚至精确到哪一个字段哪一行内容.

       有了这些我们已经可以进行某种尝试了.先不必去管脚本里的sql语句里有多少限制和条件,至少我们知道是哪一个表.还是用刚才的例子来说明,我从注射点显示给我的结果分析出来是使用的news表,那我们当然可以用多句执行来玩填字游戏,如图:

关于SQL注入时无法使用注释符的一点手法

       现在来看,不需要注释符就已经成功执行了我们想要的SQL语句.具体在注射点上大约可以写作:

http://www.xxx.com/xxx.asp?id=1;你要执行的语句;select top 1 * from news

       那字符型的也很容易就可以知道怎么做了,比如:

关于SQL注入时无法使用注释符的一点手法

实际操作时候可以写作:

http://www.xxx.com/xxx.asp?name=admin';你要执行的语句;select top 1 * from news where '1'='1

    总之是给出一种变化,多了几分机会而已.情况是多变的,不能够适用所有,还是临时分析比较好.即使情况相符,如果是多表关联查询,结果也是未知的.