代码审计 | DedeCMS v 5.7 sp2 RemoveXSS bypass

概述

DedeCMS 简称织梦CMS,当前最新版为 5.7 sp2,最近又去挖了挖这个CMS,发现过滤XSS的RemoveXSS函数存在缺陷导致可以被绕过。

相关环境

源码信息:DedeCMS-V5.7-UTF8-SP2 漏洞类型:反射型XSS 下载地址:http://www.dedecms.com/products/dedecms/downloads/ 漏洞文件:/include/helpers/filter.helper.php

漏洞分析

1.先查看/include/helpers/filter.helper.php文件,其中的RemoveXSS函数,其中代码如下:

2.过滤的大概流程是,前面先把例如十进制和十六进制的(&#xxxxxxxxxx;)这种编码,转换回原来的字符,后面就是根据$ra1和$ra2里的黑名单进行过滤替换,例如javascript:alert(1)会被过滤成 javascript:alert(1);

3.如果这个时候,我输入的内容是

javascrip%26%2338%3B%26%2335%3B%26%2349%3B%26%2349%3B%26%2354%3B%26%2359%3B:alert(1);

4.url解码得到

javascrip&#116&#59;:alert(1);

5.这个时候进去RemoveXSS,进行第一次处理,也就是把(&#xxxxxxxxxx;)这种编码,转换回原来的字符,得到

javascript:alert(1);

6.后面的过滤步骤就是黑名单过滤了,然而javascript并不在黑名单之内,所以不会过滤,最后就是输出内容了;

7.这个时候输出t在标签的属性里面会重新还原成字母t,所以最后会在html输出javascript:alert(1);

8.下面是测试效果图:

总结

1.我画了草图,两次和一次编码的区别如下:

2.另外后面的代码会根据黑名单生成正则表达式,我拿其中一个测试,这段代码会生成正则表达式:

3.根据生成的其中一条正则表达式,可以看出,他应该是匹配javascript之间有没有恶意字符防止绕过,例如j avascript会被匹配到

4.正则匹配的是恶意字符之间的&#xxxxxx;,以分号结尾,但是有一点要注意的就是 等于 &#x0a ,不需要分号结尾也是可以的,例如,不加分号正则就匹配不到,但是效果也是一样的,也是可以弹窗。

5.还有一个问题,就是织梦的正则匹配&#[xX]0{0,8}([9ab]); ,注意{0,8},大概是八位左右,如果我超过八位,就算加上分号过滤器也匹配不到,正好十六进制格式的时候可以有很多0,足够超过八位了,例如:

最终总结

漏洞挖挖总还是有的,织梦的XSS过滤器有三个问题:

1.两次编码的时候,正则和黑名单就没软用了; 2.黑名单匹配的时候,正则无法匹配到没有分号结尾的编码; 3.也是黑名单匹配的时候,匹配编码字符大概在0-8个字符之内,但是十六进制可以超过八个字符,这个时候也无法匹配。

*本文作者:q601333824,转载请注明来自 FreeBuf.COM。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Brian

Python 多线程的同步方法

---- 概述 这篇博客是我翻译Python threads synchronization: Locks, RLocks, Semaphores, Condi...

53760
来自专栏微信公众号:Java团长

阿里历年经典Java面试题汇总

当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。

14820
来自专栏我是攻城师

深入理解Java类加载器机制

Java里面的类加载机制,可以说是Java虚拟机核心组件之一,掌握和理解JVM虚拟机的架构,将有助于我们站在底层原理的角度上来理解Java语言,这也是为什么我们...

43020
来自专栏流柯技术学院

TestNG官方文档中文版(2)-annotation

TestNG的官方文档的中文翻译版第二章,原文请见 http://testng.org/doc/documentation-main.html 2 - Ann...

13610
来自专栏JackeyGao的博客

Python 高级并发3

本篇主要讲案例, 两个使用Concurrent.futures实现的并发, 一个是多线程, 一个是多进程。

16320
来自专栏java工会

阿里历年经典Java面试题汇总

17960
来自专栏C语言及其他语言

每日一题[C语言程序设计教程(第三版)课后习题1.5]

请参照本章例题,编写一个C程序,输出以下信息: ************************** Hello World! ****************...

28130
来自专栏知识分享

C中的预编译宏定义

文章来自 http://www.uml.org.cn/c++/200902104.asp 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. ...

37540
来自专栏Java架构师历程

JVM加载class文件的原理

当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载...

55120
来自专栏后台全栈之路

图文并茂解释内存池原理

在 C 语言的动态申请内存技术中,相比起 alloc/free 系统调用,内存池(memory pool)优点很多。

1K70

扫码关注云+社区

领取腾讯云代金券