标签:代码审计

CmsEasy代码审计中发现屌丝程序员的快播更新文件

3年前 (2014-08-15) | 1048 VIEWS | 0 COMMENTS

闲来无事,想好好审计一下cmseasy的代码,但是在文件搜索过程中却发现了有趣的东西——update.jpg.

1

想想update怎么会用一个jpg文件呢?下意识用文本编辑器打开,结果有意思的事情发生了

网上看看,居然是快播的更新文件,想想也正常,谁叫快播屌丝程序员排遣寂寞的利器呢?!

[原创]CmsEasy论坛处奇葩参数名SQL插入型注入

3年前 (2014-07-12) | 1392 VIEWS | 0 COMMENTS

Cmseasy,易通CMS,是一个php+mysql写的营销型企业门户网站,以前挖掘过他的N个可以XSS后台的漏洞+远程上传Getshell等,这次挖出来的更是非常奇葩的漏洞——“参数名注入”。

我这里写的参数名注入,姑且这样叫,主要是因为写代码时候将POST或者GET传递过来的参数名和参数值一起组合成SQL语句,进行SQL查询。往往程序员最关注参数值的过滤,却忽略了参数名的过滤,所以导致了奇葩插入型参数名注入。

Cmseasy-inser-sql-injection

一、漏洞概要

20148月以前版本的论坛中普遍存在此漏洞。

二、漏洞描述

CMSeasy系统论坛帖子的发布,采用了未经过滤的参数值作为SQL语句的字段名,进行插入,导致了插入型SQL注入。可以成功绕过360 webscan.php网站防护。

三、影响范围

CMSeasy 201408月之前的版本,开通了bbs功能

四、漏洞分析

1.代码分析

文件/bbs/add-archive.php中16-34行:

$archive->inserData这个成员函数,是对给定的$_POST数组进行数据库插入数据,那么,$_POST数据都有什么呢?通过添加输出与前台测试,得到$_POST是如下内容:

接下来看看inserData函数写法,有没有过滤:

/bbs/model/db/base.php  38-44行:

经过逐步追踪,发现参数名没有过滤,参数有内部过滤和360拦截机制,所以,初步测试存在SQL插入型注入。

2.实际测试:

a)添加调试代码:

首先,去除验证码干扰,输出$_POST内容——注释/bbs/add-archive.php第18行,第29行添加输出:

其次,输出SQL语句——bbs/commonlib/DB.php文件第290行添加输出:

 b)开始测试:

1) 发表正常帖子:

返回结果如下:

可以看到,我们传递过来的参数被转换成了相关的SQL语句,对于SQL插入型注入,我们肯定要找到帖子能显示的地方,注入出来敏感数据,再对敏感数据进行进一步测试。所以这里定准title和content字段。

2)拼接SQL语句,进行注入:

返回数据页面有如下内容:

根据返回结果,打开http://localhost/cmseasy/bbs/archive-display.php?aid=10

就可以看到Admin的密码md5值,其他数据也可以进行SQL查询

2

五、漏洞原因:

bbs/commonlib/DB.php文件的189-204行,对所提供的数组进行分拆,key作为SQL插入的字段,Value作为SQL插入的值;在add-archive.php调用过程中,直接使用了$_POST变量,而没有对其要使用的参数名进行过滤,导致了存在变量值的SQL插入型注入。

 六、加固办法:

更新CMSeasy版本,自己修复的话可以在DB.php的insert中对$key进行过滤(治标不治本)。

虽然我不知道CMSeasy对安全漏洞的责任心有多强,但是这样的漏洞出现了,说明CMS系统使用者对开源CMS系统自身的安全性也需要重新考量,而官方的应急响应态度和速度也是需要我们关注的。一般来说,漏洞少、响应快的CMS厂商应该是我们的首选。

七、思考:

为什么要使用POST过来的参数名作为SQL插入的key?千万不要相信任意一个用户传递过来的数据!所以cmseasy要是想对这个漏洞进行修复,最稳妥的办法是写死字段。