引子

这套CMS是上个月中做的审计,总共找到几个后台漏洞,可后台getshell,一个逻辑漏洞可任意发短信,还有一个前台注入漏洞。不过发到了某平台上之后,审核又要求我提交利用的poc,所以懒得发去了,就这里发来,刚才看了下最新版,已经修复了。版本是74cms_v3.6_20150902。

详情

逻辑漏洞

第一个逻辑漏洞是短信发送处的问题,在ajax_user.php文件中,原代码片段如下:

  1. $mobile=trim($_POST['mobile']);
  2. $sms_type=$_POST['sms_type']?$_POST['sms_type']:"reg";
  3. if (empty($mobile) || !preg_match("/^(13|15|14|17|18)\d{9}$/",$mobile))
  4. {
  5. exit("手机号错误");
  6. }
  7. $rand=mt_rand(100000, 999999);
  8. switch ($sms_type) {
  9. case 'reg': $sms_str="您正在注册{$_CFG['site_name']}的会员,手机验证码为:{$rand},此验证码有效期为10分钟"; break;
  10. case 'getpass': $sms_str="您正在找回{$_CFG['site_name']}的会员密码,手机验证码为:{$rand},此验证码有效期为10分钟"; break;
  11. }
  12. if($_SESSION['verify_mobile']==$mobile && time()<$_SESSION['send_time']+180)
  13. {
  14. exit("180秒内仅能获取一次短信验证码,请稍后重试");
  15. }
  16. else {
  17. $r=send_sms($mobile,$sms_str);
  18. }
  19. if ($r=="success"){
  20. $_SESSION['mobile_rand']=substr(md5($rand), 8,16); $_SESSION['send_time']=time(); $_SESSION['verify_mobile']=$mobile; exit("success");
  21. }
  22. else { exit("SMS配置出错,请联系网站管理员"); }

可以看出,这里每次会把这次输入的手机号和session中记录的手机号做验证,如果相同并且时间间隔不够3分钟,那么就会报错,但是这里有一个问题,就是每次输入了手机号后如果成功发送了短信,那么就会覆盖掉session中的手机号,所以我们只需要轮询两个正常的手机号即可越过限制。目前版本已经修复,修复方法也很简单,就是先做一个时间验证即可,不管输入的手机号是多少,发短信的时间间隔不可少于60s,很聪明的fix。

后台还有一个任意文件删除的问题,文件是admin/admin_article.php,这里会删除掉$_GET来的img指向的文件,代码片段如下:

  1. $id=intval($_GET['id']);
  2. $img=$_GET['img'];
  3. $img=str_replace("../","***",$img);
  4. $sql="update ".table('article')." set Small_img='' where id=".$id." LIMIT 1";
  5. $db->query($sql);
  6. @unlink($upfiles_dir.$img);
  7. @unlink($thumb_dir.$img);

看到这里过滤了../,然而在windows下使用..\也是可以的,所以可以任意删除文件。

后台GetShell

后台GetShell的方法不少,这里算是其中一个,而且估计不会在短期内修补,因为算是一个正常的系统功能。

这个GetShell的方法很简单,就是先通过普通会员的头像文件上传,传上来有要执行的代码的图片,后台在包含进来即可。

思路就是这样,那么前台头像上传必须要没有验证上传的文件内容,看代码:

  1. $savePath = "../../data/avatar/100/"; //图片存储路径
  2. $savePathThumb = "../../data/avatar/48/"; //图片存储路径
  3. $savePicName = time();//图片存储名称
  4. $file_src = $savePath.$savePicName."_src.jpg";
  5. $filename150 = $savePath.$savePicName.".jpg";
  6. $filename50 = $savePathThumb.$savePicName.".jpg";
  7. $src=base64_decode($_POST['pic']);
  8. $pic1=base64_decode($_POST['pic1']);
  9. $pic2=base64_decode($_POST['pic2']);
  10. if($src) {
  11. file_put_contents($file_src,$src);
  12. }
  13. file_put_contents($filename150,$pic1);

这里直接fileput_contents了,不过可惜没办法控制文件名,一般来说这里就没啥用了,不过后台的一个任意文件包含就可以用上了。

代码如下:

  1. if (!empty($crons))
  2. {
  3. if (!file_exists(QISHI_ROOT_PATH."include/crons/".$crons['filename']))
  4. {
  5. adminmsg("任务文件 {$crons['filename']} 不存在!",0);
  6. }
  7. require_once(QISHI_ROOT_PATH."include/crons/".$crons['filename']);
  8. adminmsg("执行成功!",2);
  9. }

这个文件是在后台的计划任务管理那里,具体名字我也忘了……但是这个部分的目的是为了帮助管理员执行一些简单的任务,比如统计站点访问的情况或者其他的自定义代码,而这里的问题就是为了方便的做到统计的目的,这套cms在common.inc.php(具体名字忘了)里include了执行计划的代码,也就是说,只要后台添加了一个计划任务,前台即可执行。验证方法也很简单,这里大家可以做一个phpinfo的文件添加到计划任务,再访问下主页即可看见主页上用户登录处出现了phpinfo的结果。

由于这个计划任务的功能是系统功能的一部分,估计不会做啥修复,不过前台头像上传可能做一些修改,但是也不怕,这里其实还有一个问题。就是CSRF,虽然他有一个防CSRF的功能,但是他在后台竟然有个可以关闭CSRF的开关,那么出于方便或者啥的原因,如果管理员关闭了CSRF,那么只要管理员看见了一个精心构造的图片即可getshell(不过这可能性很低)。

SQL注入漏洞

这里只找到了一个前台注入漏洞,不过当时通过了官方DEMO站的验证。

文件位置: ajax_user.php,当act为get_pass_check时,出现了注入,代码如下:

  1. require_once(QISHI_ROOT_PATH.'include/fun_user.php');
  2. $username=$_POST['username']?trim($_POST['username']):exit("false");
  3. if (preg_match("/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/",$username))
  4. {
  5. $usinfo=get_user_inemail($username);
  6. }
  7. elseif (preg_match("/^(13|14|15|18|17)\d{9}$/",$username)) {
  8. $usinfo=get_user_inmobile($username);
  9. }
  10. else
  11. {
  12. $usinfo=get_user_inusername($username);
  13. }

这里没有对$username做过滤,不过全局有addslash,但是这里可以宽字节注入,那么就可以注入了。DEMO站示意图:

正常请求:



这里反回了false,因为不存在这个用户,那么换个payload:

  1. sunrain%df%27%20or%20%df%271%df%27=%df%271

这句话就是简单地or 1=1,如果可以注入,那么应该是返回true的:



当然,这里也是可以出数据的,当时本机测试了,但是没截图。

后台注入还是不少,这里列出两个:

第一处: admin_category.php文件,当act是edit_color_save时,直接执行了如下语句:

  1. $info=get_color_one($_POST['id']);

跟入函数:

  1. function get_color_one($id) {
  2. global $db;
  3. $sql = "select * from ".table('color')." WHERE id=".$id."";
  4. return $db->getone($sql);
  5. }

发现这里没有引号,所以可以注入:



第二处: 在admin_baiduxml.php文件中,当act是setsave时,执行了如下语句:

  1. foreach($_POST as $k => $v) {
  2. !$db->query("UPDATE ".table('baiduxml')." SET value='{$v}' WHERE name='{$k}'")?adminmsg('保存失败', 1):"";
  3. }

所以注入就很明显了:

74CMS漏洞打包(从老博客转)的更多相关文章

  1. 试做Chrome插件——whatweb的chrome插件(从老博客转)

    引子 最近一个月每天早上在学Javascript,刚学完基础语法和一点点jQuery,今天忍不住写个Chrome玩玩看看自己对JavaScript的掌握怎么样了. 目标 考虑了一下,打算做个小东西,但 ...

  2. 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

    本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超 ...

  3. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

  4. 老贼博客php教程从零学习PHP开始写作,顺祝新同事快乐!

    随笔是不是这样写的,好似是吧! 老贼博客php教程从零学习PHP开始写作,顺祝新同事快乐! 谢谢支持,点赞!

  5. linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客

    linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客 linux下动态连接变为静态打包,使用statifier (2013-04-27 14:38:19) 转载▼

  6. 转载请注明:Windows 系统必备好用软件&工具合集跟推荐 | 老D博客

    Windows 系统必备好用软件&工具合集跟推荐 97 63,371 A+ 所属分类:工具软件 一.浏览器 二.下载软件 三.播放软件 五.电子邮件客户端 六.图片/照片 浏览查看工具 七.文 ...

  7. bugku秋名山老司机+写博客的第一天

    bugku之秋名山老司机 题目连接:http://123.206.87.240:8002/qiumingshan/ 一点进去是这样的 请在两秒内计算这个式子...怎么可能算的出来 查看源码,无果.. ...

  8. 用hugo建博客的记录 · 老张不服老

    前后累计折腾近6个小时,总算把搭建hugo静态博客的整个过程搞清楚了.为什么用了这么久?主要还是想偷懒,不喜欢读英文说明.那就用中文记录一下过程吧.还是中文顺眼啊. 某日发现自己有展示些东西给外网的需 ...

  9. 老猿Python博客文章目录索引

    本目录提供老猿Python所有相关博文的一级目录汇总,带星号的为收费专栏: 一.专栏列表 本部分为老猿所有专栏的列表,每个专栏都有该专栏置顶的博文目录: 专栏:Python基础教程目录 专栏:* 使用 ...

随机推荐

  1. NX二次开发-UFUN设置除工作层之外的所有图层的状态UF_LAYER_set_all_but_work

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...

  2. 牛客多校第十场 D Han Xin and His Troops 中国剩余定理

    题意: 韩信有若干个兵,给定你若干个模数和余数,再给你一个1e18以内的范围限制,求解同余方程组,如果无解,输出“他一定在撒谎”,如果最小解超出范围限制,输出“他可能在撒谎”,否则输出最小解 注意:不 ...

  3. CVE-2017-3248简单复现

    我是这样操作的 目标跟windows在一个段,linux是另一个段的,我的虚拟机 windows主机上 `java -cp ysoserial.jar ysoserial.exploit.JRMPLi ...

  4. ajax 接收json数据的进一步了解

    var url = "../searchclasses"; $.ajax({ url: url, type: "post", dataType: "j ...

  5. SpringAOP中的注解配置

    使用注解实现SpringAOP的功能: 例子: //表示这是被注入Spring容器中的 @Component //表示这是个切面类 @Aspect public class AnnotationHan ...

  6. spring boot thymeleaf简单示例

    说实话,用起来很难受,但是人家官方推荐,咱得学 如果打成jar,这个就合适了,jsp需要容器支持 引入依赖 <dependency> <groupId>org.springfr ...

  7. [USACO11OPEN]玉米田迷宫Corn Maze

    题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn m ...

  8. 流计算与Hadoop

  9. .Net Core JWT Bearer 的认证

    关于JWT原理在这不多说,主要由三部分组成:Header.Payload.Signature,有兴趣自己上网了解. 1.首先创建.Net Core 一个Api项目 2.添加 JWT 配置 2.1 修改 ...

  10. vba增删改查数据库

    你在EXCEL中增加一个列名为ID,后在VBA中写以下代码,并引用Microsoft ActiveX Data Objects 2.8后执行Public Sub 写入SQL2008()Dim cnn ...