由一次渗透引发的安全思考

近日对某网站进行了一次简单渗透,让我想起了不久之前发生的一次”小事件”;

拿出来和大家分享希望能对提高大家的安全开发意识有所帮助

事件回放:一个页面提供下载功能

结果是:程序bug导致下载服务器上的任意文件。

可能你会觉得下载了也没有用,因为我只开放了80端口,甚至还有负载均衡挡在外面,下载一个密码文件也没什么,但实际这是一个相当危险的问题。

以下是一些原理性的假设,其中一些细节是基于实际渗透的。仅供学习和交流,和给大家提个醒。

记得当时是这样的,有一个页面提供了活动相关mp3下载功能,结果被一些“细心”的朋友发现了其中的问题,并及时予以通知,这才进行了修补

其实原理很简单也很常见,和当年iis上出的那个目录遍历漏洞是一样的,就是提供下载功能的jsp文件将文件名作为参数传入,类似于:down.jsp?FileName=song.mp3,在浏览器地址栏提交后就能得到song.mp3这个文件了。

接下来,做一下简单的修改,将地址栏的参数改为如下样子:down.jsp?FileName=../../../../../song.mp3

由于这个目录下的文件根本不存在,如果程序处理的够好,包住了异常,那么就会返回一个0字节文件,这样看来不会出现问题,但是我们继续修改参数:down.jsp?FileName=../../../../../etc/hosts

猜猜看会怎么样?有两种可能

1.返回的仍然是空

原因:

a.文件不存在,也就是目录不对,那么需要再次尝试:down.jsp?FileName=../../../../../../etc/hosts;在增加一个“../”,直到找到文件

b.找到了文件,但是没有权限读取,但是很不幸,我见到过的类似问题都是能顺利读取的,而且能读取的远远不止这个文件

2.返回了hosts文件

bingo,如果顺利返回hosts文件,那么就可以更近一步渗透了。

可能你会想,就是个hosts么,没什么。

好了,下一步,我把地址改为如下内容:down.jsp?FileName=../../../../../etc/gshadow

于是获得文件,类似如下内容

bin:x:1:root,bin,daemon

daemon:x:2:root,bin,daemon

sys:x:3:root,bin,adm

…….

***:***:/home/dmtsai:/bin/bash

好了,这样我就获得了该系统中所有的用户名,也就是例子中/home/dmtsai:/bin/bash的dmtsai

当然一个系统中可能会有很多用户,当然也会全部列出来,

好了接下来做一件比较恐怖的事情

也是最核心的,将地址栏改为如下内容:down.jsp?FileName=../../../../../home/dmtsai/.bash_history

这下我就等于拿到了这台机器上的命令行历史记录

类 似于 vi,ftp,cd /***,rm ***,等等,甚至是mysql的数据库连接命令,还有一些Python脚本,这些记录全部拿到,因为是web服务器,也就很容易可以拿到你的web目 录,以及其中的关键东西,如果用的struts,那么定位到你的web目录,那么好了,struts-config文件有了,web.xml有了,然后数 据库配置文件也有了,log配置文件也有了。那么这意味着什么呢,你的整套网站的jsp源文件会被下载,或许这并不能拿到服务器的权限,但是很大程度为黑 客提供了一次深度接触我们的机会,这是十分危险的!

接下来就可以分析从服务器上获得的资料,准备进一步渗透了。可能通过对jsp文件的分析,你可以拿到上传的权限,这样会使问题更加恶化。

所以在日常开发中,这种文件下载的功能要慎之又慎,有可能一个疏忽就导致你的服务器遭到渗透

以下是一些总结:

1. 在做开发中,如果有下载功能,请不要将客户端提交的文件名直接用来去取文件,这是很大意很危险的行为。建议定义好type类型,然后通过传递type,来 取得相应的文件,如:aa对应 song1.mp3;bb对应song2.mp3。而且文件所在的根目录最好能固化在程序中,或者写在配置文件中

2.用户提交的数据都是不可信的,需要我们层层筛选,这其中合法性验证很必要,不是简单的数字判断,文件名判断之类的就行了的,至少要考虑两方面,

a.是否是未经处理就返回给用户(此处问题最近就发生过,还好已经及时修复)

b.是否未经处理就将参数传入到逻辑模块去执行了

a点的危害是我们常见的xss,用户提交恶意的代码,结果未做判断就扔回去。

b 点的危害就无法估量了,这取决于你的代码逻辑,如果它功能够强大,那么黑客获得东西也就越大,损失也就越大。所以对于用户提交的数据要十分谨慎,因为我们 的程序不只是要能够运行,还必须要健康的运行。其实完全可以把用户的提交数据看作是定时炸弹,不要犯懒,嫌麻烦,存在侥幸心理,觉得用户可能不会发现,要 知道面对几千万的用户,哪怕概率只有千万分之1,那也是恐怖的。

3.即使是只开放80端口,一样可以进行渗透,这时不管有没有防火墙什么的都没有用,因为这是通过正常的访问获得的,也就是说只要程序有bug,那么再强的防御也无济于事,这其实是一种简单的穿透手段,利用程序bug来穿透,获得敏感数据。

5.web服务器启动者的权限问题,如果web服务器的权限很低,那么我什么也拿不到,或者拿到很少的东西。同样如果启动者的权限过高,拿到的文件也就越多,万一从对jsp文件的分析中发现了上传方面的bug,那就真的是不堪设想

6.要下载的文件最好单独存放,并且以静态方式下载,这样可以将风险降到最低,甚至是0风险

7.还有很多,大家自己根据需要自己理解吧

注:以上只是简单介绍,其中有些linux的细节可能不准确,关键在于问题原理。

91ri.org:任何一个组织或许都有一个共同的特点,即构成组织的各个部分往往是优劣不齐的,但劣势部分却往往决定着整个组织的水平。问题是“最短的部分”是组织中一个有用的部分,所以千万不要小看任何一个漏洞,任何一个漏洞都有可能成为突破口的!

补充一句 小编最近刚刚注册了WOOYUN漏洞平台,很欣慰的看到很多的安全厂商都在正面且积极的面对自己的存在的问题,并且都在修复漏洞并尊重漏洞发现者。但也很蛋疼的看到有些厂商不承认自己有的漏洞 或者直接忽略然后又默默擦屁股,在此真心鄙视!!面对这样的厂商应该肿么办呢?果断发扬XXOO的黑阔精神啊!剩下的不多说了…你们懂得 哈哈…

推荐一篇文章《对居然之家的一次内网渗透

原文:http://hi.baidu.com/vstring/item/b254a63a91fac5ed96f88d35

网络安全攻防研究室(www.91ri.org)信息安全小组收集整理,转载请注明出处!