如何理解Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现


这期内容当中小编将会给大家带来有关如何理解Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。记录自己学习与理解thinkphp的反序列漏洞的过程5.1.37-5.1.41(最新版本)1、composer create-project topthink/think=5.1.37 v5.1.37(5.1.37-5.1.41都可)2、github:https://github.com/top-think/th免费云主机域名ink/releaseshttps://github.com/top-think/framework/releases先添加一个反序列化的入口在applicationindexcontrollerindex.php中将input参数反序列化ThinkPHPV5.1
12载初心不改(2006-2018)-你值得信赖的PHP框架EXP:5.1.37版本复现:5.1.41版本复现首先了解下魔法函数,方便后面利用链的理解。__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。__destruct():当对象被销毁时会自动调用。__call():是在对象上下文中调用不可访问的方法时触发__callStatic():是在静态上下文中调用不可访问的方法时触发。__get():用于从不可访问的属性读取数据。__set():用于将数据写入不可访问的属性。__isset():在不可访问的属性上调用isset()或empty()触发。__unset():在不可访问的属性上使用unset()时触发。__sleep():在执行序列化函数serialize()时执行。__wakeup():在执行反序列化函数unserialize()时执行。__toString():当一个对象被当做字符串使用。invoke():脚本尝试将对象调用为函数时,调用invoke()方法。反序列化的常见起点__wakeup:一定会调用__destruct:一定会调用__toString:当一个对象被反序列化后又被当做字符串使用反序列化的常见中间跳板__toString:当一个对象被当做字符串使用__get:读取不可访问或不存在属性时被调用__set:当给不可访问或不存在属性赋值时被调用__isset:对不可访问或不存在的属性调用isset()或empty()时被调用形如 $this->$func();反序列化的常见终点:__call:调用不可访问或不存在的方法时被调用call_user_func:一般php代码执行都会选择这里call_user_func_array:一般php代码执行都会选择这里从EXP入手去分析整个利用过程,在执行EXP时动态调试观察调用了哪些魔法函数可以看到依次执行了destruct()→tostring()→call()→RCE从起点开始一步一步跟进1、在thinkphplibrarythinkprocesspipeswindows.php中的__destruct调用了removeFiles方法主要代码:这里$filename会被当做字符串处理,而下一步的toString方法在一个对象被反序列化后又被当做字符串使用时会被触发,继续跟进toString方法2、在thinkphplibrarythinkmodelconcernConversion.php中__toString中的函数执行过程为toJson→toArray主要代码:紧接着下一步调用了visible与call方法,猜测visible是一个不存在的方法,并自动调用了call;继续看toArray方法的逻辑部分主要代码:这里的$this->append是我们可控的,这意味着$relation也可控,在toArray函数中调用一个getRelation()方法和一个getAttr()方法,在下面判断了变量$relation,若!$relation,继续调用getAttr()方法, 跟进getRelation方法主要代码:可以看到getRelation()执行结果返回为空,进而执行了getAttr(),继续跟进getAttr()这里的getAttr()调用了getData()方法,所以toArray方法中的$relation的值为$this->data[$name],也就是说$relation可控;然后控制$relation为一个类对象,调用不存在的visible方法后,会自动调用call方法,这个类中没有visible方法,但存在call,跟进__call3、/thinkphp/library/think/Request.php中的__call方法的主要代码:可以看到存在了回调函数call_user_func_array,并且this->hook[$method]我们可以控制,但是这里有个 array_unshift($args, $this);会把$this放到$arg数组的第一个元素,这样构造不出来参数可用的payload,因为第一个参数是$this对象。在利用链中发现,最终RCE是利用了Requests类的过滤器filter(多数RCE都是出自此处),调试器中依次调用了isAjax(),param(),input(),跟进这些方法,观察是如何执行的4、在thinkphp/library/think/Request.php的查看各个方法的主要代码在isAjax函数中,我们可以控制$this->config[‘var_ajax’],这里调用了param方法,继续跟进这里在最后调用了input()函数,由于之前的isAjax()中$this->config[‘var_ajax’]可控,所以这里param($name)可控,跟进input()input()使用回调函数调用了filterValue(),由于param中的$name可控,所以input()中的$name可控,然后input()中又调用了filterValue(),这样的话filterValue()中的$name也就是可控的,跟进filterValue()主要代码:该方法调用了call_user_func函数,从input()中得知,filterValue()的value值可控继续查看input()的主要代码部分:这里$data=$this->getData($data, $name)$filter = $this->getFilter($filter, $default)两个关键的参数,跟进getData()代码:$name由在最开始的isAjax()中的$this->config[‘var_ajax’]来控制,最终返回$data=$data[$name]getFilter()代码:这里$filter可控,$this->filter,在EXP直接赋值即可,这样所有可控条件都达成,成功RCE总结一下:利用链:从EXP的角度下看执行过程:官方未修复上述就是小编为大家分享的如何理解Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注云编程开发博客行业资讯频道。

相关推荐: stm32可不可以跑linux

这篇文章主要介绍了stm32可不可以跑linux的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇stm32可不可以跑linux文章都会有所收获,下面我们一起来看看吧。 stm32不可以跑linux;linux系统是运行单位是进程,而…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/02 16:46
下一篇 02/02 16:46