### 简要描述:
点击触发,鸡肋一些。
### 详细说明:
cmseasy是一款轻型cms,虽然这么说,但它也有bbs功能,其中bbs发帖处就有一个富文本框。
但最新版的cmseasy过滤函数非常厉害,形式类似于会在敏感代码里加“<x>”,但cmseasy的规则更加严格,过滤了style和expression。看下图:
[<img src="https://images.seebug.org/upload/201403/28192701282dc71113a21a53cebf838f90fe67bf.jpg" alt="25.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/28192701282dc71113a21a53cebf838f90fe67bf.jpg)
但它依旧是没有处理好伪协议的部分。因为a和href没有过滤(也不可能过滤),所以我们可以借助href=javascript:xxx来执行javascript。但我们看到,$ra1 = array('javascript'这里直接就过滤了javascript这个关键词,怎么办?
读到这里,大家应该很快就能反应过来,当然是用字符编码。对,因为javascript是在href这个属性中的,所以我们可以用html实体替换。比如用r替换r。这样:
```
<a href=javascript:alert(document.cookie)>click me</a>
```
但我们再读源码:
```
for ($i = 0; $i < strlen($search); $i++) {
$val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);
$val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $val);
}
```
这里似乎过滤了html实体呢。这个for循环的功能就是将html实体替换成原字符,比如我们这里的javascript经过这个循环后就变成了javascript,然后就被后面的fliter过滤了。
怎么办?
既然它把html实体替换成了原字符,那么这样写呢:&#114;
1被替换成了1,和外面的字符又组成了新的r。好,这样我们试试能不能绕过fliter:
```
<a href=javasc&#114;ipt:alert(document.cookie)>click me</a>
```
我们在cmseasy中试试。注册用户,到bbs目录下,发帖:
[<img src="https://images.seebug.org/upload/201403/28192844a2335d515361fc9198aa2ab04df7a2ff.jpg" alt="22.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/28192844a2335d515361fc9198aa2ab04df7a2ff.jpg)
点击Click me触发:
[<img src="https://images.seebug.org/upload/201403/281929101378b025c3af91ae2592f36731fe925d.jpg" alt="24.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/281929101378b025c3af91ae2592f36731fe925d.jpg)
所以,虽然这个xss fliter看似十分变态,过滤了很多很多标签和属性。但某些标签和属性是不可能过滤的。比如img、a、href、src,因为这都是一些正常到不能再正常,富文本中必须用到的标签。
但因为有了伪协议的存在,所以这些标签也变得十分危险。
### 漏洞证明:
见详细说明。
暂无评论