OpenSNS V6.2.0漏洞分析

原理分析

触发条件

首先,让我们看一下触发这个漏洞的条件。

在 Application/Weibo/Controller/ShareController.class.php 中存在 shareBox 方法,它从GET请求中获取名为 query 的参数值,对其进行解码,然后将解码后的值和相应的关联数组传递给视图模板进行渲染。

image

接下来,我们观察模板是如何渲染的,位于 Application/Weibo/View/default/Widget/share/sharebox.html 中。它调用了 W 方法,进而调用了 fetchShare 方法,将 $parse_array 的值作为参数传递给这个方法。
image

再次转到 Thinkphp/common/function.php 中查看 W 方法,它接收 $name$data 两个参数,然后将这些参数传递给 R 方法。

image

继续查看 R 方法,它根据传入的 $url 参数来远程调用指定模块的控制器操作方法,并传递相应的参数。这个函数通过解析 $url 获取操作方法名称和模块名称,创建控制器对象,调用指定的操作方法,最后返回方法的执行结果。

image

进一步深入到 /Weibo/Widget/ShareWidget.class.php,查看了 fetchShare 方法,它使用 assignFetch 处理接收的参数,并在其中调用了 D 方法来处理 getInfo()。

image

再次回到 Thinkphp/common/function.php 中查看 D 方法,它用于实例化类。

image
最后,我们检查 getInfo() 方法,它接收一个 $param 参数,当 $param 包含 'app'、'model' 和 'method' 这三个键且不为空时,调用 D 方法来实例化类。

接下来,我们将根据实例化的条件来寻找只接收一个参数的Model类

image
接收一个$param参数,当$param包含'app'、'model'和'method'这三个键,且不为空时调用D方法实例化类

接下来就得根据实例化的条件去找只接收一个参数的Model类

触发方法

接下来了解触发这个漏洞的方法。

在 /ThinkPHP/Library/Think/Model.class.php 中存在一个 _validationFieldItem 方法,当传入的 $val 可控时,call_user_func_array 方法存在一个RCE漏洞。
image

call_user_func_array(callable $callback, array $args): mixed

这个函数将第一个参数作为回调函数 callback 调用,并将参数数组 args 作为回调函数的参数传递给它。

可以利用 /Application/Common/Model/ScheduleModel.class.php 中的 runSchedule 方法来触发漏洞。要满足触发条件,'status' 必须等于1
image

总结一下条件'status'必须等于1,传入的值必须包含'app'、'model'和'method'这三个键

漏洞复现

http://opensns.vul.cn/index.php?s=weibo/Share/shareBox
&query=app=Common%26
model=Schedule%26
method=runSchedule%26
id[status]=1%26
id[method]=Schedule->_validationFieldItem%26
id[4]=function%26
[2][]=%26
id[0]=cmd%26
id[1]=assert%26
id[args]=cmd=system("calc")

image

P.S.

opensns.vul.cn是本地测试地址,非外网
参考文章

posted @ 2023-09-19 06:07  徐野子  阅读(338)  评论(0编辑  收藏  举报