php变量跟踪,PHP漏洞跟踪报告

阅读:

2,561

由于SugarCRM 6.5.18系统没有对提交的url参数进行过滤,攻击者可以提价一个构造好的url参数,从而将恶意代码写入网站目录中的配置文件中去,配置文件进一步被其他文件包含,导致恶意代码被触发。

97e93ae5dcc94f7f0efc568e756ba5de.png

修补情况

SugarCRM新版本中被修复。

参考资料

http://seclists.org/fulldisclosure/2016/Jun/51

技术细节

现在已知的POC如下图所示:

执行POC,我们可以看到这样的结果

776ce81e3789b494e77fb94e83f19cd3.png

执行POC,我们可以看到这样的结果

67e218599f0897bcf60f2e449573810c.png

下面我们就要通过poc去分析漏洞的形成原因。

找到文件\modules\Connectors\controller.php

ee3302bebd68974836f244426ce5936b.png$source = SourceFactory::getSource($source_id); 这里动态调用了函数getSource()

我们来看看getSource()函数

ed1aac3a3506aa659930e615c16eac3d.png

getSource()函数在这里包含了\include\connectors\sources\default\source.php

我们回头继续看controller.php

50bafe6564fda9be280973e5aeb7e74c.png

这里用了个foreach进行遍历,将$REQUEST提交上来的键名赋值给$name变量、键值赋值给$value变量,然后在判断键名中是否有符合正则表达式”/^{$source_id}(.*?)$/”的匹配内容,并且将匹配值赋值给$matches变量。

我们来看一下poc提交的所有参数module=Connectors&action=RunTest&source_id=ext_rest_insideview&ext_rest_insideview_[%27.phpinfo().%27]=1

这里参数&source_id值为ext_rest_insideview

经过匹配,最后的结果为:

$properties[“[%27.phpinfo().%27]”] = “1”;

接下来看下一条语句$source->setProperties($properties);

Set Properties()函数在\include\connectors\sources\default\source.php文件中

3b19c0edf929358576dbb6ade986bc8f.png这里把$properties数组赋给$this->_config['properties'],这里相当于生成了一个二维数组。

并且$this->_config['encrypt_properties'] =true

然后再看下一行代码$source->saveConfig();

saveConfig()函数同样也在在\include\connectors\sources\default\source.php文件中:

20d58e17925fbfa25446f7a8b671b385.png

我们看一下红框里的代码:这里调用了override_value_to_string_recursive2()函数进行拼接字符串,接下来我们看一下override_value_to_string_recursive2()函数。

override_value_to_string_recursive2()函数位于/include/utils/array_utils.php文件中

d478055c94e3892a0349c0e77cefd79b.png

经过函数处理,最后输出的值应该为$config[‘properties’][”][”.phpinfo().”] = ‘1’;

然后被写入custom/modules/Connectors/connectors/sources/{$dir}/config.php文件中去。

整体流程下来,我们大概了解了poc的构造原理,也明白了漏洞触发的原因,那么我们再看一下poc

b962a2b78f9296b2adca1e58ff9f84ec.png

这里面的source_id的值即“ext_rest_insideview”字符串貌似没有什么作用啊,看起来只是让source_id的值的后面的变量名前半部分一样就好了。我尝试替换下试试。

009f817d7e2454d95f845d82ab9e0b8c.png

但是不能触发漏洞,结果如下图

ed2bcfd121af4ee65d869ae7b5a45547.png

发现SourceFactory.php的61行出现错误,我们看一下getSource()中的内容:

05e4d678706731cdcf5f42acbd18237d.png

看来是load函数出现问题了,load()函数位于include/connectors/ConnectorFactory.php中

363bdda60c0f9f7c7d5fce99a52df14e.png

可见load()函数调用了loadclass()函数,根据报出的错误猜测是loadclass()函数没有包含到相应的文件。

我们看一下三条if语句中要包含的文件:custom/modules/Connectors/connectors/{$type}/{$dir}/$file

modules/Connectors/connectors/{$type}/{$dir}/$file

connectors/{$type}/{$dir}/$file

在这里,$type参数是固定的,即是SourceFactory.php传入的’sources’

6e348deec2211df89621bc5cc9e560ef.png

$dir参数就是用get传入的source_id拼接的,例如source_id = “a_b_c”, $dir = “a/b/c”

$file参数要是$dir最后一个目录的值加上”.php”,如前面那个例子,这里的即$file = ”c.php”

所以我们要找到一个存在的文件满足如下一个条件,就可以触发漏洞:1、custom/modules/Connectors/connectors/sources/a/b/c/c.php

2、modules/Connectors/connectors/sources/a/b/c/c.php

3、connectors/sources/a/b/c/c.php

这里a、b、c可以是任意字符串

我们这里找了一处付符合条件的举例说明:

9eab579f1be6c020d7147ef8c7b4b438.png

漏洞检测

如果对目标网站服务器中的url申请中含有poc中所示的请求,就有极大的可能是攻击行为。

如果您需要了解更多内容,可以

加入QQ群:570982169、486207500

直接询问:010-68438880-8669

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值