【代码审计】反序列化漏洞复现

admin 2022年6月21日00:49:17代码审计评论8 views2010字阅读6分42秒阅读模式


【代码审计】反序列化漏洞复现

声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!


一、前言

   之前看到关于thinkphp5反序列化链的分析,很多文章并没有公布payload,并且感觉有很多细节没有阐述清楚,跳跃性很大,今天站在前人的肩膀上,就探讨一下ThinkPHP的反序列化问题!这里详细分析一下5.1.37版本。

二、利用条件

有一个内容完全可控的反序列化点,例如:unserialize(可控变量)

三、环境搭建

1、直接GitHub下载所需版本。

【代码审计】反序列化漏洞复现2、更改composer.json

【代码审计】反序列化漏洞复现

3、执行命令:

composer install【在composer.json的目录】

4、代码如下

【代码审计】反序列化漏洞复现

5、页面效果如下

【代码审计】反序列化漏洞复现

四、漏洞复现

1、通过构建get参数payload,执行反序列化,最终实现代码执行【不明白为啥大佬都不公布这个payload,所以这里也打下码】

五、漏洞分析

1、首先我们进入到入口文件,构造反序列化的入口点。

【代码审计】反序列化漏洞复现

2、该框架有个非常好玩的点,file_exists函数触发类__toString方法,这个也算是漏洞的入口了。通过全局搜索file_exists,在windows.php的文件中,存在一个被动触发的点,这个点在对象销毁时会触发。

【代码审计】反序列化漏洞复现

下面这张图实现了被动触发

【代码审计】反序列化漏洞复现

3、当一个对象以字符串的形式被执行时,包含__toString魔术方法的类,便被执行,同样搜索关键词__toString,全局搜索到的 __toString 方法其实不多,这里有两处都可以利用。它们的区别在于利用 thinkCollection 构造的链要多构造一步,我们这里只分析链较短的 thinkmodelconcernConversion

【代码审计】反序列化漏洞复现

【代码审计】反序列化漏洞复现

通过代码的跳转,__toSting的最终落脚点在toArray()的方法体里。要利用的代码如下:

【代码审计】反序列化漏洞复现

分析getAttr()方法的结构体,我们可以控制$relation的值。

【代码审计】反序列化漏洞复现

跳转到getData里面

【代码审计】反序列化漏洞复现

     这里的$this->append是可以赋值的,还有$this-data【提示:这个值是在payload里面构造的】,也就是完全可控,所以这个$key也是可控,如果$key可控,也就是$relation,因为它来自$this->data[$key]【转型后的样子】,总体变成$可控类->visible(可变变量)。

    这里通过发散思维,就可以调用visible方法和__call的方法,理论实践,__call的方法可行,所以全局搜索,这里选择request.php里的魔术函数。

【代码审计】反序列化漏洞复现

    因为这里$this->hook是可控的,可以直接在payload中直接构建,在call_user_func_array()函数中,传达一个数组为[‘’类名:’方法名’]的形式,既可以调用任一类中的方法。

   在之前的漏洞中,该框架存在RCE的漏洞,这个位置在request类里的input中。里面存在一个call_user_func($filter,$data)的接入点,如果直接调用input方法,在$name = (string) $name;转换的时候就会报错,所以需要找其他的input调用点。在param    方法调用了input,如果直接调用param方法和input出现同样的错误,在接着找调用param的方法,这里有isAjax和isPjax,因为第一参数可控【固定值】如下图:

【代码审计】反序列化漏洞复现

【代码审计】反序列化漏洞复现

  通过触发这个函数,就可以顺利来到input方法中,执行下面一段代码

【代码审计】反序列化漏洞复现

  在getFilter中,通过构建payload进行$filter赋值,这里的值一般是可执行的系统函数,如system。赋值过程见下图:

【代码审计】反序列化漏洞复现

  那么上图中的$data是可以通过get传值来赋值的,它是通过param方法传值的,里面合并了get参数的值,并传递给input方法,如下图所示

【代码审计】反序列化漏洞复现

  到这里,array_walk_recursive里的参数,都可以控制了,那filterValue这个函数附张截图简单说明下,

【代码审计】反序列化漏洞复现

  其中,value的形参对应的为data的值,filters为payload中构建的system函数,那么通过修改data的值,就行执行不同的系统命令,比如文章的第一张图,传值为whoami。最后附上流程导图。

【代码审计】反序列化漏洞复现

六、漏洞修复

控制反序列化参数的值,必要时可以使用白名单的方式进行过滤控制。



E




N




D






【代码审计】反序列化漏洞复现


guān




zhù







men





Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.com 或长按二维码关注公众号:

【代码审计】反序列化漏洞复现


原文始发于微信公众号(白帽子):【代码审计】反序列化漏洞复现

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月21日00:49:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  【代码审计】反序列化漏洞复现 http://cn-sec.com/archives/1131059.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: