阅读:1637回复:0
Wordpress 评论功能Xss 始末
近期Wordpress自身程序评论功能的Xss在微博上沸沸扬扬,而其中的修复过程也可谓一波三折,接下来由我为大家一一讲述。
WordPress $value['length'] ) { return false; } $data[ $field ] = $value; } return $data;}$value['length']来自于get_col_length,text类型长度上限为65535字节,mb_strlen( $value['value'] )是mb_strlen函数来统计字符个数的结果,两个值的计量单位不同,一个是字节数,一个是字符的个数。 在函数“mb_strlen”中,一个多字节字符统计个数为1。在不同的编码中,一个字符的大小可以为多个字节(多字节字符),所以我们可以构造一个字符串,让字符的个数小于65535而字符串的字节数大于65535字节,从而满足如下条件: #!sqlif ( false !== $value['length'] && mb_strlen( $value['value'] ) > $value['length'] ) { return false;}当php向数据库中插入数据时,由于字节数超过了text类型的长度上线65535字节,所以字符串会被截断,导致了之前的xss可以重新被利用。 相关链接: (1] http://xteam.baidu.com/?p=198 (2] http://php.net/manual/zh/function.mb-strlen.php <h1>WordPress 4.2.2 中总体修复情况 在4.2.2版本中引入了两个变量: $truncate_by_byte_length : 是否进行字节长度验证 $needs_validation : 是否进行多字节字符合规性验证以及长度验证 wp422/wp-includes/wp-db.php 2626行 #!sqlif ( $truncate_by_byte_length ) { mbstring_binary_safe_encoding(); if ( false !== $length && strlen( $value['value'] ) > $length ) { $value['value'] = substr( $value['value'], 0, $length ); } reset_mbstring_encoding(); if ( ! $needs_validation ) { continue; }}该处解决了4.2.1中用mb_strlen来测量实际长度和规定长度上线之间的比较造成的问题,改用了strlen来测量长度,并对超长部分进行切割,因而拦截了4.2.1补丁bypass造成的xss。 #!sql$regex = '/ ( (?: [x00-x7F] # single-byte sequences 0xxxxxxx | [xC2-xDF][x80-xBF] # double-byte sequences 110xxxxx 10xxxxxx | xE0[xA0-xBF][x80-xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [xE1-xEC][x80-xBF]{2} | xED[x80-x9F][x80-xBF] | [xEE-xEF][x80-xBF]{2}';if ( 'utf8mb4' === $charset ) { $regex .= ' | xF0[x90-xBF][x80-xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [xF1-xF3][x80-xBF]{3} | xF4[x80-x8F][x80-xBF]{2} ';}$regex .= '){1,40} # ...one or more times ) | . # anything else /x';$value['value'] = preg_replace( $regex, '$1', $value['value'] );if ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) { $value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' );}continue;}可以看出,对于utf8编码时,仅仅会取范围内的小于等于3字节UTF8字符,取出之后,会按照当前多字节字符的编码长度再次确认。此处是针对小于4.2版本用四字节utf8字符插入数据库截断以及其他特殊字符截断而修补的。 相关链接: (1] https://wordpress.org/news/2015/05/wordpress-4-2-2/ 致谢:感谢evil_xi4oyu的每一次悉心指点和yaseng的帮助~ |
|