xiaocms代码审计【通过】

0x01 前言

希望能够加入 90sec 论坛,望师傅们给个机会。

0x02 分析

想找点小型的 cms 审计一下练练手,谷歌一搜,跳出来一个 xiaocms ,就决定是你了~,大佬都分析过了,自己再完整的分析一遍。

这套 cms 最新版发布时间是14年,应该是停止更新了。

MVC 架构,看官网介绍还是用了 PDO 预编译... 注入基本是没戏了

从系统入口开始, include xiaocms.php , xiaocms.php 定义了一些全局变量,路由解析规则,控制器加载规则等东西。没有 ac 参数时默认访问 index 方法。对控制器访问做了一定的限制,过滤了斜杠/。

作者重写了 getpost 方法,对传入的参数使用 htmlspecialchars 过滤了 <>" 等。

获取 ip 的函数也做了限制,哇难受的一批

太菜了,转战后台。

0x03 正文

假设进入了后台,就要考虑怎么 getshell ,最平常的思路就是文件上传。看一下这套 cms 的上传逻辑。

upload.class.php

跟进函数

看一下 $limit_type 是个啥,跟进去发现是个变量... 不应该哇,再一看,通过 set_limit_type 函数设置白名单,这...

全局搜索一下 upload 函数,看看调用情况。找来找去都在 admin/uploadfile.php 中。

通读该文件,各种上传方式实现,编辑器上传,直接上传等。

在编辑器上传和 uploadify_upload 两处调用了 upload 函数,只有后者才能控制 type

后边的判断是加水印的,无关痛痒。

本地构造一个表单手动上传。

后台也有模板管理的功能,一开始看后缀都是 html 就没多想,后来看其他师傅的分析才明白过来..模板也是要被包含进 php 文件的, 太菜了(⸝⸝⸝ᵒ̴̶̥́ ⌑ ᵒ̴̶̣̥̀⸝⸝⸝)

所以可以后台编辑模板,写入 phpinfo ,就能执行。分析一下原因

后台编辑模板 urlhttp://127.0.0.1/xiaocms/admin/index.php?c=template&a=edit&dir=&file=index.html

template.php 中的 editAction 方法

判断 file 的后缀是否合法,然后使用 file_put_contentsfile_content 的值写入文件,注意一下,本来 post 方法使用了 htmlspecialchars 函数进行过滤,此处又进行了解码,所以写入的还是原来传入的内容。

此时 php 代码只是在 html 文件中,它是怎么被加载的呢?

继续往下走,假设我们修改了 index.html 模板文件,访问 index.php 时会触发 php 代码,跟进 indexAction 函数,不传入任何参数默认执行 index 方法。

问题应该是出在 display 函数,跟进去看一下

view.class.php 34行

首先获取 html 文件的内容,然后获取缓存文件,如果 html 对应的缓存文件与源 html 都存在,就调用 load_view_file 函数。

该函数调用 handle_view_filecms 规定的一些标签进行替换,但是没有足够的过滤。

最后通过 create_compile_file 函数写入缓存文件,最后包含该缓存文件,导致任意 php 代码被执行。

0x04 插曲

因为这套 cms 早就停止更新了,官网推荐使用另一个 cms ,顺便瞅了瞅,应该是在 xiaocms 的基础上开发的,安全做的可以,传入的参数使用 PDO 预编译,对上传文件的 type 和后缀都做了严格的白名单限制,前台功能点太少,无望,但是后台某些地方还是有相同问题的,比如说模板文件 getshell ,触发点还是相同的,还是上边分析的文件包含,感兴趣的师傅可以分析一下。

修复的话,要加强对模板文件内容的过滤,防止恶意 php 代码写入到缓存文件中。

  • 通过
  • 未通过

0 投票者