OfficeAnywhere是通达网络办公系统的别名,这款网络办公系统的名气很大,国内多个企业、单位都在使用,这一点可以通过访问其官方网站看到。工作中由于朋友所在的公司引入了该系统,受其委托对其做了安全测试,结果大大超乎我的想象,下面将部分测试过程拿出来与大家一起分享。当然,介于该系统的影响范围,本文旨在讨论安全技术,请勿利用文中技术进行任何违法行为,内容已去除关键敏感信息和代码,文章内提及的漏洞均已修复,以防止被恶意利用。
被测试的系统版本为其官网发布的最新的“通达OA2011网络智能办公系统”。整个系统安装过程非常简单方便,不需要安装额外的一些辅助软件,从这一点来讲,就比一些办公系统要做的好。安装完成后,使用浏览器就可以直接访问通达网络办公系统,通过简单的设置,我们这里建立了两个测试用户,分别为:test和test2。在通达网络办公系统中,有一个发送电子邮件的功能,在这个模块我们进行了XSS测试,如图1所示。
图1显示的是我们利用test账户登录通达网络办公系统后,创建了一封新邮件,其接收对象是test2。在创建邮件过程中,系统允许对邮件的内容进行源代码编辑,点击图1右侧中间部分的“源码”图标就可以编辑邮件源代码,不要在正常模式下输入XSS测试脚本后,再点击“源码”图标,系统会对脚本代码做基本的HTMLEncode,破坏我们的测试效果。这里我们输入了一段简单的XSS测试脚本,脚本目的是弹出一个显示有“测试脚本成功执行”的对话框。发送该邮件后,注销test账户,利用test2用户登录系统,此时系统会显示有一封新邮件,如图2所示。
点击该新邮件,系统会进入邮件阅读模式,意想不到的一幕发生了,如图3所示。
毫无疑问,通达网络办公系统的电子邮件模块存在重大安全漏洞,如此简单的XSS测试竟被成功执行。在内网使用中,如果某个恶意用户设计一段特殊目的的脚本代码插入到电子邮件,然后群发给系统中的所有用户,那么结果可想而知。上面的这个安全漏洞从性质上来讲,应该属于针对客户端的攻击,而我们最喜欢的是直接从客户端攻击服务器的安全漏洞,这种漏洞价值最高,效果最为明显。测试发现,通达网络办公系统同样存在多个远程攻击漏洞,下面介绍的就是其中之一。通达网络办公系统的后台Web模块采用PHP语言开发,经过了Zend加密,可能设计者以为这样的方法就可以保证核心技术的安全,甚至可以防止安全测试人员发现安全漏洞。利用现有的PHP解密程序,轻而易举地还原了通达网络办公系统所有的PHP程序源代码,其中“delFile.php”文件中的代码引起了我们的兴趣,该文件的存在路径如图4所示。
include_once(general/crm/apps/crm/header.php); include_once(inc/utility_file.php); if(file_exists($errorReportPath)) { @unlink($errorReportPath); } if(file_exists($filePath)) { @unlink($filePath); } echoscriptparent.goBackUrl(.$del_url.);/script;
以上是“delFile.php”文件的主要代码,代码内容很简单,主要是执行一个文件删除过程。这个过程没有任何安全检查,参数$errorReportPath和$filePath可以被我们直接提交。只要被提交参数所代表的文件存在于服务器上,那么“delFile.php”就可以忠实地履行删除文件的任务。在服务器所在的C盘下建立任意名称的文件,如1.txt,在浏览器中提交URL地址:http://******.php?errorReportPath=c:/1.txt,再去看看服务器上还能不能找到刚刚建立的1.txt文件。现在,我们可以编写一个批处理文件或者小程序,将上面URL地址中的$errorReportPath参数指向服务器上的重要文件路径,只需要一个简单的回车,服务器上所有重要文件就不存在了。
如果觉得上面这个漏洞还不够刺激,那请允许我向你隆重推出下面这个漏洞。漏洞存在于“ExecQuery.php”文件中,该文件所在路径为:D:\MYOA\webroot\general\reportshop\utils,其代码如下所示:
include_once(inc/conn.php); include_once(./utils.php); $res=mysqlexecutesql($_POST[SQLQuery]); $res=gzencode($res); echo$res;
从代码来看,ExecQuery.php文件允许我们进行数据库查询操作。Mysqlexecutesql函数来自于utils.php文件,其源代码如下:
functionMySQLExecuteSQL($sql,$NoPrefix=FALSE) { global$connection; global$MYSQL_DB; $sql=str_replace(\\,,$sql); //替换SQL参数中的双斜杠为空字符,防止查询出现错误 if(strpos($sql,join)!==FALSE) { $has_join=TRUE; } else { $has_join=FALSE; } $sys_info=getsysinfo(); if(strpos($sql,crscell.)===FALSE) { $sql=strtoupper($sql); } if($sys_info==ra) { $sql=str_replace({$MYSQL_DB}.,,$sql); } if($NoPrefix) { $res=; } else { …. } $cursor=exequery($connection,$sql); …. return$res; }
从代码来看,Mysqlexecutesql函数没有什么限制,更不要谈什么安全限制。我们可以提交任意SQL语句给ExecQuery.php文件,直接从数据库中获取数据或者修改数据库,或者直导出WebShell到服务器上,是不是觉得这个漏洞足够致命了?在查询数据库时,由于ExecQuery.php文件最后使用gzencode函数对查询结果进行转码压缩,所以查询出来的数据不可视,我们可以借助程序直接获取查询结果,不要利用浏览器来获取结果。转码后的效果如图5所示。
可以看到此刻我们已经直接获取到了数据库中用户的所有信息,其格式类似为:z:rowUID=1USER_ID=adminUSER_NAME=系统管理员USER_NAME_INDEX=jx*t*g*l*y*BYNAME=USEING_KEY=USING_FINGER=0PASSWORD=tVHbkPWW57Hw./。这是XML格式,不影响阅读。
通达网络办公系统在易用性和界面效果方面非常不错,但安全方面还存在诸多问题,PHP加密只是一种防止技术泄漏的手段,要是当作防止安全漏洞的方法就有些掩耳盗铃了。希望通达网络办公系统的开发者能够做出越来越完美的办公自动化产品。