2008-03-27 14:09,老文章,搬来给刚入门的菜鸟看看,可以学习一点注入的小技巧……

    大家可能都遇到过这种情况!就是在找到注入点的时候,猜不出来表名或者是列名!这个时候可能好多刚接触这方面的小菜就要犯难了,其实,猜不出来是正常的!既然叫“猜”!当然不能每次都猜中了!工具只会按预先设定好的表名或者列名来猜!如果网站所用的数据库里存在一张工具里没有存着的表名或者列名,那工具就猜不出来喽!MSSQL是用爆的,不是用猜的!这点大家要知道!

    大家肯定认为那些猜不出来列或者表的注入点就没有用了吧!其实不然,说它的用处大,也不大,用处小,也不小!为什么这么说呢!因为它有另一个用法!不过这个用法在入侵中不常用,有的时候甚至用不了!什么用法呢?就是跨库查询!相信大家还记的,猜表名的语句是这样的:

and exists(select count(*) from 表)

    其实from后面可以跟路径的!不过要绝对路径!这个路径指向一个数据库,就可以实现跨库查询!

    比如吧,有一个数据库的路径是 D:\hack\1.mdb ,我们想要跨库查询它的内容!就要用到这个语句:and exists (select count(*) from D:\hack\1.mdb.admin),大家可能看到了,1.mdb后面跟了“.admin”,这是什么呢!其实admin是这个1.mdb里的一个表!

    当然,在注入网站的时候,我们是不知道要跨的那个数据库是有哪些表的,所以我们要用这种方法去猜!把admin改成别的表,就可以猜别的表存在不存在了!记的哦!如果刚才我们构造的那个注入语句返回正常的话,就说明1.mdb 这个数据库里存在admin这张表!接着就是猜列!和以前的猜法一样,只不过from后面跟的变了变,这里也给大家写一下吧!

    其实我更希望大家自己思考,有帮助的!猜列的语句是and (select count(列名) from 数据库路径.表名)>0,知道了吧 ,就是from后面跟的东东变了变!别的没变!一定要记的,数据库路径后面还要加上一个点和一个表名!这就是简单的跨库查询!

    可能有朋友要问了,这个有什么用呢!现在我告诉大家,当我们知道了一个对我们有用的数据库的绝对路径,可是不能下载,也没有注入点是连接到这个数据库的,这个时候我们就可以随便找一下注入点,前提是这个注入点连接的数据库和你要跨的数据库在同一服务器上!这个时候我们就可以通过这个注入点来跨库查询那一个数据库的内容!

    明白了吧!其实也不只这一点用处!大家想想,from后面不是可以跟路径么!这个时候我们可不可以用它来猜服务器上的文件内容呢!当然是可以的,只要把from后面跟的数据库站径改成我们要猜的就可以了。这里来一个例子!


    and exists (select count(*) from 路径),就可以了(这里我记的不太清了,应该是这样没错,如果有错的话请告诉我一下!)我们把路径改成C:\windows\1.c,(注意:这个c可以是任意的字母!)这个时候如果提示 'c:\windows\a.mdb' 不是一個有效的路徑,就说明不存在c:\windows\这个文件夹!(不要想是不是我写错了或者是忘了找mdb了,没有,等你们自己试验的时候就知道了!)。

    可是如果提示找不到文件的话呢,说明存在这个文件夹,可是不存在1.mdb这个文件!

    这个时候可能大家要问了,这样不是只可以猜mdb的数据吗?因为不管在文件名后面加上什么字母,都会自己变成mdb格式的文件来检测!

    其实可以查询其它的文件格式的。这么写就可以了。把1.c改成1.exe.c就可以查询这个1.exe是不是存在!

    如果存在的话,就会提示c:\windows\1.exe不是一个有效的数据库文件!(或者有别的不同的提示,反正不会提示找不到文件!)如果提示找不到文件的话,就说明没有这个文件!

    这样可以大概确定是服务器是什么系统了!如果存在c:\winnt\的话就是2000以,存在c:\windows\的话应该就是2003了!

    好!跨库查询的作用就写到这里!等下我给大家制作一下教程!

    其实还有一个比较实用的方法。就是只要知道一个列名就可以爆所有列名的值。这个方法用到了联接查询join语句!因为我也没有理解这个方法是什么意思,所以这里就不做介绍了!大家如果想要学的话自己到网上找一下相应的资料!当然,如果哪一天 我理解了的话就再补充给大家!

8、补充!

    在注入的时候,可能没有那么顺利,有的时候程序过滤了这个字符或者过滤了那个。或者干脆用了防注入程序。!或者监控器!这个时候我们就没有办法了吗?不!肯定有的!只不过我们没有发现而已,因为这方面的知识我知道的很少,所以只能给大家一点点的思路!如果谁还有知道的就请补充一下!

    第一,如果程序过滤了空格,我们可以用/**/来代替,也可以用空格的URL编程%20来代替,最近在论坛里看到了另一种方法,我没有试过!地址是这个:http://www.hackerxfiles.net/viewthread.php?tid=16791&highlight=%E7%A9%BA%E6%A0%BC 大家有时间试一下!

    第二,过滤了">"或者"<",我们可以用between用代替!有点英语基础的朋友都知道它是什么意思!如果程序过滤了><号的话,就证明我们不可以用以前那种方法猜字符的ASCII码了!这个时候我们可以用between!比如,这里我猜admin第一位a的ASCII码!以前我们用到的方法是select asc(mid(admin,1,1))>X 这样猜。可是现在过滤了">"了,我们不能用这个句子了。我们就可以这样select asc(mid(admin,1,1)) between 80 and 100(有点记不清了,如果说错了还靖见谅!)如果返回正常,就说明admin的每一个字符a的ASCII码处在80到100之间,这样我们就一点点的缩小范围!直到猜出ASCII码!

    第三,如果用了防注入程序,我们就从防注入程序的漏洞下手!以前在网上看过一篇文章,是讲通用防注入程序3。0的漏洞的。地址多少忘了,朋友们自己找一下吧!这方面突破过滤的知识我只知道一点点,不好意思了!