WordPress <4.1.2 & <=4.2 存储型xss(利用mysql对特殊字符和超长字符会进行截断的特性)

转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177

漏洞概述

本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一种为数据库字段长度截断,该漏洞导致攻击者可获取用户 cookie以及模拟浏览器正常操作,并且当管理员访问到注入的payload时,结合wordpress后台功能甚至可以getshell。

漏洞分析

1.字符截断

通过官网介绍“The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. ”,mysql在使用utf8的时候,一个字符的大小的上限为3字节,而当出现四个字节的字符时,是需要用使用utf8mb4编码,不使用的话,会将不识 别的四字节的字符连同后面的字符串一同舍弃。示例如下,使用特殊字符

UPDATE `wp_comments` SET `comment_content` = ‘stefanie特殊字符555555555555555 ‘ WHERE `wp_comments`.`comment_ID` =12;

执行结果,可以看出,后面的55555555已经被截断,并未插入数据库。

UTF-8编码在对于不同的字符区域,编码所占用的字节数各不相同,当然我们重点关注占用4字节的范围

通过刚刚对于官网的说明的理解,mysql utf-8编码对于占用四个字节的字符无法识别,那么这一部分占用字节编码的区域,插入数据库时可以与符号产生同样的效果,在该范围中随机进行测试发现,均产生截断效果,如等,如需完整验证猜想,可对针对图中范围进行FUZZ。

当mysql数据库的编码为utf-8mb4或者latin1时,是不存在该问题的,因为这两种字符集对该类字符可以进行正常识别,不会产生截 断效果,另外,当mysql开启strict mode时候,会更加严格地处理,确保在数据有效存储之前进行阻止,也就不会产生该问题。

2 超过长度截断

mysql type=TEXT时,TEXT的最大长度为64kb,当发生数据库的插入操作时,则会将大于64KB的部分抛弃,只插入前64KB,此时也造成了一种截断。

而wordpress保存评论的字段的type正是TEXT

3 漏洞利用

wordpress中,对于匿名评论内容中的标签以及属性,会按照白名单进行过滤,如下所示。

\wp411\wp-includes\kses.php 419行

$allowedtags = array(
        ‘a‘ => array(
            ‘href‘ => true,
            ‘title‘ => true,
        ),
        ‘abbr‘ => array(
            ‘title‘ => true,
        ),
        ‘acronym‘ => array(
            ‘title‘ => true,
        ),
        ‘b‘ => array(),
        ‘blockquote‘ => array(
            ‘cite‘ => true,
        ),
        ‘cite‘ => array(),
        ‘code‘ => array(),
        ‘del‘ => array(
            ‘datetime‘ => true,
        ),
        ‘em‘ => array(),
        ‘i‘ => array(),
        ‘q‘ => array(
            ‘cite‘ => true,
        ),
        ‘strike‘ => array(),
        ‘strong‘ => array(),
    );

wordpress只会允许白名单中的标签出现,而在每个以标签名作为数组名的数组中,保存的是该标签下所允许出现的属性。

正常情况是不允许类似于onmouseover之类的属性出现的,我们使用poc进行测试

<abbr title=”123 onmouseover=alert(1) 特殊字符”>

在IE下面提交评论后可以发现,成功弹窗,代码如下图

可以看出,在poc中,onmouseover是在双引号内作为title属性的值出现的,而当特殊字符起到了截断的作用之后,该条评论的内容在数据库中保存如下

其中左边的双引号在输出的时候,会被替换,而另外一个包裹onmouseover的双引号被截断未存入数据库,此时的onmouseover成功变成了一个未在白名单允许范围之内的事件,并且被成功解析。

而用超过固定长度来构造截断与此同理。

<abbr title=”123 onmouseover=alert(1) 此处增加无用字符至64KB “>

此时则成功将右边的双引号和尖括号截断,导致其并未进入数据库,如下图所示

漏洞利用

 

Klikki Oy团队给出了兼容多种浏览器的POC,chrome,IE,firefox测试成功

sssss<a title=’x onmouseover=alert(unescape(/hello%20world/.source))

style=position:absolute;left:0;top:0;width:5000px;height:5000px 此处用特殊字符或者长度截断均可’></a>

结合此poc,引用外部js,利用wordpress管理员在后台编辑模板的功能,可进行自动化的getshell,之前爆出wordpress xss时已有人发出,此处不再赘述

漏洞影响范围

特殊字符截断影响版本:WordPress < 4.1.2 (需要mysql使用utf8字符集且strict mode关闭)

超过长度截断影响版本:WordPress < =4.2

此次漏洞利用的为mysql的特性,其他使用mysql的cms可能也会出现类似问题。

拦截建议

waf对两种xss拦截,建议如下:

1 字符截断:针对评论请求中带有图中范围内的字符,予以拦截

2 长度截断: 评论请求超过64KB予以拦截

具体情况还请waf同学斟酌

修复建议

针对超长截断,官方暂未给出补丁,所以建议临时关闭评论功能,防范此次的xss

-------------我的总结--------------

1. mysql字符编码最好采用utf-8mb4(或latin1)

2. mysql一定采用strict mode(mysql5.7好像已经是默认严格模式了)

3. 长度超过,程序就应该进行处理,所以还是程序写的不严谨

4. XSS 白名单

