• PHP代码审计学习(7)——XSS漏洞


    XSS介绍 

      跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Web脚本代码(htmljavascriptcss等),当用户浏览该页面时,嵌入其中的Web脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

      攻击者利用漏洞,可以获取其他合法用户的Cookie身份信息、访问地址等通过获取到的Cookie信息,即可以被攻击者的身份访问Web应用,如获取到管理员的Cookie,就可以以管理员的身份访问应用系统。

    挖掘思路

      XSS漏洞的关键在于寻找没有被过滤的参数,且这些参数传入到输出函数

      经常存在于富文本、图片引用、文字格式设置、论坛留言、用户信息等

    XSS类型分类

      案例参照https://www.jianshu.com/p/4fcb4b411a66

    反射型XSS

      又称非持久型XSS,之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含恶意代码的链接发送给受害者,当受害者点击该链接时,恶意代码被传输到目标服务器上,然后服务器将恶意代码“反射”到受害者的浏览器上,从而在该浏览器上执行了恶意攻击脚本。目前大多数浏览器都具有反射型XSS保护功能,所以相对来说反射型的危害相对较低。

      案例

    <html>
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>XSS</title> 
    </head> 
    <body> 
    <form action="" method="get"> 
    <input type="text" name="input">     
    <input type="submit"> 
    </form> 
    <br> 
    <?php 
    echo 'output:<br>'.$_GET['input'];
    ?> 
    </body> 
    </html> 

      上述案例是当将以GET方式提交的字符串输出,因为没有任何过滤所以当提交JS代码时候会触发提交的语句

     

      这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。

    储存型XSS

      又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。这种攻击多见于论坛、SNS社交网站、微博等系统,攻击者在发帖、发表文章、发微博的过程中,将恶意脚本连同正常信息一起注入到内容之中,发送到网站服务器储存下来,恶意脚本也永久地被存放在论坛服务器的后端储存器中,当其他用户浏览这个被注入了恶意脚本的内容时,恶意脚本则会在他们的浏览器中得到执行,从而实现攻击目的。

       案例

        <span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>  
        <html>  
        <head>  
        <title>XssStorage</title>  
        </head>  
        <body>  
        <h2>Message Board<h2>  
        <br>
        <form action="xss1" method="post">  
        Message:<textarea id='Mid' name="desc"></textarea>  
        <br>  
        <br>  
        Subuser:<input type="text" name="user"/><br> 
        <br>
        <input type="submit" value="submit" onclick='loction="XssStorage.php"'/>  
        </form>  
        <?php  
        if(isset($_POST['user'])&&isset($_POST['desc'])){  
        $log=fopen("sqlStorage.txt","a");  
        fwrite($log,htmlspecialchars($_POST['user'])."
    "); # 在此对用户输入数据$_POST['user']进行过滤
        fwrite($log,$_POST['desc']."
    "); 
        fclose($log);  
        }  
          
        if(file_exists("sqlStorage.txt"))  
        {  
        $read= fopen("sqlStorage.txt",'r');  
        while(!feof($read))  
        {  
            echo fgets($read)."</br>";  
        }  
        fclose($read);  
        }  
        ?>  
        </body>  
        </html></span>  

      当输入字符串时候,先将输入的数据保存在一个地方,可以是文件也可以是数据库,这里是保存在sqlStorage.txt,然后再返回到页面

       我们这边发现只有XSS2弹出,因为htmlspecialchars()函数对用户输入的<>做了转义处理。

       再看一下文件

       可以看到这些都是刚刚输入的保存在文本里的字符,可以明显发现<>被转义了

    DOM型XSS

      基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞

      特征:整个过程都是在前端完成的,没有后端的参与(纯前端的操作!)

      案例参考:https://www.cnblogs.com/wangtanzhi/p/12239918.html

     <?php
    $xss = $_GET['xss'];
    ?>
    <input type="text" id="text" value="<?php echo $xss;?>">
    <div id="print"></div>
    <script type="text/javascript">
        var text = document.getElementById("text");
        var print = document.getElementById("print");
        print.innerHTML = text.value;
    
    </script>
      playload: ?xss=<img src=x onerror=alert(/xss/)>

    杂言

      XSS其实原理很简单,就是闭合标签,不过正因为这个,所以有很多骚姿势,后续还会出XSS系列的闯关游戏,最近被考试和实习问题缠的没时间,系统学习代码审计进度慢下来了,还要去看一下以前一些零碎的东西,害

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/Lee-404/p/13198932.html
Copyright © 2020-2023  润新知