0x01 前言
希望能够加入 90sec
论坛,望师傅们给个机会。
0x02 分析
想找点小型的 cms
审计一下练练手,谷歌一搜,跳出来一个 xiaocms
,就决定是你了~,大佬都分析过了,自己再完整的分析一遍。
这套 cms
最新版发布时间是14年,应该是停止更新了。
MVC
架构,看官网介绍还是用了 PDO
预编译... 注入基本是没戏了
从系统入口开始, include xiaocms.php
, xiaocms.php
定义了一些全局变量,路由解析规则,控制器加载规则等东西。没有 a
和 c
参数时默认访问 index
方法。对控制器访问做了一定的限制,过滤了斜杠/。
作者重写了 get
和 post
方法,对传入的参数使用 htmlspecialchars
过滤了 <>"
等。
获取 ip
的函数也做了限制,哇难受的一批
太菜了,转战后台。
0x03 正文
假设进入了后台,就要考虑怎么 getshell
,最平常的思路就是文件上传。看一下这套 cms
的上传逻辑。
upload.class.php
中
跟进函数
看一下 $limit_type
是个啥,跟进去发现是个变量... 不应该哇,再一看,通过 set_limit_type
函数设置白名单,这...
全局搜索一下 upload
函数,看看调用情况。找来找去都在 admin/uploadfile.php
中。
通读该文件,各种上传方式实现,编辑器上传,直接上传等。
在编辑器上传和 uploadify_upload
两处调用了 upload
函数,只有后者才能控制 type
。
后边的判断是加水印的,无关痛痒。
本地构造一个表单手动上传。
后台也有模板管理的功能,一开始看后缀都是 html
就没多想,后来看其他师傅的分析才明白过来..模板也是要被包含进 php
文件的, 太菜了(⸝⸝⸝ᵒ̴̶̥́ ⌑ ᵒ̴̶̣̥̀⸝⸝⸝)
所以可以后台编辑模板,写入 phpinfo
,就能执行。分析一下原因
后台编辑模板 url
为 http://127.0.0.1/xiaocms/admin/index.php?c=template&a=edit&dir=&file=index.html
template.php
中的 editAction
方法
判断 file
的后缀是否合法,然后使用 file_put_contents
把 file_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_file
对 cms
规定的一些标签进行替换,但是没有足够的过滤。
最后通过 create_compile_file
函数写入缓存文件,最后包含该缓存文件,导致任意 php
代码被执行。
0x04 插曲
因为这套 cms
早就停止更新了,官网推荐使用另一个 cms
,顺便瞅了瞅,应该是在 xiaocms
的基础上开发的,安全做的可以,传入的参数使用 PDO
预编译,对上传文件的 type
和后缀都做了严格的白名单限制,前台功能点太少,无望,但是后台某些地方还是有相同问题的,比如说模板文件 getshell
,触发点还是相同的,还是上边分析的文件包含,感兴趣的师傅可以分析一下。
修复的话,要加强对模板文件内容的过滤,防止恶意 php
代码写入到缓存文件中。
- 通过
- 未通过
0 投票者