H

XSS 漏洞相关

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

XSS 漏洞相关​

1 定义及原理​

XSS(跨站点脚本攻击),浏览器使用用户的内容输入作为脚本,并执行恶意功能。这种针对用户浏览器的攻击,即跨站点脚本攻击
它主要分为三种:
反射类型
存储类型
DOM类型
XSS危害:
偷饼干
窃取帐户
恶意软件下载
键盘记录
广告流量

2 反射型 XSS​

2.1 原理​

应用程序或API包含未经验证和未经转义的用户输入,直接作为 HTML 输出的一部分。成功的攻击使攻击者可以在受害者的浏览器中执行任意HTML和JavaScript。
功能:非持久性,用户必须单击带有特定参数的链接才能引起它。
影响范围:只有执行脚本的用户。

3 存储型 XSS​

3.1 原理​

存储XSS是指通过Web请求获得不信任数据的应用程序。在不验证数据是否具有XSS代码的情况下,它将为存入数据库。下次从数据库中检索数据时,该程序还会再次执行XSS代码,并且存储的XSS可以继续攻击用户。
出现存储XS:
留言板
评论区域
用户个人资料图片
个人签名
博客

4 DOM 型 XSS​

4.1 原理​

4.1.1 DOM​

DOM模型使用未对其进行过滤代表文档。每个分支的终点是一个节点,每个节点包含对象。 DOM方法允许您以特定方式操作这棵树。使用这些方法,您可以更改文档的结构,样式或内容。
20210110100040.png-water_print

4.1.2 DOM XSS​

DOM Type XSS实际上是反射XSS的特殊类型。它动态逻辑树JS 操作 DOM 树,而无需将数据提交到服务器端。它是基于DOM文档对象模型的漏洞。
1
2
3
4
5
6
7
html
身体
脚本
document.write('scriptalert(1)\/script')
/脚本
/身体
/html

4.1.3 示例​

首先,这是DOM XSS。这样做的原因是JS代码动态拼接了与此类似的代码:
1
$('head')。附录('meta'+text+'/meta')
以下POC是一个例子:
20210110135714.png-water_print

您可以看到DIV中的代码由HTML实体编码,但最终结果仍将弹出。
20210110135839.png-water_print

原因是不会执行InnerHTML中输入的代码。
例如,您可以根据以下代码动态插入DOM节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
!doctype html
!doctype html
html lang='en'

