SQL注入(SQL Injection)从注入到拖库 —— 简单的手工注入实战指南精讲

基本SQL注入步骤:

  1. 识别目标:确定目标网站或应用程序存在潜在的SQL注入漏洞。
  2. 收集信息:通过查看页面源代码、URL参数和可能的错误信息等,搜集与注入有关的信息。
  3. 判断注入点:确定可以注入的位置,比如输入框、URL参数等。
  4. 检测是否存在注入漏洞:通过在注入点输入特定的SQL语句,观察返回结果是否异常或错误,来判断是否存在注入漏洞。
  5. 确定数据库类型:如果存在注入漏洞,需要确定目标数据库的类型,如MySQL、Oracle等。
  6. 获取数据库版本:通过注入语句,尝试获取目标数据库的版本信息,便于后续选择合适的注入技术。
  7. 了解数据库结构:通过注入语句查询数据库结构,获取表名、列名等信息,以便后续查询数据。
  8. 执行恶意操作:根据之前的信息和目标需求,构造恶意的注入语句,执行数据库操作,如查询、插入、更新、删除等。
  9. 获取数据:根据注入语句,获取目标数据库中的敏感数据或其他有价值的信息。
  10. 覆盖痕迹:在完成操作后,隐藏或删除痕迹,以避免被发现。

注入操作基础步骤

这里以sqli-labs靶场Less-1为例
大家可以去BUUCTF上开一个靶机进行实验
在这里插入图片描述

1. 判断注入点

在GET参数、POST参数、Cookie、Referer、XFF、UA等地方尝试插入代码、符号或语句,尝试是否存在数据库参数读取行为,以及能否对其参数产生影响,如产生影响则说明存在注入点。
a. ?id=1’

在这里插入图片描述

ⅰ. 在 SQL 语句中,单引号用于表示字符串值。通过在注入点后面添加单引号 ',我们试图破坏正确的的 SQL 查询语句,以触发 SQL 语法错误来确认注入点。如果页面返回了类似于 “You have an error in your SQL syntax” 的错误信息,这意味着单引号导致了 SQL 语法错误,从而确认了存在注入点。

b. ?id=1’–+
在这里插入图片描述
ⅰ. 确定注入类型。根据原始sql语句,若没报错则确定为字符型注入。如果仍报错则可能为数字型。
ⅱ. 在 SQL 注释语法中,-- 被用作单行注释的开始符号,它会注释掉从它之后的所有内容。
ⅲ. 而 # 则用于一些特定的数据库,如 MySQL,其中它可以在注释行中使用。 使用#,发现执行的sql语句中没有#,原因是url中#号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。所以,HTTP请求中不包括#,将#号改成url的编码%23就可以了。
ⅳ. 在URL中编码,+通常用作空格的替代符号。用来和后面的单引号分隔开,将后面的语句注释。如果–与后面的这个单引号直接连接在一起,无法形成有效的mysql语句。也可以使用–'来完成注入语句。
在这里插入图片描述

2. 探子回报

通过在可注入点进行尝试,确定数据库类型,当前账户权限级别等信息。
a. ?id=1’ order by 3 --+
在这里插入图片描述在这里插入图片描述
ⅰ. ORDER BY是SQL语句中用于对查询结果进行排序的子句,它通常用于在SELECT语句中指定按照哪个或哪些列进行排序。
ⅱ. 使用ORDER BY子句来尝试确定查询结果中显示的列数。通过在注入点后添加order by 1、order by 2等数字递增,观察页面的变化来判断查询结果是否受到影响。此例order by 3不报错,order by 4报错,则可判断列数为3。本例为3。
ⅲ. 使用order by语句还可以判断数据库类型:根据返回结果判断数据库类型,如MySQL、SQL Server、Oracle等。

b. 其他操作
ⅰ. 使用error信息判断数据库版本:在可注入点尝试使用error信息函数,如mysql_error()、odbc_error()等,根据返回的错误信息判断数据库版本号。
ⅱ. 使用时间延迟函数判断操作系统类型:在可注入点尝试使用时间延迟函数,如benchmark()、sleep()等,根据返回的时间差值判断操作系统类型。

3. 判断字段数(列数)和回显点

通过查询相关内容,判断库名、表名和列名,查询具体信息。

a. ?id=-1’ union select 1,2,3–+
?id=1' union select 1,2,3--+?id=-1' union select 1,2,3--+

