分析源码首页
文件包含 nclude/common.inc.php
使用了$$有可能存在变量覆盖的问题
进一步文件上传分析
_RunMagicQuotes() 使用addslashes()过滤数据
if($_FILES){require_once(DEDEINC.'/uploadsafe.inc.php');} 用来过滤上传 进行分析
黑名单
进行分析文件上传检测方法
!empty(${$_key.'_name'} 若上传的文件名不为空,则继续执行
preg_match("#.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#.#", ${$_key.'_name'})
后缀名在黑名单 或者没有符号.继续
搜索DEDEADMIN函数,定义函数适用于后台
首先,服务端MIME content-Type检测
strtolower 所有字符转为小写。文件将通过getimagesize()来获取图像信息,当上传的文件为图片时,将会通过getimagesize()二次验证传入的是否为图片
后台index文件分析
index加载dede/config.php
config.php加载common.inc.php和加载管理员登录
检测csrf和xss
文件上传
抓包获取文件上传的文件
处理上传功能的文件为dede/archives_do.php,rchives_do.php加载config.php, config.php加载common.inc.php
回到之前分析的文件uploadsafe.inc.php进行过滤
漏洞验证
任意用户登录
会员中心模块的入口文件为member/index.php
首先判断uid是否为空
当$uid为空时
当$uid为空时,判断用户的登陆状态,如果未登陆就加载登陆框,如果已经登陆,则展现对应用户的个人主页
当$uid不为空时,会加载config_space.php文件
config_space.php文件主要为登录账户的信息模块
首先从member/index.php发现加载了config.php,在config.php获取登录userlogin.class.php的加载
serlogin.class.php发现cms判断用户登录,M_ID值判断大于0即为登陆状态
common.inc.php定义了使用外部变量方法进行变量声明
故发现uid可控
MemberLogin文件主要为cookie的保存,文件主要为会员的一些东西
管理员不能从前台登录
用户账号密码验证成功后保存cookie
全局搜索PutCookie
这里利用了md5方法生成cookie,cookie无法破解生成
通过之前发现的M_ID判断用户登录,定位M_ID
M_ID的值将来自于cookie,M_ID还会通过GetNum()或intval()转换成整数类型,GetNum()用于接收整数,GetCookie()用于获取cookie值
漏洞复现
注册一个名为admin1的用户
修改数据
直接通过登陆框登陆admin用户是进不了个人主页的,因为dedecms默认禁止admin用户登陆会员中心。如果通过方法却可以实现amdin用户登陆
任意用户密码修改漏洞
功能点位于会员中心找回密码处
分析member/resetpassword.php
resetpassword.php中 主要有变量$dopost进行判断,且$dopost可控,$dopost默认为空,会加载resetpassword.htm,用于显示找回密码的页面
$dopost == "getpwd",主要为找回密码界面
之后的为密码的二次验证
$dopost == "safequestion,其中$row['safequestion']为数据库数据问题,$row['safeanswer']为数据库答案,这里思考,若safequestion为空即没有安全问题,数据库默认的safequestion="0",safeanswer=""(这里分析注册页面)
safequestion="0",但是不能传入$safequestion为0,这样会导致empty()判断为空,最终被赋值为空。
使用弱类型比较==字符型的0.0或00,进行绕过
safequestion=00&safeanswer=
验证成功会进入到sn函数,进行对临时密码进行判定
定位sn函数,member/inc/inc_pwd_functions.php,文件主要为发送验证码,程序首先利用函数传输过来的mid拼接上SQL语句进入#数据库检测
发送邮件用到newmail,对其进行定位,传入的$send为N,会下发重置密码的链接,进行密码修改操作。这里会把临时密码给泄露出来
回到member/resetpassword.php,发现用户传输的临时key和数据库存储的pwd进行对比,如果一样则会成功修改密码
漏洞利用
http://localhost/DedeCMS/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0e1&safeanwser=&id=1
拿到临时key,访问,绕过验证
http://localhost/DedeCMS/uploads/member/resetpassword.php?dopost=getpasswd&id=2&key=28SKBIgs
XSS
xss漏洞主要主要注意一些输出类函数
分析qrcode.php,首先加载common.inc.php会注册全局变量
文件进行加载$tplfile = DEDETEMP1ATE.'/plus/qrcode.htm';
这里使用$dtp->SetVar('type',$type);进行动态传参数
对qrcode.htm文件进行访问,其文件是一个二维码文件
这里没有对xss进行过滤
http://localhost/DedeCMS/uploads/plus/qrcode.php?id=1&type=%22%3E%3CScRiPt%3Ealert(1)%3C/ScRiPt%3E
url重定向
常见重定向参数
redirect redirect_to redirect_url url jump jump_to target link linkto domain do
进行全局搜索函数
发现download.php文件存在对$link做了base64解码
http://localhost/DedeCMS/uploads/plus/download.php?open=1&link=aHR0cDovL3d3dy5iYWlkdS5jb20%3D
跳转到百度