之前挖洞的时候看到有个网站是phpcms的,发现框架很老,再加上最近在看一本代码审计的书,我好像可以试一试,就有了这篇文章
之前审的dedecms不像这个,dede只有照着页面找就行了,但phpcms是mvc框架的,即业务模型(modules)、用户界面(view)、控制器(control),找起调用来很困难。还好这玩意偏小(压缩之后也就才将近9M的样子),加上长久没更新了,洞相对来说应该比较多(实际上是我想太多)。
审计准备
工具还是老三样,phpstorm、phpstudy、xdebug插件,访问/install/install.php即可开始安装。
主要的准备还是熟悉代码,找到各个文件夹的作用
审计方法
一般来说有两种,一是直接把整个代码捋一捋,但消耗的时间长;二是直接全局搜索危险函数,最好是借助代码审计工具,然后看着函数找有没有可控变量。
(个人喜欢直接在开始处打个断点,跟着代码跑一遍,这样能更快熟悉各个文件的作用,但非常非常费时间,而且第一次看容易看晕)
phpcms的文件功能摸清楚还是很简单的,如下:
1 | api 功能接口 |
phpcms的过滤基本都在/libs/functions/global.func.php
,网站的启动核心在/phpcms/base.php
,这里有所有的load函数,而这玩意通过三个参数来运行,m、c、a,m为模块,对应的是modules里的文件夹名(大部分情况),c为控制器,对应的是/modules/模块/
下的文件名,a为行为,对应的是/modules/模块/控制器.php
下的函数(也是大部分情况)。以最简单的后台为例:
对应的是
举个例子
拿我一次挖洞失败举例:
全局查找unlink()
函数(dedecms告诉我可能存在任意文件删除),找啊找,大多数都是参数不可控,要么就是有路径比较,绕不过去,突然,眼前一亮,有个可控的参数:
登陆后台后构造url:?m=attachment&c=manage&a=pullic_delthumbs&filepath=../../../../../../../../../../aaa.txt&pc_hash=PrraYC
(aaa.txt在该盘的最上层目录里)。来,跟着跑一跑:
发现居然没有过滤../
,内心狂喜
下一个获取ext的函数在global.func.php
下面的就是验证后缀,查看路径是否有该文件,有则删除并返回1,无则报错并返回0,关键就在如何绕过这个后缀了,尝试过二次url编码%00
然后截断失败后我就没有办法绕过了,只好作罢(二次url编码是因为有个addslashes函数)
最后,给大家伙表演一个任意图片删除 :)
当然,如果有会绕的大佬能否给我讲一讲怎么绕过的,感激不尽
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/03/29/phpcms审计/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!