首页 代码审计

1. 准备

下载地址:opensns V6.2.0

2. 审计

入口点在Application/Weibo/Controller/ShareController.class.php
63479-exkb1ccl3i4.png
这个控制器的shareBox方法获取query,然后url解码,再将参数的值按照解析到数组中,然后用assign将其解析成模板变量,最后模板输出display,T方法用于获取模版文件,跟进下他获取的模板文件Application/Weibo/View/default/Widget/share/sharebox.html
76318-3t1hja7hi3y.png
这里用到了W方法,传入参数就是前面解析的parse_array,W方法位于ThinkPHP/Common/functions.php第1174行左右,用于渲染输出Widget
39577-ktbklug2ejj.png
这里又调用了R方法,继续跟进R,R方法是ThinkPHP的用于远程调用控制器
89882-st1ubfkbt9.png
传入参数$layer为Widget,那这里就回到sharebox.html调用W方法那里,Weibo/Share/fetchShare跟进此控制器对应的位置
Application/Weibo/Widget/ShareWidget.class.php大概29行的位置
在fetchShare方法里又调用了assginFetch方法,然后里面又调用了D方法
53574-dvgr95im6aa.png
跟进D方法得知其用于实例化模型类
31958-haequi9mtnv.png
这里D方法传参为Weibo/Share,那么实例化的模型类位置为Application/Weibo/Model/ShareModel.class.php,并调用了其下的getInfo方法,传入到这里就可控了。
99970-kalrwiho34.png

这里下构造下参数query=app=aaa%26model=bbb%26method=ccc%26id=ddd
下断点可看到参数值一直跟到这里了
83121-v1kdd0u8jn.png

这里实例化的模型类是可控的,但是有两个限制:

  1. Model类
  2. 存在一个传入参数的方法
    这里参考moonv师傅找到的ThinkPHP/Library/Think/Model.class.php下的_validationFieldItem

04918-v5na9uk9z9l.png
具体调用点在Application/Common/Model/ScheduleModel.class.php下的runSchedule方法
其中又调用了d方法,相当于将上面的一个入参的限制条件扩大到了两个入参
84445-2w7wztcj90l.png
这里根据参数构造完整payload:weibo/share/shareBox?query=app=Common%26model=Schedule%26method=runSchedule%26id[status]=1%26id[method]=Schedule->_validationFieldItem%26id[4]=function%26id[0]=cmd%26id[1]=assert%26id[args]=cmd=phpinfo()
ScheduleModel继承Model类,所以直接可以用Schedule->_validationFieldItem
66259-gflrz8wkvyg.png


参考:某CMS代码执行漏洞分析



文章评论

目录