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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

commons-lang的FastDateFormat性能测试

commons-lang的FastDateFormat是一个thread-safe的&#xff0c;对SimpleDateFormat的一个重新实现。 SimpleDateFormat为什么不是thread-safe的呢&#xff1f;看一下具体实现就知道了&#xff0c;其父类中定义了成员变量Calendar&#xff0c;每次格式化日期时都会先重置这个Cal…

C——Flowers

Problem Description As you know, Gardon trid hard for his love-letter, and now he’s spending too much time on choosing flowers for Angel. When Gardon entered the flower shop, he was frightened and dazed by thousands kinds of flowers. “How can I choose!”…

include函数_include()函数以及JavaScript中的示例

include函数includes() is a predefined function in JavaScript, which is used to check whether a given element exists in the array or not? include()是JavaScript中的预定义函数&#xff0c;用于检查数组中是否存在给定元素&#xff1f; Example: 例&#xff1a; &l…

利用POI创建OpenOffice中的Excel文件

之所以称为OpenOffice的Excel文件,我发现了一个特点就是: 一些网站严格限定了文件必须为MS的Excel格式的话,用POI的HSSF创建的Excel就会不识别.不知道是什么原因,可能是版本的问题,据说HSSF(令人讨厌的电子表格格式)生成的是MS97的格式.但是97-2003的提示中明显的说明了MS的lib…

批处理文章集锦

http://www.5dmail.net/html/2005-10-17/20051017181702.htmhttp://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html转载于:https://www.cnblogs.com/Jessy/archive/2012/02/29/2372955.html

web安全-----CSRF漏洞

简述 CSRF&#xff1a;Cross-site request -forgery&#xff0c;跨站请求伪造&#xff0c;是一种web攻击方式&#xff0c;是由于网站的cookie在浏览器中不会过期&#xff0c;只要不关闭浏览器或者退出登录&#xff0c;那以后只要访问这个网站&#xff0c;都会默认你已经登录。…

java math 类_Java Math类静态长轮(double d)示例

java math 类数学课静态长回合(双D) (Math Class static long round(double d) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the closest long value to the given argument. 此方法用于将最接近的long值返回…

C——求平均成绩

Problem Description 假设一个班有n(n<50)个学生&#xff0c;每人考m(m<5)门课&#xff0c;求每个学生的平均成绩和每门课的平均成绩&#xff0c;并输出各科成绩均大于等于平均成绩的学生数量。 Input 输入数据有多个测试实例&#xff0c;每个测试实例的第一行包括两个…

依赖、关联、聚合、组合还有泛化的关系(转载)

依赖、关联、聚合、组合还有泛化的关系 此文为转载文章:http://zjzkiss.cnblogs.com/世界是普遍联系的&#xff0c;因此程序世界中的类&#xff0c;也不可能是孤立的。UML为我们定义了它们之间的关系&#xff0c;就是&#xff1a;依赖、关联、聚合、组合还有泛化。 泛化关系比…

神奇的LINQ ---可以通过对象来查询数据

摘要&#xff1a; linq:在一个新项目里面要用这个技术&#xff0c;然后自己拿起书看了下&#xff0c;记录下自己的新发现&#xff0c;只适合简单入门的新童鞋看呀&#xff01;&#xff01;&#xff01; 结论&#xff1a; linq是对象领域与数据领域的一个桥梁。 为什么会出现Lin…

java math.cos_Java Math类静态double cos(double d)示例

java math.cos数学类静态双cos(double d) (Math Class static double cos(double d)) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the trigonometric cosine of an angle of the given parameter in the meth…

web安全---SSRF漏洞

简介 SSRF&#xff1a;服务器请求伪造&#xff0c;是一种攻击者构造形成由服务端发起请求 的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外网隔离的内部系…

集合——对象数组(引用数据类型数组)

案例&#xff1a;我有5个学生&#xff0c;请把这个5个学生的信息存储到引用数据类型数组中&#xff0c;并遍历数组&#xff0c;获取得到每一个学生的信息。 思路分析&#xff1a;首先&#xff0c;想要创建学生对象&#xff0c;就得有学生这个类&#xff0c;所以&#xff0c;首…

提升应用视觉Android效果的10个UI技巧

在Android应用开发中&#xff0c;风格和设计或许不是最关键的要素&#xff0c;但它们在决定Android应用成功与否上确实扮演重要的角色。以下是10个Android应用的UI设计技巧&#xff0c;还有个附加技巧&#xff0c;能够提供你的Android应用的视觉吸引力。 技巧1&#xff1a;使用…

kotlin中判断字符串_Kotlin程序查找字符串中字符的频率

kotlin中判断字符串Given a string and a character, we have to find the frequency of the character in the string. 给定一个字符串和一个字符&#xff0c;我们必须找到字符串中字符的频率。 Example: 例&#xff1a; Input:string "IncludeHelp"character to…

OD使用

0x01 功能界面 序号1是汇编代码对应的地址窗口序号2是汇编对应的十六进制机器码窗口序号3是反汇编窗口序号4是反汇编代码对应的注释信息窗口序号5是寄存器信息窗口序号6是当前执行到的反汇编代码的信息窗口序号7是数据所在的地址序号8是数据的十六进制编码信息&#xff0c;序号…

windows mobile 开发总结--菜单

在开发时经常要创建菜单&#xff0c;并且动态显示和隐藏菜单或者是某个子菜单。以下就是实现的方法&#xff1a; 1。创建并显示菜单,先在资源里添加菜单&#xff0c;然后如下代码 SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSizesizeof(SHMENUBAR…

Java——集合的概述

* A&#xff1a;集合的由来* 数组是容器&#xff0c;集合也是容器* 数组的弊端&#xff1a;数组的长度是固定的&#xff0c;当添加的元素超过了数组的长度时&#xff0c;需要对数组重新定义&#xff0c;太麻烦* Java内部给我们提供了集合类&#xff0c;可以存储任意对象&#x…

排序算法中平均时间复杂度_操作系统中的作业排序(算法,时间复杂度和示例)...

排序算法中平均时间复杂度作业排序 (Job sequencing) Job sequencing is the set of jobs, associated with the job i where deadline di > 0 and profit pi > 0. For any job i the profit is earned if and only if the job is completed by its deadline. To complet…

python---文件处理

0x01 打开一个文件 python中内置了文件对象&#xff0c;通过open()函数就可以制定模式打开指定文件&#xff0c;并创建文件对象。该函数的格式如下&#xff1a; open(file[,moder[,buffering-1]])file&#xff1a;指定要打开或创建的文件名称&#xff0c;如果该文件不存在当前…