您当前位置: 首页 » 代码审计 » Xercms审计小计

Xercms审计小计

2017年1月21日 | 发表评论(0) 查看评论

漏洞不是我发现的,只是重现了一遍,先发部分作者对路由的解析(序言和路由分析部分),感觉我的口才说不出来,记录下来也是为了以后多看看

0x00.序言
前台insert类型注入,是因为上传文件时对文件名没有有效过滤就进行insert操作而造成的。后台getshell虽然有些鸡助,但是感觉这个思路还是有些意思的,就跟大家分享一下QAQ~

0x01.路由分析
我们还是先来分析一下cms的路由,

Assets文件夹主要是放着一些flash,js,css,文本编辑器等。install放着安装cms的功能文件。template是模板文件夹。upfiles是上传文件夹。xercms则是整个cms的核心文件夹。xercms文件夹中modules文件夹主要存放前台文件,services主要存放后台文件
根目录下index.php 为入口文件,我们来看下入口文件,

可以看到首先包含了xercms文件夹下的kernel.php文件。然后调用该类的2个重要的静态方法,init()和load()
init()方法主要是初始化了一些配置,我们主要看的是load()方法,它是控制cms路由的核心

为了方便大家看我简化了一下代码,去掉了一些不常用的判断。我们来根据url分析一下这个方法
http://localhost/zend/xercms/?m=archives&a=column&column=2
根据代码可以看出这里面有3个重要的变量 m,s,a,e。
m,s代表模块名,a代表调用的方法(默认为xercms),e代表调用的文件名(默认为index)。
根据流程首先会先接受e的值(文件名),再判断m和s是否存在。如果都不存在则默认调用首页的模板文件。如果存在m则代表调用的是前台的某个模块,s存在则代表调用后台。注意这4个变量的值都会调用check方法进行判断,只能为字母和数组还有下划线,否则页面跳转并exit程序结束。
前台和后台的处理流程大致相同,只不过是路径有所差距。我们这里就拿前台的流程来说,先接收m的值(也就是模块名),文件夹路径则为/modules/模块名/,接收a的值(也就是方法名),根据e的值和先前的路径生成包含文件的路径和文件名并包含,确定该文件中类名,前台类名都为XerCMS_MODULE_文件名,然后判断类是否存在,声明该类的对象,判断该类中方法是否存在,存在则调用。
我们可以清楚的看到通过这4个变量就控制了整个cms的路由。根据改变4个变量的值就可以调用固定目录下的某个文件的方法,前台的固定目录为modules下,modules下有4个以模块名命名的文件夹,后台固定目录为services,也有4个以模块名命名的文件夹。

0x02.前台insert注入

这里知道了上传处有漏洞,所以我们直接定位漏洞函数所在的位置。

在/XerCMS/Library/XerCMS_upload.php中:

$rid = $this->record($_FILES[$name]);在这里直接把$_FILES带入$this->record。来看一下$this->record

可以看到$_FILES未经处理便带入了insert函数。

在insert函数中,对键名进行了DB:filter($k,’f’)的处理,对键值进行了DB:filter($v)的处理。

通过跟进filter可以发现键名要求为字母、数字、下划线。而键值只是过滤了。

在query中,如果错误将调用error方法,而error将错误输出,便形成了显错的insert型注入。

 

 

分类:

代码审计

| 标签: