xss-csrf

xss和csrf的关系

  • xss(跨站脚本攻击)

    • 简介

    跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

    • xss分类

      • 反射型

      <非持久化>攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

      • 存储型

      <持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie

      • DOM型XSS

        dom型xss是一种基于页面dom树而造成的漏洞,后端没有关系,通过拼接用户的输入不经过服务器,而直接输出拼接成恶意攻击代码。

    • 漏洞原理

    xss的实质是没有对用户的输入进行转义,而当成代码来执行的。是一种注入网页前端代码的"艺术",常用语言是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。

    • 漏洞利用

      1、盗用cookie,获取敏感信息。
      2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
      3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
      4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

    5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

    • 漏洞注入测试语句和绕过

      • xss绕过

        • 如果script大小写被过滤

          1. 则使用 <img src=1 οnerrοr=alert(1)>

            表示插入一个图片 图片路径错误无法显示 onerror事件 触发

          2. 构造a标签,使其中的script进行HTML字符实体转换

            使用url编码也可以
            t 转换为 t
            则可以使用伪协议:javascript:alert(1)

          3. ">[haha

            如果是输出在a标签中则可直接使用 javascript:alert(1)

          4. script中间插入制表符img

            这里使用 &#x9
            "><a href="java&#x9script:alert(1)

        • Alert被过滤 可以使用confirm()、prompt()

        例 :

        <script>confirm()</script>
        
        • 利用javascript:伪协议绕过

          实例:

          "><iframe src=javascript:alert(1)>
          “><a href="javascript:alert(1)">haha</a> 或者:”><a href="javascript:alert(1)">haha
        
          <input name=keyword value=" "><a href="javascript:alert(1)">haha</a>">
           <input name=keyword value=" "><a href="javascript:alert(1)">haha">
        
        • 如果()不能用 可以用 反引号如果 空格被过滤可以使用 %0a 或 %0d 或/**/
        • 如果是被 加了反斜杠 \ l过滤 双引号 这种过滤

          过滤 双引号:在alert中实体转换alert("XSS")
          使用JavaScript的fromCharCode函数绕过过滤

        <IMGSRC=javascript:alert(String.fromCharCode(88,83,83))>
        
        使用没有双引号的:
        <IMG SRC=javascript:alert(‘XSS’)>
        
        • xss宽字节绕过

          宽字节绕过的条件:
          返回页面·是GBK/GB2312编码的;
          通过构造UNicode字符让双引号逃逸出来。
          例如:

        %c1\会被认为一个UNicode字符

        • 使用注释符绕过长度限制;

          情况一:

          例如两个文本框,input元素,限制了长度不允许写入更多东西,这时候可以使用注释符绕过

          <inuput id=1 type="text" value=""/>
          xxxxxxxxx
          <input id=2 type="text" value=""/>
          

          方法:

          在第一个input框中输入

          "><!--
          

          在第一二个框中输入

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

          最终效果;

          <inuput id=1 type="text" value=""><! --" />
          xxxxxxxx
          <input id=2 type="text" value="--><script>alert(/xss/);</script"/>
          
        • 绕过magic_quotes_gpc()

          magic_quotes_gpc=ON是php中的安全设置,开启后会把一些特殊字符进行轮换,比如’(单引号)转换为\’,”(双引号)转换为\”,\转换为\

          比如:<script>alert(“xss”);</script>会转换为<script>alert(\”xss\”);</script>,这样我们的xss就不生效了。

          针对开启了magic_quotes_gpc的网站,我们可以通过javascript中的String.fromCharCode方法来绕过,我们可以把alert(“XSS”);转换为
          String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34,41)那么我们的XSS语句就变成了

          <script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88,83, 83, 34, 41, 59)</script>
          

          String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。
          最后使用<script>转换后的放到这里</script>包含即可

        • 使用编码绕过xss

          • 使用hex编码绕过

            我们可以对我们的语句进行hex编码来绕过XSS规则
            比如:可以转换为:

          %3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e

          • html实体编码

          • 十进制,八进制,十六进制编码

          • unicode编码

          • escape编码

          • String.fromCharCode(...) (ascii编码)

        • 更多1 更多2

      • 漏洞防御

        htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体
        htmlspecialchars和htmlentities的区别:
        htmlspecialchars 只转义 & 、" 、' 、< 、> 这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。

        1. 编码:

        对用户输入的数据进行
        HTML Entity 编码。
        如上图所示,把字符转换成 转义字符。
        Encode的作用是将
        $var
        等一些字符进行转化,使得浏览器在最终输出结果上是一样的。
        比如说这段代码:

        <script>alert(1)</script>
        

        若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。
        进行编码处理之后,L在浏览器中的显示结果就是

        <script>alert(1)</script>
        

        ,实现了将$var作为纯文本进行输出,且不引起JavaScript的执行。

        2.过滤:

        移除用户输入的和事件相关的属性。如onerror可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)移除用户输入的Style节点、Script节点、Iframe节点。(尤其是Script节点,它可是支持跨域的呀,一定要移除)。

        3、校正

        避免直接对HTML Entity进行解码。使用DOM Parse转换,校正不配对的DOM标签。备注:我们应该去了解一下
        DOM Parse
        这个概念,它的作用是把文本解析成DOM结构。
        比较常用的做法是,通过第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。
        还有一种简洁的答案:
        首先是encode,如果是富文本,就白名单
        更多

  • 区别 参考资料

    区别一:

    CSRF:需要用户先登录网站A,获取 cookie。XSS:不需要登录。

    区别二:(原理的区别)

    CSRF:是利用网站A本身的漏洞,去请求网站A的api。XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。

posted @   戴好面具  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示