ⅰ. id=-1 是为了避免回显信息与现有的有效 id 值发生冲突,以确保我们的注入语句能够准确地执行。通过选择一个无效的 id 值(-1 是常见的选择),我们可以成功地绕过原始查询中基于有效 id 值的限制条件,并通过 union select 语句进行注入回显操作。
ⅱ. 使用union select语句判断表名和列数:在可注入点尝试使用union select语句,利用已知列数爆出显示位 ,以便获取更多信息。如果页面中出现1,2,3任一字样,则为爆出了的显示位,可在后续代码中替换为信息获取函数。本例为2,3。
ⅲ. 猜想:能够回显的原因是 因为select选择的结果集(1,2,3)与当前数据表的列数相同,当id值为无效的 id 值-1时,结果集就会代替设定好需要显示的原数据显示出来。

b. ?id=-1’ union select 1,version(),database() --+
在这里插入图片描述 ⅰ. 根据上一步爆出的回显位置,改为信息函数查看信息。相关获取信息函数如下:
■ version():数据库版本-看是否符合information_schema查询
■ user():数据库用户-看是否符合ROOT型注入攻击
■ @@version_compile_os:当前操作系统-看是否支持大小写或文件路径选择
■ database():数据库名字-为后期猜解指定数据库下的表,列做准备。本例的表名爆出为security。

c. ?id=-1’ union select 1,group_concat(table_name) ,3 from information_schema.tables where table_schema=‘security’–+
在这里插入图片描述
ⅰ. MySQL 5.0以上版本自带数据库information_schema
■ information_schema:存储数据库下的数据库名及表名,列名信息的数据库
■ information_schema.tables:记录表名信息的表
■ information_schema.columns:记录列名信息表
ⅱ. 使用information_schema表查询数据库信息:在可注入点尝试使用information_schema表查询数据库信息,如数据库名、用户名、密码等。 本例中group_concat(table_name) from information_schema.tables where table_schema=‘security’;,意为从information_schema.tables表中筛选出所有表名(table_name)属于名为’security’的数据库模式(table_schema),然后将这些表名连接成一个字符串(group_concat())。

d. ?id=-1’ union select 1,group_concat(“\n”,column_name) ,3 from information_schema.columns where table_name=‘users’–+
· 在这里插入图片描述
ⅰ. 爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中,所以我们可以尝试得到并查看该表下的字段名以及内容。
ⅱ. 这个查询语句的作用是从information_schema.columns表中筛选出表名为’users’的所有列名,并将它们连接成一个字符串。table_name字段表示所有字段对应的表名,所有表中都有。
ⅲ. MySQL 库名、表名和列名的获取思路就是:
■ 获取当前数据库名:database() => ‘security’
■ 获取当前数据库的所有表名:select group_concat(table_name) from information_schema.tables where table_schema=‘security’ => ‘emails,users,…’
■ 获取所选表的所有列名:select group_concat(culumn_name) from information_schema.columns where table_name=‘users’ => ‘username ,password,…’

e. ?id=-1’ union select 1,group_concat(“
”,username ," ", password),3 from users–+
在这里插入图片描述
ⅰ. 爆出敏感信息,这里使用select from语句,结合group_concat()连接上一步得知的字段。我加了空格和换行隔一下账户和密码。

  1. 提权分析:根据已知的用户级别和数据库信息,决定是否需要进一步提权以获取更高的操作权限。

  2. 利用漏洞进行攻击:构造特定的SQL语句,通过网页输入的方式进行注入,执行非授权操作,如查询、修改或删除数据等。

📌需要注意的是,SQL注入是一种非法的攻击行为,务必在合法授权和法律规定的范围内进行安全测试和演练。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着pink老师前端入门教程-day21+22

5.4 常见flex布局思路 5.5 背景线性渐变 语法: background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

【若依】若依框架在本地运行的操作方法,及踩坑记录

若依框架简介 若依是一个Gitee上一个开源的基于SpringBoot开发的轻量级Java快速开发框架,用以快速构建后台管理系统,点击跳转到官方地址 本机部署过程 Step1. 下载项目源码 我选择的是直接下载zip压缩包,解压后得到如下文件夹&#xff0c…

挑战杯 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

Java面试题(一)——MySQL索引、JVM内存模型、JDBC

