XSS注入原理以及一些绕过姿势

XSS注入原理以及一些绕过姿势介绍 XSS 跨站脚本攻击 通过这个攻击手段 攻击者可以将恶意的 JavaScript 代码插入存在 XSS 漏洞的 Web 页面中 当用户浏览带有恶意代码的页面时 这些恶意代码会被触发 从而达到攻击的目的 可以说 XSS 是针对用户层面的攻击 XSS 的分类通常 我们吧 XSS 分为三个类型 即存储型 反射型与 DOM 型 不同的类型原理各有差异 而且注入的点也不同 存储型存储型的 XSS 最大的特点是可持久化 因为在过滤条件差的情况下 存储型的 XSS 的恶意代码会直接被保存在服务器端的数据库中 而这个恶意

介绍

XSS——跨站脚本攻击。通过这个攻击手段,攻击者可以将恶意的 JavaScript 代码插入存在 XSS 漏洞的 Web 页面中,当用户浏览带有恶意代码的页面时,这些恶意代码会被触发,从而达到攻击的目的。可以说,XSS 是针对用户层面的攻击。

XSS的分类

通常,我们把 XSS 分为三个类型,即 存储型反射型DOM型。不同的类型原理各有差异,而且注入的点也不同。

存储型

存储型的 XSS,最大的特点是可持久化,因为在过滤条件差的情况下,存储型的 XSS 的恶意代码会直接被保存在服务器端的数据库中。而这个恶意代码被服务器读出输出到用户端的Web页面时,恶意代码会执行,从而达到攻击的目的。可以说存储型 XSS 是影响范围最大的 XSS。通常出现在评论、文章发表等可由用户输入,并随着服务器读出的地方,容易造成蠕虫,盗窃cookie等严重影响。

攻击流程大概是这样的:

攻击者在正常服务器中注入XSS代码,且被服务器储存在了数据库中 用户在网站登录状态下,访问了恶意服务器,且浏览了存在恶意脚本的页面 正常服务器将页面信息与XSS脚本一同返回 客户端解析了页面信息与XSS脚本代码,这时脚本代码会被执行,甚至会向攻击者的恶意服务器主动发起请求 此时,攻击者就可以从自己的恶意服务器中读取用户数据 

反射型

非持久化,且需要使用钓鱼等手段欺骗用户点击恶意链接才能触发恶意代码。一般反射型 XSS 会出现在搜索页面,且大多数是用来获取用户的 cookie 信息的。虽然影响范围最大的是存储型的 XSS,但是现在针对存储型 XSS 的防御非常完备,所以在利用上,反射型的利用率还是比存储型高些。

攻击流程大概是这样的:

攻击者发送带有XSS恶意的脚本链接给客户(该链接是正常服务器存在注入点的链接,且带着我们注入的内容) 客户点击了恶意链接并访问了正常服务器 服务器将XSS与页面信息返回客户端 客户端解析后请求恶意服务器 攻击者读取用户信息 

DOM型

DOM 型的 XSS 注入与反射型原理类似,只不过 DOM 型的 XSS 注入不需要经过后端代码处理,而是在前端 JavaScript 调用 DOM 元素时可能产生的漏洞,可能触发 DOM 型 XSS 的 JavaScript 代码:

document.referer 返回跳转或打开到当前页面的页面的URI window.name 可设置或返回存放窗口的名称的一个字符串 location 可以设置窗口跳转或者返回当前窗口的地址 innerHTML 内嵌HTML代码 documen.write 页面内写入字符 

综上存储型的 XSS 危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,只要被攻击者访问了该页面就会遭受攻击。而反射型和 DOM 型的 XSS 则需要我们去诱使用户点击我们构造的恶意的URL,需要我们和用户有直接或者间接的接触,比如利用社会工程学或者利用在其他网页挂马的方式。

XSS的危害

请添加图片描述

XSS的注入

<div> user input  
      div> 

可以用

 
      div><script>[XSS] 
       script><div> 

的手法进行注入,此时,代码就会变成以下这种形式

<div> 
      div> <script>[XSS] 
       script> <div> 
        div> 

XSS的注入与一些绕过

前端代码:

<html> <head lang="en"> <meta charset="UTF-8"> <title>XSS测试 
      title>  
       head> <body> <form action="xss.php" method="post"> 你试试: <input type="text" name="test" /> <br/> <input type="submit" value="提交">  
        form>  
         body>  
          html> 

后端代码:

 
     $text=$_POST["test"]; echo $text; ?> 

接下来我们来分析一下防御与绕过
一般来说,我们可以通过一些函数将 XSS 的某些关键字符过滤,如 preg_replace(),来防止注入。但是攻防是不断发展的,有防御,自然就有绕过,下面整理一下一些防御与绕过的姿势。

