web安全---浏览器解析提交数据的过程

解码规则
  1. html解析器对html文档进行解析,完成解析并创建DOM树
  2. JavaScript或者CSS解析器对内联脚本进行解析,完成js、css解码
  3. url解码会根据url所在的顺序不同而在JS解码或者解码后
解码顺序

html解析第一步执行,而JS解析和URL解析则要根据情况而定

HTML解析器
1、html解析器以状态机的方式运行

状态流程图为:
在这里插入图片描述
即:Data—》Tag open----》Tag name —》Data

注意:如果我们的标签是在Data状态下被解析出来的,那么标签将作为一种文本输出来,
举例:<p>Hello<p>
初始状态为Data state ,当遇到<时,状态转为 Tag open,读取a-z某个字符创建开始标签,然后状态变为Tag name ,知道读取到>,状态变为Data,接着读取到H会识别并生成一个字符,相应得会为Hello中的每个字符生成一个字符符号,之后遇到<,又变为Tag open,读取到/则会创建一个闭合标签,并将状态改为Tag name,直到遇到>,后回到Data state。

注意:HTML解析器处于Data State、RCDATA State 、Attribute Value State(属性值),字符实体会被解码为对应的字符

2、原始文本元素

特性:该元素标签中的实体不会被HTML解码
标签:script,style
举例:标签中的实体字符不会被html解码,因此不会执行js

<script>alert&#40;&#49;&#41;</script>
3、RCDATA 元素

特性:html解析器遇到该元素标签时,会进入RCDATA状态,实体字符会被解析器解码
标签:textarea、title
举例:字符实体会被解码,但是不会执行JS,因为没有进入Tag open状态,其中<script>不会被解释为HTML标签

<textarea>&lt;script&gt;alert&#40;&#49;&#41;&lt;/script></textarea>
解码得到<textarea><script>alert(1)</script></textarea>

JavaScript解析器

JavaScript中有三个地方可以出现JS编码
1、字符串

<script>alert(“\u0031);</script>
被编码的为1且是字符串,可以正常解码并触发执行

2、标识符

<script>\u0061\u006c\u0065\u0072\u0074(1);</script>
被编码的部分为alert字符,是函数名,属于在标识符中的情况,因此会被正常解码并执行JS

3、控制符
包含:单引号、双引号、括号等
特性:能被解码但不会解释为控制字符,即失去特殊意义,只会被当做标识符或字符串的一部分

<script>alert\u0028″xss”);</script>
\u0028会被解码为( 但是不会触发JS,因为是控制符

URL解析器

1、URL的协议部分必须为ASCII字符、否则URL解析器的状态机将进入No Scheme状态

<a href="%6a%61%76%61%73%63%72%69%70%74:alert(1)"></a>
url编码部分为javascript,因为作为协议部分的"javascript"被编码,故不会触发JS

2、url中的符号不能被以任何形式编码

<a href="javascript%3aalert(1)"></a>
:被url编码为%3a,导致url状态机进入No Scheme状态,故不会触发JS

3、当javascript没有被编码时

<a href = "javascript:alert(3)">hhhhh<a>

JS编码:

<a href="javascript:\u0061\u006c\u0065\u0072\u0074(3)">hhhhhh</a>

再对JS编码来一个URL编码

<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">hhhhhh</a>

这个是可以成功执行的,当HTML解析到href时,交给URL处理,URL发现了javascript:,把后面的数字解码后交由JavaScript处理,所以会弹出

例子

<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">hhhh</a>
URL encoded "javascript:alert(1)"	//冒号(:)没有被编码
Answer: The javascript will NOT execute.

HTML没有编码,不用考虑,根据href,URL模块处理,但是协议没办法识别(即编码的JavaScript:),URL会解码出来,但JS不会被执行,所以url编码的XSS,javascript:一定不能被url编码,编码后无法识别,js还是不能执行

在这里插入图片描述

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">
Character entity encoded "javascript" and URL encoded "alert(2)"
Answer: The javascript will execute

HTML先解码得到:

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

href中为URL,URL模块可识别为javascript协议,进行URL解码,得到

<a href="javascript:alert(2)">

由于是javascript协议,解码完给JS模块处理,于是被执行

<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>
Character entity encoded < and >
Answer: The javascript will NOT execute.

当HTML解析到&#60;时,此时的状态为Data,会被解码,但是不能创建img标签,因为不是Tag open状态,所以解码后被当做文本,不会执行

<button onclick="confirm('7&#39;);">Button</button>
Character entity encoded '
Answer: The javascript will execute.

这里onclick中为标签的属性值,会被HTML解码,得到

<button onclick="confirm('7');">Button</button>

然后被执行

<button onclick="confirm('8\u0027);">Button</button>
Unicode escape sequence encoded '
Answer: The javascript will NOT execute.

不需要HTML解码,onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,'显然不行,JS执行失败。

<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
Character entity encoded alert(9);
Answer: The javascript will NOT execute.

不会被执行,script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,JS也认不出来,执行失败

参考链接

https://blog.csdn.net/baidu_38844729/article/details/109328472
https://xz.aliyun.com/t/5863

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值