1、mysql使用innodb引擎,请简述mysql索引的最左前缀如何优化 order by 语句? 1.1、核心回答 首先要对sql进行分析检查必要的查询字段,过滤字段,排序字段是否按顺序创建好了索引 如果查询字段不在索引中可能会产生回表操作会导致…

Linux环境下配置HTTP代理服务器教程

大家好,我是你们可爱的Linux小助手!今天,我将带你们一起探索如何在Linux环境下配置一个HTTP代理服务器。请注意,这不是一次火箭科学的实验,而是一次简单而有趣的冒险。 首先,我们需要明确什么是HTTP代理服…

TOP100 二叉树(三)

11.114. 二叉树展开为链表 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺…

IoC原理

Spring框架的IOC是基于Java反射机制实现的,那具体怎么实现的,下面研究一下 反射 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法…

JenkinsGitLab完成自动化构建部署

关于GitLab安装:GitLab安装-CSDN博客 Docker中安装GitLab:Docker下安装GitLab-CSDN博客 安装JenKins Jenkins官网:Jenkins 中文版:Jenkins 安装时候中文页面的war包下不来 在英文页面 记得装JDK8以上 JenKins使用java写的 运行JenKins需要JDK环境 我这里已经装好了 将下…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

问题:重热现象可使多级汽轮机的理想焓降增加,重热系数越大,多级汽轮机的内效率就越低。 #学习方法#微信#媒体

问题:重热现象可使多级汽轮机的理想焓降增加,重热系数越大,多级汽轮机的内效率就越低。 参考答案如图所示

代码随想录算法训练营第二十五天 |216.组合总和III,17.电话号码的字母组合(已补充)

剪枝操作讲解:(已观看) 带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili 216.组合总和III(已观看) 1、题目链接&#xf…

Pinia介绍和使用

1. pinia是什么 Pinia 是一个基于 Vue.js 的状态管理库,用于管理应用程序的数据。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态,下面是详细介绍 基于 Vue 3:Pinia 是专门为 Vue 3 开发的状态管理库,充分利用…

推理系统学习笔记

一些学习资料 最近对MLsys比较感兴趣,遂找些资料开始学习一下 https://fazzie-key.cool/2023/02/21/MLsys/https://qiankunli.github.io/2023/12/16/llm_inference.htmlhttps://dlsyscourse.orghttps://github.com/chenzomi12/DeepLearningSystem/tree/main/04Infe…

算法——前缀和算法

1. 什么是前缀和算法 前缀和算法(Prefix Sum)是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和,将这些部分和存储在一个新的数组中,从而在需要计算某个区间的和时,可以通过简单…

《Git 简易速速上手小册》第3章:分支管理(2024 最新版)

文章目录 3.1 创建与合并分支3.1.1 基础知识讲解3.1.2 重点案例:为 Python 项目添加新功能3.1.3 拓展案例 1:使用 Pull Requests (PRs) 在团队中合作3.1.4 拓展案例 2:解决合并冲突 3.2 分支策略的最佳实践3.2.1 基础知识讲解3.2.2 重点案例&…

【动态规划】【前缀和】【数学】2338. 统计理想数组的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode:2338. 统计理想数组的数目 给你两个整数 n 和 maxValue ,用于描述一个 理想…

手把手教你玩转蓝牙模块(原理+驱动)

head: title: 手把手教你玩转蓝牙模块(原理驱动) description: 手把手教你玩转蓝牙模块(原理驱动) 作为嵌入式开发工程师,蓝牙模块怎能少呢? 蓝牙模块广泛应用在各种电子器件,比如手机、蓝牙耳…

2 月 3 日算法练习-数论

简单数论 思路&#xff1a;各个相邻数的差值求最大公约数得到 d&#xff0c;然后就能求出最少项数。 c17用gcd&#xff0c;c11 用_gcd #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; ll a[N]; int n; int main( ){cin>>…

【网站项目】030小学生课外知识学习网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Vue3.3新特新和Vue3-Pinia

文章目录 1.Vue3.3新特性 - defineOptionsVue3.3新特性 - defineModel3.Pinia快速入门4.手动添加Pinia到Vue项目5.Vue3 - Pinia的基本语法6.action的异步实现7.Vue3-Pinia-storeToRefs方法8.Pinia持久化插件安装用法 1.Vue3.3新特性 - defineOptions 背景说明 有<script se…