过滤引号 ‘’ 或 “”

 
      $text=$_POST["test"]; if($text!=null){ 
       $text=preg_replace("/'/","",$text); //过滤' $text=preg_replace("/\"/","",$text); //过滤" echo $text; } ?> 

过滤script标签

 
      $text=$_POST["test"]; if($text!=null){ 
       $text=preg_replace("/,"",$text); //过滤 $text=preg_replace("/<\/script>/","",$text); //过滤 echo $text; } ?> 

过滤script标签(不区分大小写)

 
      $text=$_POST["test"]; if($text!=null){ 
       $text=preg_replace("/,"",$text); //过滤 $text=preg_replace("/<\/script>/i","",$text); //过滤 echo $text; } ?> 

过滤script标签(不区分大小写,过滤script及其之间的所有内容)

 
      $text=$_POST["test"]; if($text!=null){ 
       $text=preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $text); //过滤了

服务器端代码存在 url 解码的情况

 
      $text=$_POST["test"]; if($text!=null){ 
       $text=preg_replace("/ 
      ,"<",$text); //将 
       <转化为html实体< span=""> 
        $text 
        = 
        preg_replace 
        ( 
        "/>/" 
        , 
        ">" 
        , 
        $text 
        ) 
        ; 
        //将>转化为html实体 
        $text 
        = 
        urldecode 
        ( 
        $text 
        ) 
        ; 
        echo 
        $text 
        ; 
        } 
        ? 
        > 
       

其他XSS注入标签

之前的演示中使用的都是 标签,但是能利用 XSS 的恶意脚本中可使用的标签远远不止 标签。

下面列举其中某些常见的 XSS 注入方式

真实场景中遇到的 XSS 注入语句远不止这么点,这里不多赘述

使用某些标签的on方法

  

使用html实体编码绕过变形

 

使用 src 的方式在script标签中使用 Data URI scheme 直接嵌入文本

 

在 iframe 标签中使用 Data URI scheme 直接嵌入 BASE64 编码后的文本

 

使用html实体编码 BASE64 编码之后的 Data URI scheme

  

XSS的防御

对于 XSS,总体的防御思路大概是:

对用户的输入(和URL参数)进行过滤,对输出进行html编码。

也就是对用户提交的所有内容进行过滤,对 url 中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。

对输入的内容进行过滤,可以分为黑名单过滤和白名单过滤。黑名单过滤虽然可以拦截大部分的 XSS 攻击,但是还是存在被绕过的风险。白名单过滤虽然可以基本杜绝 XSS 攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。

对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。

在PHP中通常使用 htmlspecialchars 函数对用户输入的name参数进行html编码,将其转换为html实体。这个方法可以直接将‘<’,‘>’等与 XSS 有关的内容进行实体化,可以阻挡绝大多数 XSS 的攻击。

我们还可以服务端设置会话 Cookie 的 HTTP Only 属性,这样,客户端的 JavaScript 脚本就不能获取 Cookie 信息了

总结

以上就是我找到的一些绕过技巧。到这里我想说两句,针对不同的情况,绕过的手段是不同的,具体情况还是得具体分析。只要是人写出来的代码,总会有一定的漏洞,绕过与修补就是系统安全性不断提高的一个过程,只要不断学习,总会发现代码中可以被绕过的地方。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229002.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:42
下一篇 2026年3月16日 下午5:42


相关推荐

  • java 自行车_JAVA 2020款山地车盘点[通俗易懂]

    java 自行车_JAVA 2020款山地车盘点[通俗易懂]最近,笔者为大家带来了不少有关顶尖山地车型的文章,不少的观众老爷直呼看看就好,那今天我们就来看看入门山地车。JAVA作为近几年迅速崛起的国产品牌,推出的一系列产品中带着鲜明的“JAVA”风格。在山地市场上,JAVA主打入门车型,今天就让我们来看一看JAVA旗下的那些山地车。对啦,以下车型均可在JAVA旗舰店购买到哦。JAVAANIMA售价仅4500元的ANIMA采用JAVAADVANCENA…

    2022年7月7日
    87
  • DATETIME类型和BIGINT 类型互相转换

    DATETIME类型和BIGINT 类型互相转换

    2021年11月26日
    44
  • python和delphi哪个好_python编程时如何修改撤回

    python和delphi哪个好_python编程时如何修改撤回原博文2020-03-2818:10−复制行,在代码行光标后,输入Ctrl+d,即为复制一行,输入多次即为复制多行撤销上一步操作:Ctrl+z为多行代码加注释#代码选中的条件下,同时按住Ctrl+/,被选中行被注释,再次按下Ctrl+/,注…0319相关推荐2019-12-2423:37−djangoTermipython:manage.pymakemigrati…

    2022年8月27日
    10
  • 用JavaSocket编程开发聊天室,附超详细注释

    用JavaSocket编程开发聊天室,附超详细注释用JavaSocket编程开发聊天室大二下册的JavaWeb课程设计,使用的是eclipse。一、实现功能登录:用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。群聊:可以实现群聊(聊天记录显示在所有客户端界面)。好友列表:完成好友列表在各个客户端上显示。私聊:可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,接受私聊消息方可以直接弹出消息框。踢人:服务器能够群发系统消息,能够强行让某些用户下线。更新:客

    2022年6月16日
    31
  • 重定向stdout到文件

    重定向stdout到文件把 stdout 重定向到文件两种方法 第一种方法没有恢复通过 freopen 把 stdout 重新打开到文件 code java includeFILE stream voidmain void stream freopen freopen out w stdout 重定向 if stream

    2026年3月17日
    2
  • 指令周期,时钟周期,总线周期概念辨析图_总线周期是指

    指令周期,时钟周期,总线周期概念辨析图_总线周期是指《指令周期、时钟周期、总线周期概念辨析》由会员分享,可在线阅读,更多相关《指令周期、时钟周期、总线周期概念辨析(2页珍藏版)》请在人人文库网上搜索。指令周期、时钟周期、总线周期概念辨析在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。通常用内存中读取一个指令字的最短时间来规定CPU周期,(也就是计算机通

    2022年10月10日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号