PHP代码审计(行云海CMS v3.5)
前言
最近突然想搞代码审计,拿行云海3.5练练手,感觉对新手还是挺友好的,搞得我这小菜鸡信心倍增
点击下载行云海v3.5源码(仅提供下载链接,不负责文件的安全性)
rips、seay打包(我记得我设的免费的来着,不知道为什么给我变成要积分了,而且积分要得时多时少)
一、debug环境配置
虽说是环境配置,其实也就是记录一下我自己遇到的一些问题,具体的就不写了
phpstudy 可以直接开启 Xdebug 扩展,不需要自己去下载对应版本的 dll 文件,但是配置文件默认关闭了debug模式,需要将 xdebug.remote_enable 的值设为1
当时搞了半天也不知道哪里出了问题,结果一看配置文件人都傻了,总之一个字,还是太菜了
打开apache配置文件,在末尾添加 FcgidIOTimeout 360000
不然debug时间长了容易报500错误
二、准备好审计工具
1. rips
rips 将verbosity level:调为 1.仅用户污染 准确率很高,但有些扫不出来
rips最棒的地方在于可以自动回溯,看着很舒服
2. seay源代码审计系统
能扫出很多漏洞,同时误报率也就搞了
这里有个小技巧(听师傅们说的):对于MVC模式的网站,主要看后台目录下的 Controller 文件夹,可能表述不太清楚,就是下图这个地方
三、任意文件下载
- 使用rips扫到一个 File Disclosure,很清楚的说明了漏洞在 DatabaseController.class.php 文件(截图没截到)中的 downfile() 方法中,同时说明了漏洞点以及参数来源
- 在phpstorm中打开代码,找到漏洞所在位置
- 分析代码
- 首先要以 GET方式 传入 file 和 type,其中 type 必须是 ‘zip’ 或者 ‘sql’ ,否则回显 “下载地址不存在”
- $path 为一个数组,固定为(“zip” => “./Data/resource/backupdata”; “sql” => “./Data/resource/backupdata”)
- 如果 type 的值为 zip, 则 $filepath 为 ./Data/resource/backupdata/ + 传入的文件名;若为 sql,则 $filepath 为 ./Data/resource/backupdata + 传入的文件名(所以这里可能存在目录穿越)
- 如果文件存在则会去下载文件
- 其实可以直接下断点观察
访问 http://localhost/xyh35/xyhai.php?s=Database/downFile&file=…/…/…/index.php&type=zip
观察各变量变化
最后成功下载web根目录下的 文件 index.php
四、任意文件读取
seay扫到不少,我把 home 和 manage 目录下的都分析了一遍,大部分漏洞点的参数都是从数据库读取,可能能配合其他漏洞打个组合拳,但是难度就比较大了,不适合我这种萌新
分析第二十五点,双击查看源码,定位到94行,在phpstorm中找到对应代码
做一下简单分析,第63行 IS_POST 虽然不知道他怎么实现的,但是看名字可以知道是判断是否以POST的方式传入,POST方式传入过滤挺严谨的,目录穿越不能用,而且文件扩展名必须为 html。而下面 GET 方式并没有进行过滤,随便传个参数进去可以观察到 $file_path 有三层,使用 …/…/…/ 即可以跳转到web根目录
其中第85行对fname进行了一次base64解码,所以直接构造payload http://localhost/xyh35/xyhai.php?s=Templets/edit/fname/Li4vLi4vLi4vaW5kZXgucGhw
如此,通过目录穿越,可以读取到web目录下的 index.php 文件,构造类似的payload,即可以读取任意文件
五、任意文件删除
继续查看 seay 扫出的漏洞,在 TempletsController.class.php 的第134行存在任意文件删除
打开phpstorm找到对应代码,如下图所示,还是那句老话,虽然不知道 127 行怎么实现的,但是很容易理解是将传入的 fname 的值进行 base64 解码。或者 debug 看一下也很容易发现确实如此
跟前面的任意文件读取差不多,传入 payload ?s=/Templets/del/fname/Li4vLi4vLi4vMS50eHQ=
,Li4vLi4vLi4vMS50eHQ= base64解码后为 …/…/…/1.txt,可以删除根目录下的 1.txt
这个一开始我还以为是个损人不利己的洞,但是师傅说,在web根目录下的 Install 目录下有一个,install.lock
文件,删除这个文件就可以重装CMS
总结
这个CMS确实都是些挺简单的漏洞,用于入门练手的绝佳CMS,可能作者就是给我们入门用的吧,哈哈,说笑了