tkcharlotte's blog

本文首发于90sec

0x01 分析

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

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

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

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

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

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

太菜了,转战后台。

0x02 正文

假设进入了后台,就要考虑怎么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代码被执行。

0x03 插曲

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

0x04 总结

审计时要白+黑,白盒+黑盒测试一起,关注一下底层的一些过滤函数以及sql处理 上传逻辑等,根据功能点进行代码分析,最重要的是有耐心吧=。= 这次看的还是不够仔细啊,后台还可以尝试配置文件写shell,但是会多一个单引号,导致代码不解析,因为存在var_export的原因,这一点在审计minicms时也遇见过。

up up!!!(ง •̀-•́)ง

 评论


载入天数...载入时分秒... | 字数统计:16.9k