其一:如何保留/**/注释符号?
部分过滤器会对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]"在末尾加了一个空字符,就可以执行跨站
不过仍然对实际目标跨站没啥帮助,因为被编码成�了
失败的跨站过程,大家随便看看