CmsEasy注入漏洞分析
漏洞分析
存在漏洞的函数存在于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系统是我国互联网环境中众多商业应用程序中的一款,商业应用程序中往往涉及到客户账号密码、联系地址以及购买的商品等大量的敏感数据信息。而如果这种商业系统存在安全漏洞的话,就会导致这些敏感数据信息泄露,造成不必要的损失。所以我们建议使用开源系统的商业网站管理人员能够多关注应用程序官方的安全公告信息,在应用程序出现漏洞时,能够尽快获取相应信息并及时更新网站应用程序,保护网站敏感数据信息不被黑客窃取和恶意利用
- 11-15不看后悔!程序员防御XSS的无奈
- 11-10揭秘Web黑客3种注入点判断方法
- 11-10黑客Web脚本注入攻击深度剖析
- 10-21全球无线网络面临黑客攻击风险 WiFi曝安全漏洞
- 02-24iPhone再爆安全漏洞 黑客1分钟可盗照片及加密信息
- 02-22互联网金融风险 警示网站漏洞或成“致命点”
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复