finecmsV5.0.8写文件漏洞分析

finecms任意文件写入从漏洞分析到exp编写到对接FOFA 批量检测

没有phpstorm,用notepad直接调试吧。

哈哈哈~

代码审计还是phpstorm看着比较舒服,而且IDE可以调试~

面对一个陌生的cms,首先就要了解他的大致程序架构。有phpstorm的话可以导入项目,如果是其他的文本编辑器可以用tree命令看下大致的目录接口,增强自己对程序功能的理解。

好了,不多提了。这里我们步入正题~

finecms/dayrui/controllers/Api.php data2 我的测试版本是V5.0.8

这个应该是和用户管理功能相关的函数。

漏洞出现在正则获取的地方没有对文件后缀严格判断,导致了image后面的值可控。这个是更新头像的功能~

我们来看看怎么形成的。

$uid = (int)$_REQUEST['uid']; $file = $_REQUEST['file'];

定位$file,从外部的REQUEST请求获取。

传递到preg_match的时候用正则去取$file传进来的值,没有过滤。那么我们构造的参数不是像正常用户那样传递图片类型呢?

正常用户:

file=data:image/jpeg;base64,PD9waHAgcGhwaW5mbygpOz8+

黑客:

file=data:image/php;base64,PD9waHAgcGhwaW5mbygpOz8+

那么我们构造文件名和注入恶意的php代码之后要怎么找到它上传后的路径呢?

看这里:

这里的uid应该是用户的id号,也是用的REQUEST请求接收。

同样可控,那么我们可以传递uid=1传入。那么这时候的dir为member/1/

文件名固定为:0x0.php

SYS_UPLOAD_PATH我们可以向上翻,看它继承于哪个类。这里它集成于M_Controller,我们查找这个文件就可以获知SYS_UPLOAD_PATH的值为:

还有一种土办法,就是用sublime text搜索

那么我们获得到上传文件的路径为:uploadfile/member/1/0x0.php

这时候的payload为:

uid=1&file=data:image/php;base64,PD9waHAgcGhwaW5mbygpOz8+

这只是局部的payload,还需要部分的鉴权。

我们从这个函数的开始的地方(115行)看起。

129行这里判断$data数组不为空

接下来我们得要绕过SYSKEY认证才能进入更新头像的函数

SYSKEY哪儿来了呢?看这段代码

从http头里面找~~

只要访问首页就能获取了,所以这里的鉴权形同虚设。

这里我们构造payload:

index.php?c=api&m=data2&auth=50ce0d2401ce4802751739552c8e4467&param=update_avatar

即使用api.php下的data2方法,auth传递的参数为SYSKEY的值,然后传递update_avatar更新头像。

我们得到最终的payload为:

不同的版本返回不同但是测试了<=V5.0.8版本基本成功。

可能返回如下:

或者:

每次 获取SYSKEY又是很麻烦,分析了一下,很多站长对没有改安全码的,所以安全码基本都是固定的。

V5.0.11以下版本常见的SYSKEY值为:

820686a208b89d4c2f8b6f2622eff83e

202cb962ac59075b964b07152d234b70

50ce0d2401ce4802751739552c8e4467等。以上的是经过hash过的。

未hash过的SYSKEY在config目录的system.php文件里。

刚开始我从system.php文件里直接取出来用,结果就失败了。

后面发现原来SYSKEY的加密方式是md5(md5($pass)),取出来还要hash一次。

如果提示安全码错误的的话就去首页获取。

根据payload用fofa客户端写PoC(懒得用python了,这个类型的PoC方便)

思路是第一次发送post请求写入文件第二次请求访问

本文分享自微信公众号 - 晨星先生(MoXuanIT)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

文件句柄与文件描述符

1.概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无...

90870
来自专栏代码世界

Cookie、Session登陆验证相关介绍和用法

一、Cookie和Session   首先、HTTP协议是无状态的;所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系...

49970
来自专栏backend技术总结

微信小程序demo开发总结

github: https://github.com/tencentyun/wafer-session-server

60640
来自专栏Python

web框架

http协议 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World ...

45360
来自专栏aoho求索

基于redis的分布式锁实现

关于分布式锁 很久之前有讲过并发编程中的锁并发编程的锁机制:synchronized和lock。在单进程的系统中,当存在多个线程可以同时改变某个变量时,就需要...

49480
来自专栏JavaEdge

视图重定向0 重定向视图 RedirectView1 向重定向目标传递数据2 重定向前缀——redirect:3 重定向前缀——forward:

39180
来自专栏Ryan Miao

sessionid如何产生?由谁产生?保存在哪里?

面试问道这个我居然不知道怎么回答,当然也是因为我确实没有研究过。下面就是百度了一篇文章后简单回答这个问题。 参考:http://www.cnblogs.com/...

64470
来自专栏Netkiller

Elasticsearch Cluster 安装与配置

本文节选自《Netkiller Database 手札》作者:netkiller 网站: http://www.netkiller.cn 23.1.2. Ela...

41050
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令五

1. vi vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。 Linux中一般默认安装的的编辑器叫vi,而vim是vi的增强版(vi...

30760
来自专栏Java帮帮-微信公众号-技术文章全总结

集群间如何实现session共享【面试+工作】

4.5K80

扫码关注云+社区

领取腾讯云代金券