Thinkphp5.0.x漏洞原理分析

本测试环境用的是php7.0.12+apache+thinkphp5.0.20

poc:http://127.0.0.1/tp5.0/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

在这里插入图片描述
首先看入口文件,引入thinkphp/start.php文件
Thinkphp5.0.x漏洞原理分析_第1张图片
跟进thinkphp/start.php,执行的是think/App.php下的run()方法
Thinkphp5.0.x漏洞原理分析_第2张图片
thinkphp5.0.x漏洞原因是对url处理有关,直接找到think/App.php中run()方法的 URL 路由检测部分
Thinkphp5.0.x漏洞原理分析_第3张图片
跟进routeCheck()函数,此函数是对路由的检测,routeCheck()函数中判断url中是否设置路由,由于本身根本就没有 路由定义返回不同的URL调度,所以他会走false
Thinkphp5.0.x漏洞原理分析_第4张图片
parseUrl()此函数用来解析变量$path(index/think\app/invokefunction),跟进函数,函数中就是对$path的处理,’/‘替换成’|’,去除左右两边空格,
Thinkphp5.0.x漏洞原理分析_第5张图片
之后parseUrl()函数会把$route($route中有 module模块,controller控制器,action方法)以数组的形式返回到routeCheck函数,然后routeCheck()函数返回给dispatch变量(在run函数中)
Thinkphp5.0.x漏洞原理分析_第6张图片
Thinkphp5.0.x漏洞原理分析_第7张图片
漏洞就处在此,并不是执行方法错误,而是并未对url进行严谨的过滤
Thinkphp5.0.x漏洞原理分析_第8张图片
上面打印出来的type是module,所以会走case ‘module’,跟进module方法
Thinkphp5.0.x漏洞原理分析_第9张图片
继续跟进module方法的返回的invokeMethod函数
在这里插入图片描述
invokeMethod函数
Thinkphp5.0.x漏洞原理分析_第10张图片
$args会获取POC中的余下的参数function=call_user_func_array&vars[0]=system&vars[1][]=whoami的值
call_user_func_array : 调用回调函数,并把一个数组参数作为回调函数的参数。
最后通过反射类IncokeArges()来执行think/app类里面的invokefunction方法

漏洞出现在,没路由的情况下,parseURL解析路由时,没有对url做严谨的过滤导致(反斜杠 think\app)
在这里插入图片描述
最终导致传入exec函数的控制器为think\app,而最后通过$reflect->invokeArgs(isset($class) ? $class : null, $args)来解析类和参数,从而导致命令执行漏洞。

你可能感兴趣的:(Thinkphp5.0.x漏洞原理分析)