0x00 前言
昨天晚上做了一个神奇的梦,梦到了我高中时候晚自习在偷偷的看《黑客攻防技术宝典》,当年的事情无论是苦是乐,回忆起来总是感觉非常的美好。但是,现实就是现实,梦境还是要被舍友的闹铃声打破,在大梦初醒后,我仿佛有一种“垂死梦中惊坐起”的感觉,是谁为我织出了这么美好的一个梦境?难道织梦CMS(DedeCMS)又要出0day了?于是,我立马从床上跳了下来,打开电脑,从官网下载了最新版的织梦CMS(DedeCMS V5.7 SP2正式版),心想着一定要代码审计一波带走。于是乎,就有了你现在正在阅读的这篇文章。
0x01 服务器任意(图片)文件删除漏洞
漏洞产生在文件:/member/edit_face.php
第39行的unlink() 函数引起了我的注意
函数的参数是 $cfg_basedir和$oldface
先看了一下变量 $cfg_basedir
cfg开头的变量在DedeCMS中都是一些配置参数(cfg是config缩写),一般无法控制。
看上图,$cfg_basedir是写死在配置文件中的
再看 $oldface
我全局搜索了一下,发现 $oldface 在当前文件中并没有定义,那我是否可以通过变量覆盖的方式来控制这个变量?
跟进到第九行,包含了config.php
继续跟进,在 config.php第76行包含了/include/common.inc.php
在 /include/common.inc.php中把 $_GET $_POST $_COOKIE 中的变量解析了出来。
那么 $oldface就可以用变量覆盖的方式进行赋值。
既然 $oldface 可控,那我就要研究一下有没对这个变量进行严格的过滤。
在 /member/edit_face.php 第37行,限制了文件结尾后缀名是jpg、gif、png ,这是此漏洞最大的一个限制,似乎没法绕过。
在 /member/edit_face.php 第25行,限制了这个变量必须以 $userdir 的值开头,$userdir 即为储存当前用户上传头像的文件夹,
$userdir = ‘/uploads/userup/’+ 当前用户的userid
但是这里并没有过滤点号,因此可以路径回溯绕过!
漏洞复现如下:
打开页面/member/edit_face.php
在上传文件后抓包:
如图,我在上传图片的请求包中增加一个oldface参数,指向服务器根目录的一个图片文件,发包后就能成功删除。
0x02 DedeCMS后台登录处一个小trick
首先找到后台登录验证身份处,在 /dede/login.php 第74行,调用了userLogin的checkUser方法,这个方法用来验证管理员凭证。
跟进去,到了 /dede/include/userlogin.class.php 第240行
在第248行的SQL语句中发现用户名是用 like 进行模糊查询。
而且,在245行的正则表达式中发现用户名中可以包含下划线( _ )
在取出用户名后再比较密码,若用户名与密码匹配则登录成功。
这里存在的一个问题是用户名处用 like 进行模糊查询,而且没有过滤下划线,下划线在 like 中可以用来匹配单个字符,因此,即使我不知道管理员用户名,也可以登录后台。
漏洞复现如下:
若管理员是 admin 则我在后台输入 _____ 即可登录后台(五个下滑线,与管理员用户名字节数相同)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论