OpenSNS V6.2.0漏洞分析
原理分析
触发条件
首先,让我们看一下触发这个漏洞的条件。
在 Application/Weibo/Controller/ShareController.class.php 中存在 shareBox 方法,它从GET请求中获取名为 query
的参数值,对其进行解码,然后将解码后的值和相应的关联数组传递给视图模板进行渲染。
接下来,我们观察模板是如何渲染的,位于 Application/Weibo/View/default/Widget/share/sharebox.html 中。它调用了 W 方法,进而调用了 fetchShare 方法,将 $parse_array 的值作为参数传递给这个方法。
再次转到 Thinkphp/common/function.php 中查看 W 方法,它接收 $name
和 $data
两个参数,然后将这些参数传递给 R 方法。
继续查看 R 方法,它根据传入的 $url
参数来远程调用指定模块的控制器操作方法,并传递相应的参数。这个函数通过解析 $url
获取操作方法名称和模块名称,创建控制器对象,调用指定的操作方法,最后返回方法的执行结果。
进一步深入到 /Weibo/Widget/ShareWidget.class.php,查看了 fetchShare 方法,它使用 assignFetch 处理接收的参数,并在其中调用了 D 方法来处理 getInfo()。
再次回到 Thinkphp/common/function.php 中查看 D 方法,它用于实例化类。
最后,我们检查 getInfo() 方法,它接收一个 $param
参数,当 $param
包含 'app'、'model' 和 'method' 这三个键且不为空时,调用 D 方法来实例化类。
接下来,我们将根据实例化的条件来寻找只接收一个参数的Model类。
接收一个$param
参数,当$param
包含'app'、'model'和'method'这三个键,且不为空时调用D方法实例化类
接下来就得根据实例化的条件去找只接收一个参数的Model类
触发方法
接下来了解触发这个漏洞的方法。
在 /ThinkPHP/Library/Think/Model.class.php 中存在一个 _validationFieldItem 方法,当传入的 $val 可控时,call_user_func_array 方法存在一个RCE漏洞。
call_user_func_array(callable $callback, array $args): mixed
这个函数将第一个参数作为回调函数 callback 调用,并将参数数组 args 作为回调函数的参数传递给它。
可以利用 /Application/Common/Model/ScheduleModel.class.php 中的 runSchedule 方法来触发漏洞。要满足触发条件,'status' 必须等于1
总结一下条件'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")
P.S.
opensns.vul.cn是本地测试地址,非外网
参考文章