禅知Pro 1.6 前台任意文件读取 | 代码审计

禅知 Pro v1.6 前台任意文件读取 | 代码审计

 

蝉知专业版是基于蝉知企业门户系统开源版开发,继承了蝉知本身的优秀功能。相对于蝉知开源版增强了商品的属性自定义、属性价格定制、物流跟踪、微信支付、微信登录、手机短信等功能。蝉知专业更加注重企业网站的营销推广。

 

文件读取漏洞好好分析下。禅知Pro 1.6.1 已经修复了这个漏洞。

首先安装,安装成功,文末分享源码。

 

接下来开始代码审计,漏洞分析。

路径:D:\wamp\www\test\chanzhiPro1.6.php5\chanzhieps\www\file.php

 

首先是初始化了一些配置,定义我们传进来的参数。

第19行,dirname() 函数返回路径中的目录部分。rtrim() 函数移除字符串右侧的空白字符或其他预定义字符。

$dataRoot 是我们可读取文件的路径

 

 

接着走到了 21--32 行,可以看到这段代码中我们可控的参数有 $objectType 和 $pathname 

$objectType 传入字符串 source 或者 slide 后,$savePath = $dataRoot  ,$dataRoot 会赋值给 $savePath

接下来跳出 if 判断语句,$realPath = $savePath . $pathname; 传入的 $savePath . $pathname 拼接给了 $realPath

再接着往下看,33--56行

判断 $realPath 是否存在,然后再经过 php 的三元运算。把 $realPath 变量再次赋值给 $filePath ;

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

接着又是一些判断,直接来看第53行。

来到 $mime 这里,进入 getMimetype() 函数

 

这个函数特别长,从125行到最后。函数定义了 http mime 头,这里没什么要分析的,接着上面的往下分析

在代码开头第14行,$objectType 变量被定义为$_GET['o'] ,

在代码开头第16行,$extension 变量被定义为$_GET['t'] ,

我们读文件的话自然以txt的格式读。

然后再接着往下走,走到了第56行。fopen() 函数打开文件或者 URL。

fopen() 函数直接读取了我们的文件路径。到这里就够了,就可以直接读取文件了。下面的57行--123行是对 $handle 和 $mime 做一些判断和操作。就不分析了。

这里我们直接构造文件读取的 payload :

http://127.0.0.1/chanzhiPro1.6.php5/chanzhieps/www/file.php?pathname=../file.php&t=txt&o=source

 

读取 system/config/config.php

http://127.0.0.1/test/chanzhiPro1.6.php5/chanzhieps/www/file.php?pathname=../../system/config/config.php&t=txt&o=source

 

数据库的账号密码在 system/config/my.php 文件里,所以读取下数据库账号密码。

http://127.0.0.1/test/chanzhiPro1.6.php5/chanzhieps/www/file.php?pathname=../../system/config/my.php&t=txt&o=source

 

至此,任意文件读取漏洞分析结束!

 

漏洞修复:

在最新版拼接路径处加入 realpath() 函数去除目录跳跃的操作

并使用 strpos() 函数判断我们传入的路径 $realPath 是否在可读取的路径 $dataRoot

 

 

源码分享(链接: https://pan.baidu.com/s/1X-9zfSZk05B0OTvJoUytKA 密码: w5tp)

本文链接(http://www.cnblogs.com/Oran9e/p/9055004.html),转载请注明!

posted on 2018-05-18 10:39  Oran9e  阅读(1641)  评论(0编辑  收藏  举报