问答
发起
提问
文章
攻防
活动
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安装完后会自动跳转登录页面。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-565095134a9e283f7631bbeca918edddae75dcc4.png) 发送下面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秒后返回 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-ca7a3d19465f34b7da5bc92a1353e96e0ac904cf.png) 漏洞分析 ---- 调用堆栈 ```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`判断是否处理完成。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-4feb53ff2508c6d56ec89aa7c3a269a0c4850745.png) 遍历到`handleEntryPoint`,跟进对应方法,会根据传入的`entryPoint`参数从`entry_point_registry`中获取对应的php文件进行包含。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-baa20ced21809f0de225695d6a9c7aaab095f874.png) 跟进包含的`modules/FP_events/responseEntryPoint.php`文件,可以看到将get请求获取到的`delegate`参数直接拼接到了sql语句并执行,这就导致了sql注入。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-7980f896bc46c41c01ddbf627f35e4af39078c18.png) 为什么需要<符号? ------------ 细心的同学会发现,POC中的sql语句前面有一个`<`字符,这是必须的吗?没错,是必须的 如果去掉`<`符号,用`"+UNION+SELECT+SLEEP(3);--+`这样的payload请求,并没有延时返回。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-661fe13de4f1ee3dad8c8e15fe11404c89a1f829.png) 调试代码可以看到,`responseEntryPoint.php`文件中通过`$_GET`获取到的`$delegate_id`由`”`变成了`"`,被html实体编码了,这就导致无法闭合sqli语句前面的双引号,导致sql注入失败。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-aced61026d1ee8548c761cde70af947199c28b46.png) 为什么加上`<`之后,`”`不会被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}() ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-9dfc9f8b3bdc0d26551ac961b596b8de034a6897.png) 在securexss方法下断点,使用`<"+UNION+SELECT+SLEEP(3);--` 请求,可以看到会通过`$xss_cleanup`这个数组来过滤xss的关键符号,经过过滤后的payload变成了`<" UNION SELECT SLEEP(3);--` ,这时`<`和`”`都被html实体编码了。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-47eba8ebde909f261677822be938777d05e2caff.png) 如果到这里直接返回编码后的字符串`$partialString`,sql注入将不会存在,但是这里还交给了`AntiXSS`做进一步的过滤,看下再经过`AntiXSS`过滤后的结果。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-00d44572d68432456273f1eaa0644f8b5e5282aa.png) `"`又变回了`“`,这就导致了单引号逃逸。 跟进`xss_clean`方法看看怎么回事儿,主要逻辑都在`AntiXSS.php`文件,处理路由在`\\voku\\helper\\AntiXSS::_do`,调用`_decode_string`会先html解码。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-91d696dcc42cf13dc5812a953bb52926cd655056.png) 走到`_sanitize_naughty_html`会通过正则匹配标签开头如`<`、标签内容、标签结尾如`>`,然后将匹配的数组传入`_close_html_callback`。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-fc3f6f6743acdd2a83ac5c070afe2727e6c51880.png) `_close_html_callback`把标签内容部分的`<`和`>` html实体编码,标签内容部分是`"+UNION+SELECT+SLEEP(3);--`,前面再拼接一个`<` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-9619001285b9ac4982c0ac0cb9157ed82d7277be.png) `_do`方法处理后,会比较xss处理前和处理后的字符串是否相等,如果不相等,则将`_xss_found`标记为`true`,否则为`false` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-965ba21f1be4d6c5b2ccd5bf6f1cc0b270ff93fa.png) 所以传入`<”` 经过`str_replace`后变成`<"` ,再经过`_do`方法会变成`<"`并返回 如果传入`”`不包含`<`,经过`str_replace`后变成`"`,再经过`_do`方法处理后`_xss_found`为`false`,即处理前和处理后字符串没变化,则保留原有的`"`返回。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-f7ae241463196401b2e5e8639a582a7e38dcfb5e.png) 这就解释了为什么传入`<”`能注入而`”`注入不了。 流量对抗 ---- 前面提到AntiXSS的`_decode_string`方法会对参数做html解码,所以可以AntiXSS对参数解码的特性对payload做一些变形,html编码+url编码`SELECT`关键字效果如下 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-f8aa64154b46a2bffaa449835a9523077772663e.png) 漏洞修复 ---- 对比最新版7.14.4,在`responseEntryPoint.php`中增加了`$db->quote()`来防止sql注入 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-b1c96292fada82563b01c2887a24c38df80c57fc.png) [官方7.14.4版本的更新公告](https://docs.suitecrm.com/admin/releases/7.14.x/#_7_14_4)中同时也修复了其他的漏洞,本次修复的其他sql注入漏洞利用方式跟本文分析的大同小异,就不做赘述。
发表于 2024-08-08 09:40:45
阅读 ( 3572 )
分类:
CMS
2 推荐
收藏
1 条评论
bmjoker
1秒前
学到了
请先
登录
后评论
请先
登录
后评论
xpjoker
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!