Emlog_pro代码审计

web安全的本质最终还得回归到代码层面.
本专栏博客主要通过复现历史cms的漏洞,来学习,了解以及总结cms中最容易出问题的功能代码.

网上没有公开,假装是个0day(滑稽).分析的每个利用都在后台,还是挺鸡肋的,师傅们看个乐子就行.

0x01 前言

emlog_pro v1.0.8

0x02 任意文件删除

代码分析

漏洞源码出现在include/lib/function.base.php的第756行:

image-20211126085306591

全局搜索函数emDeleteFile,在admin/template.php下发现可利用调用,其中TPLS_PATH的值为框架中content/templates在当前主机上的绝对路径

image-20211126085554241

可以看到用户传入的$tplName的值可以通过$_GET['tpl']进行控制,且只进行了一个简单的addslashes()的过滤.由于这里的变量$tplName并没有带入数据库操作,所以对我们的限制几乎没有.于是可以通过../实现目录穿越.不过在第66行还存在一个变量$noce_tmplet,根据第68行的提示,应该能判断变量$nonce_templet$的值为当前模板的名称.这里只要咱们上传一个新模板就能绕过了.

漏洞利用

登录后台,随便上传一个模板

image-20211126090553763

删除前相关目录结构:

就是初次官方下载源码后搭建完成的目录结构,

image-20211126091235707

点击删除模板,利用bp抓取数据包,修改url中的tpl的值,这里我构造的为../../robots.txt,及web根目录下的robots.txt文件,发送,可以看到根目录下的robots.txt已经被删除了.且模板文件benning也被删除

注:删除的模板不能为当前使用模板

image-20211126091715984

image-20211126091646085

image-20211126091956303

0x03 模板上传getshell

这个漏洞点采用了 功能定向分析审计出来的.

代码分析

漏洞点位于admin/template.php的第87行的上传模块内.

image-20211130134946124

88行到99行对当前token的有效期以及上传文件的后缀名进行了判断,这里只要正常上传一个.zip的文件都不会出现错误,我们继续.

在第101行遇到一个emUnzip函数,跟进,发现其函数体位于include/lib/function.base.php的第663行:

image-20211130135815750

配合注释,能够大概了解到这个函数的作用是将我们刚刚传入的.zip文件进行解压缩操作.继续跟着走,

在第675行,判断压缩文件内是否存在header.php,如果不存在,则返回-2;若存在,则执行解压操作,

image-20211130140036087

image-20211130140149115

且解压的路径我们是能通过admin/template.php得到的.

image-20211130140347061

可以发现这里只判断了上传的.zip文件内是否存在header.php,并没有对header.php的内容以即是否存在其他恶意文件进行检测.这里可以直接将🐎写在header.php内进行绕过.

继续跟进,发现emUnZip()函数已经调用完成,随后就是一些重定向操作,不重要.这个漏洞也就分析完了

image-20211130140450041

漏洞利用

上传模板文件路径可以直接访问

创建一个内容为

<?php
    phpinfo();

header.php文件,放在文件夹进行压缩

image-20211130141253478

image-20211130141515801

直接到后台进行上传,可以看到后台模板直接多了一个名叫exp的模板,说明我们上传成功

image-20211130141622989

image-20211130141636357

访问../content/tempaltes/exp/header.php

image-20211130141852673

可以看到成功执行phpinfo()

上传模板路径没法直接访问

还有一种情况是我们没法直接读取模板路径下文件,这种情况比较常见.由于我们上传的文件时模板文件,加载的时候肯定会进行相关渲染,所以我们只需要让程序加载我们刚刚上传的模板代码就行.

直接在模板外观文件处切换模块为我们刚刚上传的exp

image-20211130143627876

访问web主页面

image-20211130143657594

可以看到同样执行了代码,且不需要访问模板文件目录.

0x04 总结

测试官网最新发布的emlog_pro_1.1.0.zip同样存在以上两个漏洞,且利用方式相同.

修复建议:

针对任意文件删除:过滤$_GET['tpl']中的./字符,防止造成目录穿越

针对模板文件上传getshell:增加对模板文件内容的检查,防止恶意代码注入.

这个cms的审计分析特别简单,有手就行了。此外,在模板上传getshell处,使用了根据功能点定向审计的方法,黑白结合,对此方法有了进一步感受。