Emlog_pro代码审计
web安全的本质最终还得回归到代码层面.
本专栏博客主要通过复现历史cms的漏洞,来学习,了解以及总结cms中最容易出问题的功能代码.
网上没有公开,假装是个0day(滑稽).分析的每个利用都在后台,还是挺鸡肋的,师傅们看个乐子就行.
0x01 前言
emlog_pro v1.0.8
0x02 任意文件删除
代码分析
漏洞源码出现在include/lib/function.base.php
的第756
行:
全局搜索函数emDeleteFile
,在admin/template.php
下发现可利用调用,其中TPLS_PATH
的值为框架中content/templates
在当前主机上的绝对路径
可以看到用户传入的$tplName
的值可以通过$_GET['tpl']
进行控制,且只进行了一个简单的addslashes()
的过滤.由于这里的变量$tplName
并没有带入数据库操作,所以对我们的限制几乎没有.于是可以通过../
实现目录穿越.不过在第66
行还存在一个变量$noce_tmplet
,根据第68
行的提示,应该能判断变量$nonce_templet$
的值为当前模板的名称.这里只要咱们上传一个新模板就能绕过了.
漏洞利用
登录后台,随便上传一个模板
删除前相关目录结构:
就是初次官方下载源码后搭建完成的目录结构,
点击删除模板,利用bp抓取数据包,修改url中的tpl
的值,这里我构造的为../../robots.txt
,及web根目录下的robots.txt
文件,发送,可以看到根目录下的robots.txt
已经被删除了.且模板文件benning
也被删除
注:删除的模板不能为当前使用模板
0x03 模板上传getshell
这个漏洞点采用了 功能定向分析审计出来的.
代码分析
漏洞点位于admin/template.php
的第87
行的上传模块内.
第88
行到99
行对当前token
的有效期以及上传文件的后缀名进行了判断,这里只要正常上传一个.zip
的文件都不会出现错误,我们继续.
在第101
行遇到一个emUnzip
函数,跟进,发现其函数体位于include/lib/function.base.php
的第663
行:
配合注释,能够大概了解到这个函数的作用是将我们刚刚传入的.zip
文件进行解压缩操作.继续跟着走,
在第675
行,判断压缩文件内是否存在header.php
,如果不存在,则返回-2
;若存在,则执行解压操作,
且解压的路径我们是能通过admin/template.php
得到的.
可以发现这里只判断了上传的.zip
文件内是否存在header.php
,并没有对header.php
的内容以即是否存在其他恶意文件进行检测.这里可以直接将🐎写在header.php
内进行绕过.
继续跟进,发现emUnZip()
函数已经调用完成,随后就是一些重定向操作,不重要.这个漏洞也就分析完了
漏洞利用
上传模板文件路径可以直接访问
创建一个内容为
<?php
phpinfo();
的header.php文件
,放在文件夹进行压缩
直接到后台进行上传,可以看到后台模板直接多了一个名叫exp
的模板,说明我们上传成功
访问../content/tempaltes/exp/header.php
可以看到成功执行phpinfo()
上传模板路径没法直接访问
还有一种情况是我们没法直接读取模板路径下文件,这种情况比较常见.由于我们上传的文件时模板文件,加载的时候肯定会进行相关渲染,所以我们只需要让程序加载我们刚刚上传的模板代码就行.
直接在模板外观文件处切换模块为我们刚刚上传的exp
访问web主页面
可以看到同样执行了代码,且不需要访问模板文件目录.
0x04 总结
测试官网最新发布的emlog_pro_1.1.0.zip
同样存在以上两个漏洞,且利用方式相同.
修复建议:
针对任意文件删除:过滤$_GET['tpl']
中的.
和/
字符,防止造成目录穿越
针对模板文件上传getshell:增加对模板文件内容的检查,防止恶意代码注入.
这个cms的审计分析特别简单,有手就行了。此外,在模板上传getshell处,使用了根据功能点定向审计
的方法,黑白结合,对此方法有了进一步感受。