跨站利用点:
HTML标签:script、img、a、input
HTML标签属性:src、name
JS事件(鼠标、键盘、处理的结果、变化):onresume/onreverse/onrowdelete/onrowinserted/onseek/onsynchrestored
<img src=a οnerrοr=alert(444) />
CSS样式表:expression
绕过方式:
空格、换行符、tab
属性值的伪协议形式:javascript:alert(/1/);
属性编码(NCR编码,css/js都可以使用):
1.NCR编码是由一个与号(&)跟着一个井号(#), 然后跟着这个字符的Unicode编码值, 最后跟着一个分号组成的。
使用UNICODE在线转换工具可以将ncr编码直接转换为汉字,但事实上它又不是UNICODE,区别似乎就在于Unicode是以\u进行分割,而NCR是以&#进行分割。后面数字字母内容(和Unicode值)是一样的, 都有十进制与十六进制两种表示形式。
NCR编码特点:
(1) 无视载体文件编码,无论是gbk编码还是utf-8编码,展示的字符都不会出现乱码,这点就是它存在的原因。
缺点:
(1) 浏览器支持度不同,比如字符A在IE浏览器支持,却在chrome浏览器不支持,甚至有可能同一字符在不同浏览器展示的内容不一样(机率非常小),所以使用时,务必在各浏览器上进行测试。
(2) 移动端对此编码支持度较差,特别是在Window phone下和UC浏览下器,直接无法显示。
2.&name:<、>
&#十进制Unicode数字值:
10进制的“中国”:中国
进制Unicode值:
16进制的“中国”:中国
例如:
<img src=a οnerrοr="javascript:alert(999);"/>
<img src=a οnerrοr="javascript:alert(999);"/>
3.ASCII码——>Unicode:&#ASCII码值
中文——>Unicode:\U四位数字
function A2U(str) {
var reserved = '';
for (var i = 0; i < str.length; i++) {
reserved += '&#' + str.charCodeAt(i) + ';';
}
return reserved;
}
function encodeUnicode(str) {
let res = [];
for (let i = 0; i < str.length; i++) {
res[i] = ("00" + str.charCodeAt(i).toString(16)).slice(-4);
}
return "\\u" + res.join("\\u");
}
大小写绕过
注释符:<img src=a onm/**/ouseover=alert(444) />
远程加载shellcode:将要执行的XSS payload写入一个远程网页http://www.test.com,然后在攻击时选择src=http://www.test.com。
XSS downloader(XSS下载器),事先把Shellcode写在网站的某个页面,再利用XMLHTTP控件向网站发送HTTP请求(POST或GET),然后执行返回的数据.
编码小tips:
编码是指将计算机语言(01)转换成人类可以识别的语言。
ASCII码:占7位bit,可以表示128个字符;美国人标准编码
EASCII码:占8位bit,可以表示256个字符;
GB2312:一个汉字占2个字节Byte,16-24位bit;中国标准编码
GBK:罕见字和繁体字没办法处理,需要占3个字节,于是有了GBK;中国标准编码
UTF-8:动态占位(1-4个字节Byte,8-32位bit);一会儿一个字符是占用一个字节,一会儿一个字符占用两个字节,还有些生僻字占用三个及以上的字节。可以根据传输文件数据的大小动态调整编码位数。
UTF-16:占2-4个字节Byte,16-32位bit;
UTF-32:占4个字节Byte,32位bit;
Unicode编码:占4个字节Byte,32位bit。超出ASCII码编码范围的就可以用Unicode编码了,它将不同国家(美中日韩等)的字符进行统一,解决了超出ASCII编码范围之外的其他国家字符编码的统一问题;世界标准编码
所有的操作系统都支持Unicode,所有存到内存中的0101序列都是由Unicode来存储的。
URL编码:URL的编码方式。
当需要在内存中读取文件的时候,此时将utf-8编码的内存转换为unicode编码,在内存中进行统一处理;当需要保存文件的时候,出于空间和传输效率的考虑,此时将unicode编码转换为utf-8编码。