meta charset='utf-8'
meta http-equiv='x-ua兼容'content='ie=edge'
meta name='viewport'content='width=设备宽度,初始尺度=1.0'
标题XSS POC/标题
/头
身体
div ID='demo'lt; scriptgt; arter`1`lt;/scriptgt;/div
脚本src='https://libs.baidu.com/jquery/2.1.1/jquery.min.js'/script
br
DIV ID='test'/div
脚本
document.getElementById('test').InnerHtml=document.getElementById('demo').InnerHtml +''';
/脚本
/身体
/html
您会发现DIV ID=测试标签将不会执行,但是像JQuery这样的框架将在插入时将节点的标签评估放置,以便可以执行它,因为Append()方法本身就是允许执行插入的元素,该元素具有此要求。

4.1.4 与反射型 XSS 的异同与危害​

输出数据到页面所有输入都无法很好地控制,并且JavaScript脚本输入被插入输出时,将其插入HTML页面。
反射XSS为同:之后,异:,页面参考后端输出将生效。
DOM XSS在JS之后插入到DOM树经过后端语言之后。
直接操作前端和后端分开,没有WAF检测。

5 伪协议与编码绕过​

5.1 伪协议​

伪协议与互联网上广泛使用的伪协议不同,例如http://、3https//,ftp: //在URL中使用以执行特定功能
数据伪协议:
data:Text/html; base64,phnjcmmlwdd5hbgvydcgxkts8l3njcmmlwd4=
JavaScript伪协议:
Javascript3:Alert('1')
20210110102339.png-water_print

5.2 编码绕过​

5.2.1 UNICODE 编码​

ISO(国际标准组织)制定了一种编码,其中包含地球上所有文化中的所有字母和符号。它使用危害性:代表角色
Unicode只是一个符号集。它仅指定符号的二进制代码,但未指定应如何存储此二进制代码。特定存储是通过以下方式实施的:UTF-8,UTF-16,等。
20210110102858.png-water_print

5.2.2 浏览器解码​

解析HTML文档时有三个主要处理过程:
HTML解析并创建DOM树,URL解析和JavaScript解析。每个解析器负责解码和解析HTML文档的相应部分,并且该顺序也不同。

5.2.3 HTML 解析过程​

5.2.3.1 解析过程​

两个字节void Elements,包括区域,基础,BR,BR,COL,COLS,命令,嵌入,HR,IMG,IMG,IMG,IMG,KEYGEN,KEYGEN,LINK,META,META,参数,源,源,轨道,轨道,WBR,WBR等。
原始文本元素,带有脚本和样式
RCDATA元素,包括Textarea和标题
外国元素,例如MATHML名称空间的元素或SVG名称空间
基本元素,即以上4个元素以外的元素
HTML 有 5 类元素:空元素,无法容纳任何东西(因为它们没有封闭的标签,可以放置任何内容的开始标签的中间和封闭标签)。
可以容纳文本的原始文本元素。
可以容纳文本和字符引用的rcdata元素。
可以容纳文本,角色参考,CDATA段,其他元素和评论的外部元素
可以容纳文本,字符引用,其他元素和评论的基本元素
HTML解析器以状态计算机方式运行,该方式将字符从文档输入流和根据其转换规则过渡到不同状态的字符。
20210110212335.png-water_print

以以下代码为例:
1
2
3
4
5
html
身体
这是Geekby的博客
/身体
/html
初始状态是“数据”状态。当遇到角色时,状态将变为“打开”状态。使用A-Z读取字符将产生起始标签符号,并且状态将相应地更改为“标签名称”状态。该状态一直存在直到被读取为止。每个字符都附在此符号名称上。在示例中,创建了HTML符号。
读取时,当前符号已完成。目前,状态返回到“数据”状态,并且身体标签重复此处理过程。目前,识别HTML和身体标签。现在,返回“数据”状态,然后读取“这是Geekby的博客”中的每个字符以生成字符符号。
这样,直到您在/身体中遇到。现在,我们返回“标签打开”,读取下一个字符/,输入“关闭标签打开”,创建一个封闭的标签符号,并将状态转移到“标签名称”状态,并仍然维护此状态,直到我们遇到它为止。然后,生成一个新的标记符号并返回到“数据”状态。以下封闭的标签处理过程与上述相同。
信息
HTML解析器位于五类元素的区别如下:数据状态(Data State),字符实体将被解码为相应的字符。
例子
1
Div#60; img src=x OneError=arter(4)#62;/div
并被编码为性格实体;
当HTML解析器完成解析DIV时,它将输入数据状态并发布标记令牌。
然后,当解析实体#60;
以下#62;被解码为相同的原理。
问题
解码后,IMG是否会被解析为HTML标签并导致JS执行?
由于使用字符引用后,解析器不会转换为标签打开状态,因此不会在不输入标签打开状态的情况下以HTML标签发表。因此,没有创建新的HTML标签,它仅作为数据处理。

5.2.3.2 几种特殊情况​

原始文本元素
在HTML中,有两个标签属于原始文本元素:脚本和样式。原始文本元素类型标签下的所有内容块都属于该标签。
原始纺织类型标签下的所有字符实体编码都不会被HTML解码。当HTML解析器解析器解析到脚本和样式标签的内容块(数据)一部分时,该状态将输入脚本数据状态,这不是我们前面提到的DECODE DECODE DECODODED CARY ENTITITITITITITS的三个状态。
因此,脚本#97;#108;#101;#114;#116;#57;#57;#57;#57;#57;#57;#57;#57;#57;#57;#57;#57;#57》;#5;#5;#5;
RCDATA情况
在HTML中,有两个标签属于RCDATA:Textarea和Title。
RCDATA元素类型的标签可以包含文本内容和字符实体。
当解析器解析TextArea和标题标签的数据部分时,该状态将输入RCDATA状态。
正如我们前面提到的,当在RCDATA国家处,角色实体将被解析器解码。
例子
1
textarea#60;脚本#62; arter(5)#60;/脚本#62;/textarea
解析时解析它们
但是,内部的JS不会执行,因为解码的字符实体机器将不会输入标签打开状态,因此内部的脚本不会被解释到HTML标签中

5.2.4 JavaScript 解析​

是Unicode字符逃脱序列还是像\ uxxxx这样编码的十六进制取决于情况。
首先,JavaScript中有三个地方可以显示Unicode字符逃脱序列:
在字符串中
当Unicode逃生序列出现在字符串中时,它仅被解释为普通字符而不会破坏字符串的上下文。
例如,scripttalet('\ u0031 \ u0030');/script
编码的逃逸部分为10,这是一个字符串,将正常解码,并且将执行JS代码。
在标识符中
如果Unicode逃脱序列存在在标识符中,即变量名称(例如函数名称等),则将被解码。
例如,脚本\ u0061 \ u006c \ u0065 \ u0072 \ u0074(10);/script
编码的逃逸部分是警报字符,即函数名称,属于标识符,因此将正常解码并将执行JS代码。
控制字符
如果一个Unicode逃脱序列存在于对照字符中,则将被解码但不解释为控制字符,而将其解释为标识符或字符串字符的一部分。
控制字符是',',(),等。
例如,scripttalet_u0028'xss');/script(用Unicode编码,然后解码后不再用作控制字符,而是标识符警报的一部分(。
因此,在被Unicode逃脱后,无法正常解释函数括号之类的控制字符。
例子
1
脚本\ u0061 \ u006c \ u0065 \ u0072 \ u0074 \ u0028 \ u0031 \ u0031 \ u0031 \ u0029/script
编码零件是警报(11)。此示例中的JS将不执行,因为控件字符已编码。
1
脚本\ u0061 \ u006c \ u0065 \ u0072 \ u0074(\ u0031 \ u0032)/脚本
编码的零件是警报,在括号中有12个。在此示例中,将不会执行JS,因为括号中的编码部分无法正常解释。要么使用ASCII数字,要么添加''或''将其制成字符串,作为字符串,它只能用作普通字符。
1
ScriptTalet('13 \ u0027)/脚本
编码为'。由于控制字符已编码,因此不会执行此示例的JS,并且解码的“将成为字符串的一部分,并且不再将其解释为控制字符。因此,在此示例中,字符串是不完整的,因为没有'可以结束字符串。
1
ScriptTalet('14 \ u000a')/脚本
该示例的JS将被执行,因为编码的部分在字符串中,并且只会被解释为正常字符,并且不会突破字符串上下文。

5.2.5 URL 解析​

URL解析器还被建模为状态机,并且文档输入流中的字符可以直接针对不同状态。
首先,重要的是要注意,URL的协议部分必须是ASCII字符,也就是说,它不能以任何方式进行编码,否则URL解析器的状态机将输入无方案状态。
例子
1
a href='%6A%61%76%61%73%63%72%69%70%74:%61%6C%65%72%74%74%28%31%29%/a
编码部分的URL是JavaScript:Alert(1)。 JS将不会执行,因为将JavaScript字符串作为方案部分进行编码,从而导致URL解析器状态机进入无方案状态。
URL中的:不能以任何方式编码,否则URL解析器的状态机也将输入NO方案状态。
例子
1
a href='javaScript%3aAlert(3)/a
由于将:编码为%3A,因此URL状态机将进入无方案状态,而JS代码无法执行。
例子
1
a href='#x6a;#x61;#x76;#x61;#x73;#x63;#x72;#x69;#x69;#x70;#x70;#x74;%61%61%6C%65%65%72%72%74%74%28%28%32%29%29''29'''''
JavaScript此字符串是用实质编码的,未编码,警报(2)在URL中编码。可以成功执行。
首先,在HTML解析器中,当HTML状态机在属性值状态时,字符实体将被解码。这是在HREF属性中,因此编码的JavaScript字符串将被解码。
其次,HTML解析是在URL解析之前,因此在URL解析之前,该方案部分中的JavaScript字符串已被解码,并且不再是实体编码的状态。