5. 该攻击的原理是,利用mysql在处理特殊字符和超长字符时,其会进行截断,所以导致了最后的 " 被截断了,导致了引号"没有被关闭,所以导致了浏览器将标签的属性当成了js代码来执行。

6. <abbr title=”123 onmouseover=alert(1) 在输出时,没有进行html编码,将<编码成&lt; ,onmouseover,alert等在输入时没有进行过滤。

7. 存储型XSS,需要鼠标移动到上面才会触发。

时间: 2024-10-10 10:55:31

WordPress <4.1.2 & <=4.2 存储型xss(利用mysql对特殊字符和超长字符会进行截断的特性)的相关文章

WordPress窗体化侧边栏

窗体化侧边栏是一个支持 Widget 的侧边栏或者说是窗体化(widgetized)的侧边栏几乎是 WordPress 主题的标准. 首先,什么是窗体化(widgetizing)呢?简单的说,窗体化就是能够通过拖拉就能够整理侧边栏的模块.比如我们需要更改分类和存档的位置,只需要简单把分类和存档列表拖到它们的位置即可,根本不用去修改侧边栏的代码. 教程地址:http://blog.wpjam.com/m/wp-theme-lesson-6e-widgetizing-sidebar/

samba共享目录构建wordpress与mysql

项目一 (1) 使用samba共享/data/application/web,在目录中提供wordpress; (2) 使用samba客户端挂载samba server共享的目录至/var/www/html: (3) 客户端(lamp),部署wordpress,并让其正常访问:要确保能正常发文章,上传图片: (4) 客户端2(lamp),挂载samba server共享的目录至/var/www/html:验正其wordpress是否可被访   问:要确保能正常发文章,上传图片: samba服务器

WordPress解决优酷、土豆视频移动端观看问题并自适应

转:https://www.xhsay.com/wp-iframe-handler-youku-tudou.html 虽然WordPress能直接插入优酷.土豆的视频但是无法在移动端观看,于是乎笨笨就开始各种折腾终于找到了合适的解决办法另外在说一句支持移动端自适应哦. 函数代码 在主题函数文件function.php里面添加以下代码即可,保证在最后一个?>之前就好了 //Youku function wp_iframe_handler_youku($matches, $attr, $url, $

WordPress版微信小程序2.2.0版发布

2017年8月12日WordPress版微信小程序2.2.0版通过了微信的审核正式发布,此版本的更新以完善功能为主.主要更新的功能是:站内链接,猜你喜欢,热点文章. WordPress版微信小程序开放源码地址:https://github.com/iamxjb/winxin-app-watch-life.net 了解程序的开发历程及开发技术,建议看看相关版本的更新文章: 1.用微信小程序连接WordPress网站 2.WordPress版微信小程序1.5版本发布 3.WordPress版微信小程

WordPress主循环(The Loop)函数have_posts(),the_post()详解

WordPress中调用文章标题是the_title();调用文章内容时用到the_content();调用文章的作者时用到the_author();等等这些函数,都需要在主循环中使用,下面就介绍一下如何用have_posts()和the_post()开始Wordpress文章中循环,并说明如何结束循环. 语法 1 <?php if (have_posts()) :  while (have_posts()) : the_post(); ?> 2 当找到文章时返回此语句 3 <?php 

说说WordPress的主查询函数-query_posts()

今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环.如果你希望在主循环外另外生 成循环,应该新建独立的WP_Query对象,用这些对象生成循环.在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上 显示出你不

wordpress博客站点配置及数据库迁移

1.wordpress博客站点部署配置 1.1 检查环境 1.1.1 nginx.conf配置文件 ###检查nginx配置文件 [[email protected] conf]# cat nginx.conf worker_processes 1; events { worker_connections  1024; } http { log_format  main  '$remote_addr - $remote_user [$time_local]"$request" ' '$

基于lamp+fastcgi+https搭建phpMyAdmin和wordpress

前言: lamp为网站搭建的很基本的一个架构,如果仅仅只是静态的网页文件,我们就可以通过基本的web服务器来处理.当我们需要处理动态内容时,比如把用户数据放在数据库,从数据库取出数据等等,我们就必须借助CGI连接到处理动态请求的应用.FastCGI作为一个常驻型的CGI,可以独立于apache服务,可以实现分布式的部署.接下来我们用一台 主机来搭建phpMyAdmin和wordpress,并且让wordpress实现https. 正文: 部署之前我们先简单介绍下我们用到的架构,不用多说lamp就

在使用WordPress建立商业网站时你需要了解的?

在玩WordPress的4年里,目睹WP的功能越来越强大的同时,也感受到了WordPress越来越臃肿复杂,不再是曾经众多博主所认为的简单易用,尤其对于很多完全陌生的新手来说,诸多WP专用的术语也一知半解,比如"自定义字段","自定义缩略图","自定义表单"--这么多的自定义也表明WordPress正逐渐走向一个强大的准CMS系统了,也正因为功能的强大和众多的开发者提供的资源,很多人开始选择用WordPress建立自己团队或者公司的垂直资讯网站或

lnmp部署wordpress和phpmyadmin

yum安装nginx php-fpm mariadb-server phpmyadmin php-mysql nginx.conf添加以下内容 location 下添加 index    index.php; location  ~ \.php$ {         root           html;                             fastcgi_pass   127.0.0.1:9000;         fastcgi_index  index.php;