问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
CVE-2024-36412 SuiteCRM未授权sql注入分析
漏洞分析
SuiteCRM是一个开源的客户关系管理(CRM)软件应用程序。在版本7.14.4和8.6.1之前存在未授权SQL注入漏洞,本文对CVE-2024-36412这个漏洞进行复现和分析,以及注入点的特殊性做了解释。
漏洞简介 ---- SuiteCRM是一个开源的客户关系管理(CRM)软件应用程序。在版本7.14.4和8.6.1之前存在未授权SQL注入漏洞。 漏洞复现 ---- [下载SuiteCRM 7.14.3](https://github.com/salesagility/SuiteCRM/releases/download/v7.14.3/SuiteCRM-7.14.3.zip),解压放在web目录,访问`/install.php`进行安装,配置完mysql和web管理员账号密码,点击next安装完后会自动跳转登录页面。  发送下面poc ```java GET /SuiteCRM-7.14.3/index.php?entryPoint=responseEntryPoint&event=1&delegate=<"+UNION+SELECT+SLEEP(3);--+&type=c&response=accept HTTP/1.1 Host: 192.168.1.100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15 Accept-Encoding: gzip Connection: close Cookie: XDEBUG_SESSION=XDEBUG_ECLIPSE Conent-Length: 2 ``` 成功延时3秒后返回  漏洞分析 ---- 调用堆栈 ```java MysqliManager.php:142, MysqliManager->query() MysqlManager.php:285, MysqlManager->limitQuery() DBManager.php:1659, DBManager->getOne() responseEntryPoint.php:24, require_once() SugarController.php:1017, SugarController->handleEntryPoint() SugarController.php:465, SugarController->process() SugarController.php:361, SugarController->execute() SugarApplication.php:101, SugarApplication->execute() index.php:52, {main}() ``` 在`SugarController::process`方法下断点,可以看到会遍历`$process_tasks`数组中的6个`proccess`进行处理,并通过`$_processed`判断是否处理完成。  遍历到`handleEntryPoint`,跟进对应方法,会根据传入的`entryPoint`参数从`entry_point_registry`中获取对应的php文件进行包含。  跟进包含的`modules/FP_events/responseEntryPoint.php`文件,可以看到将get请求获取到的`delegate`参数直接拼接到了sql语句并执行,这就导致了sql注入。  为什么需要<符号? ------------ 细心的同学会发现,POC中的sql语句前面有一个`<`字符,这是必须的吗?没错,是必须的 如果去掉`<`符号,用`"+UNION+SELECT+SLEEP(3);--+`这样的payload请求,并没有延时返回。  调试代码可以看到,`responseEntryPoint.php`文件中通过`$_GET`获取到的`$delegate_id`由`”`变成了`"`,被html实体编码了,这就导致无法闭合sqli语句前面的双引号,导致sql注入失败。  为什么加上`<`之后,`”`不会被html实体编码,而不加`<`,`”`却会被html实体编码? 这是由于系统的**全局xss过滤机制**在做怪! 访问`index.php`会包含`entryPoint.php`,`entryPoint.php`会调用`utils.php`的`clean_incoming_data`来清理所有的请求参数,包括xss的清理,堆栈如下 ```java utils.php:2639, securexss() utils.php:2520, array_map() utils.php:2520, clean_incoming_data() entryPoint.php:93, require_once() index.php:47, {main}() ```  在securexss方法下断点,使用`<"+UNION+SELECT+SLEEP(3);--` 请求,可以看到会通过`$xss_cleanup`这个数组来过滤xss的关键符号,经过过滤后的payload变成了`<" UNION SELECT SLEEP(3);--` ,这时`<`和`”`都被html实体编码了。  如果到这里直接返回编码后的字符串`$partialString`,sql注入将不会存在,但是这里还交给了`AntiXSS`做进一步的过滤,看下再经过`AntiXSS`过滤后的结果。  `"`又变回了`“`,这就导致了单引号逃逸。 跟进`xss_clean`方法看看怎么回事儿,主要逻辑都在`AntiXSS.php`文件,处理路由在`\\voku\\helper\\AntiXSS::_do`,调用`_decode_string`会先html解码。  走到`_sanitize_naughty_html`会通过正则匹配标签开头如`<`、标签内容、标签结尾如`>`,然后将匹配的数组传入`_close_html_callback`。  `_close_html_callback`把标签内容部分的`<`和`>` html实体编码,标签内容部分是`"+UNION+SELECT+SLEEP(3);--`,前面再拼接一个`<`  `_do`方法处理后,会比较xss处理前和处理后的字符串是否相等,如果不相等,则将`_xss_found`标记为`true`,否则为`false`  所以传入`<”` 经过`str_replace`后变成`<"` ,再经过`_do`方法会变成`<"`并返回 如果传入`”`不包含`<`,经过`str_replace`后变成`"`,再经过`_do`方法处理后`_xss_found`为`false`,即处理前和处理后字符串没变化,则保留原有的`"`返回。  这就解释了为什么传入`<”`能注入而`”`注入不了。 流量对抗 ---- 前面提到AntiXSS的`_decode_string`方法会对参数做html解码,所以可以AntiXSS对参数解码的特性对payload做一些变形,html编码+url编码`SELECT`关键字效果如下  漏洞修复 ---- 对比最新版7.14.4,在`responseEntryPoint.php`中增加了`$db->quote()`来防止sql注入  [官方7.14.4版本的更新公告](https://docs.suitecrm.com/admin/releases/7.14.x/#_7_14_4)中同时也修复了其他的漏洞,本次修复的其他sql注入漏洞利用方式跟本文分析的大同小异,就不做赘述。
发表于 2024-08-08 09:40:45
阅读 ( 4300 )
分类:
CMS
2 推荐
收藏
1 条评论
bmjoker
1秒前
学到了
请先
登录
后评论
请先
登录
后评论
xpjoker
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!