5.2.6 解析顺序​

首先,当浏览器收到HTML文档时,HTML解析器将触发到HTML文档的词汇解析。此过程完成HTML解码并创建一个DOM树。
接下来,JavaScript解析器将干预解析Inline脚本,该脚本完成了JS的解码。
如果浏览器遇到了URL需要URL的上下文环境,则URL解析器还将干预完成URL解码工作。 URL解析器的解码顺序根据URL位置的不同,并且可以在JavaScript解析器之前或之后进行解析。 HTML解析始终是第一步。
URL解析和JavaScript解析,它们的解析令取决于情况。
例子
1
href='userInput'/a
在此示例中,字符实体首先通过HTML解析器解码userInput零件;
然后,URL解析器解码用户input;如果URL的方案部分是JavaScript,则JavaScript解析器将再次解码UserInput。因此,解析顺序是:HTML解析- url解析- 贾瓦语解析。
例子
1
a href=#onclick='window.open('userInput')/a
在此示例中,字符实体首先通过HTML解析器解码userInput零件;
然后,JavaScript解析器将解析JS的OnClick部分并执行JS;
执行js后,窗口的参数('userInput')函数将传递到URL中,因此URL解析器将解码USERINPUT部件。
因此,解析顺序为:HTML解析- JavaScript解析和g
 
后退
顶部