其一:如何保留/**/注释符号?

部分过滤器会对style中的注释符号进行删除,有些只删一次,那注定会有漏洞;用递归删除注释的那基本没问题。

但是部分过滤器考虑到可能出现重复递归的异常或效率上的问题,只递归有限的次数。

之前一直想构造测试递归次数的的注释符号串,最近才想到可以绕过有限次数递归过滤的构造方式。

一个正确的删除注释的正则表达式如下:

/\*.*?\*/

删除时:

需要删除一次:/**/
需要删除两次://**/**/

之前一直卡在这里,一直构造不出来需要删除三次的情况。

最近发现只要将一对注释符号插入自身第一个"/"后面即可

需要删除三次:///**/**//**/**/
需要删除四次:////**/**//**/**///**/**//**/**/

并且可以重复这个动作无限次,重复的次数等同于需要递归过滤的次数,有点抽象,看代码。

string comment = "/**/"; 
for (int i = 0; i < 20; i++) 
  comment = comment.Substring(0, 1) + comment + comment.Substring(1, comment.Length - 1);

我利用这段代码生成了4M的数据发出去,结果还是被过滤,看来是正确的递归过滤。不过这个东西挺有意思。

第二:关于<!DOCTYPE>与link标签的问题

我们知道一段引用css的link标签的写法

<link rel="stylesheet" href="http//www.x.com/theme.css" />

其中rel必须等于stylesheet才能作为样式表引用,部分过滤器只判断rel是否等于stylesheet来进行过滤,因此我觉得其中有机可乘。

尝试添加各种字符,试到空格,

例如rel="stylesheet ":

在没有<!DOCTYPE>的情况下回去下载href链接中的文件但没有执行(十分诡异的设定,不能执行为啥要去下载?)

在有<!DOCTYPE>的情况下可以正常显示样式,但expression无法执行

另外IE8的iframe子页面不会继承父页面的<!DOCTYPE>,IE9会继承

最后试到在rel="stylesheet[null]"在末尾加了一个空字符,就可以执行跨站

不过仍然对实际目标跨站没啥帮助,因为被编码成&#0;了

失败的跨站过程,大家随便看看

摘自:http://zone.wooyun.org/content/2041