CmsEasy注入漏洞分析

浏览:
字体:
发布时间:2013-12-13 14:31:28
来源:
CmsEasy是一款基于PHP+Mysql架构的网站内容管理系统,也是一个PHP开发平台。它采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案,目前CmsEasy已经越来越多地被应用到各大中型商业网站。就在不久前,网上公布了该系统存在的一个严重的SQL注入漏洞,黑客可以借助该漏洞获取网站的敏感数据信息,进而对网站服务器实施进一步的渗透攻击。本文将对CmsEasy系统的这一漏洞进行分析和描述,分析存在漏洞的版本信息为CmsEasy_5.5_UTF-8_20130605。

漏洞分析

存在漏洞的函数存在于CmsEasy系统目录下的/lib/tool/front_class.php文件中。在该文件中的第505行开始是系统用于获取客户端IP地址的函数,该函数代码如下图1所示。

图1 存在问题的函数

从代码中我们可以发现,系统在获取客户端IP地址时首先是通过HTTP数据报文投中的内容进行获取的,如果数据报文头中不包含客户端IP信息时,就通过TCP连接过程中的IP地址进行获取。过去有过分析PHP应用程序系统漏洞的朋友在看到这段代码之后一定会很容易发现,这个漏洞的存在还是很经典的,因为过去有很多的程序曾经存在过这个类型的漏洞,并且都可以用来对Web应用程序进行攻击。因为这个函数在处理获取到的数据信息时,没有对数据信息的合法性和安全性进行过滤就直接返回。同时我们也知道获取HTTP数据报文头部信息时,PHP是通过$_SERVER方法进行获取的,而该方法是不受magic_quotes_gpc的影响的,也就是说,在这里提交的单引号是不会被转义的,可以用来闭合SQL语句中的单引号并插入注入语句。

接下来,我们就来查找在CmsEasy系统中哪里调用了存在问题的函数,并且在处理数据过程中是否对提交的数据内容进行过滤。如果没有过滤,那么就可以成功实现注入攻击。在CmsEasy系统中订单操作部分,我们找到了调用存在漏洞的ip()函数位置,在/lib/default/archive_act.php文件中第761行的orders_action()函数中,代码如下图2所示。

图2 调用危险函数及数据处理过程

从图中我们可以看到,在获取完数据内容以后,没有对IP地址信息进行过滤就通过rec_insert()函数将数据内容插入到数据库中。那么我们就需要分析一下rec_insert()函数中是否对插入的内容进行过滤。rec_insert()函数及该函数中调用的其他函数代码如下图3所示。

图3 SQL语句操作过程

可以看到,数据执行插入过程中没有执行任何过滤就写入数据库中,也就是说从控制变量内容到变量内容写入数据库均没有对数据的合法性和安全性进行有效的过滤,这就造成了SQL注入攻击漏洞的形成。接下来,我们在实际环境中对该漏洞进行测试。

漏洞测试

为了测试方便,我们使用先前介绍过的Web调试工具Fiddler来实现断点调试和添加HTTP数据报文头提交的功能。首先,我们在网站首页中随便寻找一个产品并下单购买,随便填写订单信息如下图4所示。

图4 下订单实现漏洞利用

填写完成以后不要着急点击提交按钮,首先我们要对数据提交过程进行断点。因为我们是在本地进行测试的,所以在Fiddler中执行命令bpu 127.0.0.1,这句命令的作用是当提交的数据信息的Host地址为127.0.0.1的地址时,就会自动停止数据提交,等待用户对数据信息进行操作。这时我们再点击提交按钮,Fiddler成功将提交数据报文断下,然后我们在HTTP Headers选项中选择添加HTTP数据头。根据程序的漏洞利用,我们选择使用HTTP_X_FORWARDED_FOR进行漏洞利用,那么添加的头名称为X-Forwarded-For,内容为127.0.0.1','1','1'),('1','a','a',(select concat(username,0x7c,password) from cmseasy_user where userid=1),'a','a','0','1381393437','127.0.0.1,如下图5所示。

图5 在Fiddler中添加X-Forwarded-For头

构造这句代码的主要作用就是首先闭合掉原有的插入内容语句,然后在构造一个我们自定义的语句内容。通过构造以后,将执行的SQL语句设置为INSERT INTO `cmseasy_p_orders`(pnums,pname,telphone,address,postcode,content,mid,adddate,ip,aid,oid) VALUES ('1','单位名称','86-0731-88855699-01','详细地址','100000','订单留言','1','1381395637','127.0.0.1','1','1'),('1','a','a',(select concat(username,0x7c,password) from cmseasy_user where userid=1),'a','a','0','1381393437','127.0.0.1','15','20131010170037-0-1-')。通过如此构造实现在执行一条SQL语句时插入两条数据记录的目的,而在显示时会按照我们构造的语句内容进行显示。在添加HTTP头并保存以后,我们可以看到Fiddler中等待提交的数据报文内容包含了我们添加的X-Forwarded-For部分,如下图6所示。

图6 漏洞利用提交的数据包信息

然后我们将Fiddler中设置的断点清除,直接执行bpu命令即可,随后选择提交数据报文。浏览器就会提示我们数据提交成功,并返回相应的订单数据信息,从订单数据信息中我们可以看到,通过注入漏洞获取到的管理员账号及Md5加密过的密码信息如下图7所示。

图7 获取到管理员账号及密码信息

通过Cmd5网站可以很方便的对MD5加密数据进行解密,解密结果为admin,如下图8所示。

图8 对Md5加密信息进行破解

然后就可以通过获取到的账号及密码信息直接登录网站的后台地址即可,如图9所示。

图9 利用账号密码成功登录后台

漏洞修补

目前,CmsEasy系统官方已经对该注入漏洞进行修补,使用CmsEasy系统的用户只需要将系统升级到最新版本即可解决该漏洞。在新版本代码中可以看到,存在漏洞的ip()函数在获取IP地址信息以后通过正则表达式匹配的方式对获取到的数据内容进行严格匹配过滤,只有符合正则的内容才认为是合法输入,否在认为是非法来源,如下图10所示。

图10 官方对漏洞的修补

从官方的修补方案中我们可以看到,其通过编写极其复杂的正则表达式实现对在线IP地址信息进行过滤,但是复杂的正则表达式可能会对程序执行过程中的性能产生一定影响,网站管理人员也可以通过自己修改的方式修补这个漏洞实现简单防范的目的。

CmsEasy系统是我国互联网环境中众多商业应用程序中的一款,商业应用程序中往往涉及到客户账号密码、联系地址以及购买的商品等大量的敏感数据信息。而如果这种商业系统存在安全漏洞的话,就会导致这些敏感数据信息泄露,造成不必要的损失。所以我们建议使用开源系统的商业网站管理人员能够多关注应用程序官方的安全公告信息,在应用程序出现漏洞时,能够尽快获取相应信息并及时更新网站应用程序,保护网站敏感数据信息不被黑客窃取和恶意利用

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();