墨者学院-CMS系统漏洞分析溯源(第7题)——亲妈级教程
墨者学院-CMS系统漏洞分析溯源(第7题)——亲妈级教程
方法一:
1.通过探测发现该靶场为DEDE-CMS 靶场为20180109http://host:post/data/admin/ver.txt
为DEDE版本号位置
2.构造请求获取重置密码链接
请求1:http://219.153.49.228:47258/member/resetpassword.php?dopost=safequestion&safequestion=0e1&safeanwser=&id=1
重置密码后发现登录不成功,不存在admin,有可能主页不让直接登录
(注:实验结束后,通过分析后台设置
可以发现admin为*别,不能在前台登录)
(注:修改密码后,10分钟后才可以重复修改,此时的bp抓不到可以重置密码的包)
观察主页发现 还存在一个用户test
这里修改id的值即可修改对应的用户的密码,admin用户id=1,test用户id=2
请求2:
http://219.153.49.228:47258/member/resetpassword.php?dopost=safequestion&safequestion=0e1&safeanwser=&id=2
3.使用BP抓包
如图所示,可以获取到重制密码的链接
http://219.153.49.228:47258/member/resetpassword.php?dopost=getpasswd&id=2&key=ZIvUJGYG
修改为:
http://219.153.49.228:47258/member/resetpassword.php?dopost=getpasswd&id=2&key=ZIvUJGYG
然后就可以直接重置密码了。
但是这个漏洞存在一个缺陷,因为通过分析可以看出来只有没有设置安全问题的用户才会受此漏洞的影响;而且只能修改前台用户的密码。
4.成功通过test用户登录后台
通过浏览用户信息,
发现存在用户邮箱,使用该邮箱尝试登录admin账号
5.尝试用邮箱登录admin 的管理账户
管理账户登录:http://219.153.49.228:47258/dede/login.php
用户:admin
密码:aaa@qq.com
成功进入后台
6.已拿到最高权限,寻找KEY值
在通过对根目录查询发现存在包含KEY的文档
实验完成,分析漏洞生成原因
1.寻找漏洞点
在根目录的member文件下的resetpassword.php存在该项漏洞点
再通过分析源码,我发现:
在找回密码时,当
d
o
p
o
s
t
=
s
a
f
e
q
u
e
s
t
i
o
n
时
,
通
过
传
入
的
m
e
m
b
e
r
i
d
查
询
出
对
应
i
d
用
户
的
安
全
问
题
和
答
案
信
息
,
当
我
们
传
入
的
问
题
和
答
案
不
为
空
,
而
且
等
于
之
前
设
置
的
问
题
和
答
案
是
就
进
入
s
n
(
)
函
数
。
这
里
如
果
用
户
设
置
了
问
题
和
答
案
,
我
们
并
不
知
道
问
题
和
答
案
是
什
么
,
就
无
法
进
入
s
n
(
)
函
数
。
但
是
如
我
此
用
户
没
有
设
置
问
题
和
答
案
呢
?
此
时
系
统
默
认
问
题
是
”
0
”
,
答
案
是
空
。
那
么
我
们
传
入
答
案
dopost = safequestion时,通过传入的member_id查询出对应id用户的安全问题和答案信息,当我们传入的问题和答案不为空,而且等于之前设置的问题和答案是就进入sn()函数。 这里如果用户设置了问题和答案,我们并不知道问题和答案是什么,就无法进入sn()函数。但是如我此用户没有设置问题和答案呢?此时系统默认问题是”0”,答案是空。 那么我们传入答案
dopost=safequestion时,通过传入的memberid查询出对应id用户的安全问题和答案信息,当我们传入的问题和答案不为空,而且等于之前设置的问题和答案是就进入sn()函数。这里如果用户设置了问题和答案,我们并不知道问题和答案是什么,就无法进入sn()函数。但是如我此用户没有设置问题和答案呢?此时系统默认问题是”0”,答案是空。那么我们传入答案safeanswer = “”时:
$row[‘safeanswer’] ==
s
a
f
e
a
n
s
w
e
r
;
成
立
。
但
是
传
入
问
题
safeanswer;成立。 但是传入问题
safeanswer;成立。但是传入问题safequestion = “0”时:
if(empty($safequestion))
s
a
f
e
q
u
e
s
t
i
o
n
=
”
,
而
safequestion = ”,而
safequestion=”,而row[safequestion] = “0”
此时$row[safequestion] ==
s
a
f
e
q
u
e
s
t
i
o
n
;
不
成
立
。
所
以
要
让
safequestion;不成立。 所以要让
safequestion;不成立。所以要让row[safequestion] == $safequestion;成立必须绕过if判断
2.绕过if判断
(这个函数找不到,使用的是参考链接的图)
可以看到使用”0.0”,”0.”,”0e1”都可以绕过前面的判断,最后进入sn()函数
3.成功绕过进入su函数
Su函数位于member\inc\inc_pwd_functions.php
分析代码,发现这里当第一次进行忘记密码操作时,$row应该时空,所以进入第一个if条件发送邮件insert一条记录到dede_pwd_tmp表里;如果之前进行过忘记密码操作,但是时间已经超过10分钟,那么继续进行发送新验证码的操作update dede_pwd_tmp表里面的数据,跟进当前文件的newmail()函数。
4.进入newmail函数
再当前文件下的73-125行
在阴影部分可以发现,传入的
s
e
n
d
为
N
的
时
候
便
会
下
发
重
置
密
码
的
链
接
,
进
行
密
码
修
改
操
作
例
如
这
里
第
一
次
进
行
i
n
s
e
r
t
操
作
(
u
p
d
a
t
e
操
作
是
一
样
的
)
时
,
将
8
位
的
随
机
字
符
串
send为N的时候便会下发重置密码的链接,进行密码修改操作 例如这里第一次进行insert操作(update操作是一样的)时,将8位的随机字符串
send为N的时候便会下发重置密码的链接,进行密码修改操作例如这里第一次进行insert操作(update操作是一样的)时,将8位的随机字符串randval加密后下乳dede_pwd_tmp表中,然后当
s
e
n
d
=
N
时
(
上
面
默
认
传
入
N
)
,
将
随
机
字
符
串
send = N时(上面默认传入N),将随机字符串
send=N时(上面默认传入N),将随机字符串randval拼接到url中返回,可以在源码中看到返回的url为:
resetpassword.php?dopost=getpasswd&id=KaTeX parse error: Expected 'EOF', got '&' at position 4: mid&̲key=randval
漏洞解析参考文章:http://blog.nsfocus.net/dedecms-20180109/
方法二.
1.寻找漏洞注入点
在发表文章的模块下存在两个图片上传位置
① 缩略图处
更改后缀名后不会显示文件真实路径,所以不采用此项注入点
② 详细内容的图片上传处,
修改后缀名绕过限制可以爆出文件真实路径
1.测试未修改后缀名的文件
被拦截
2.合成图片马
正常的图片可以上传
修改后缀名的图片也可以上传
所以上传图片马
图片信息:
一句话木马:
Cmd命令:
生成图片马waf.jpg
3.上传文件
点击上传
选择图片马 waf.jpg
4.使用Bp抓包
修改图片的后缀名为.p*hp
因为不是管理者,上传该文件类型会被拒绝
修改后
5.使用菜刀连接木马
脚本类型选择PHP,即可成功登录后台
可以看到文件上传的位置
通过管理者后台登录也可以发现文件上传成功
6.寻找key
对文件目录的检索发现了含有key值的文档
文件拒绝上传的原因:
在服务器根目录下的include目录
存在uploadsafe.inc.php 文件
修改45行处
将 $imtypes = array 改为 $imgtypes = array
上一篇: R语言开发之字符串操作基础了解下
下一篇: GitHub及命令行