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注入是一种非法的攻击行为,务必在合法授权和法律规定的范围内进行安全测试和演练。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队渗透靶机:TIKI: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、dirsearch 2、gobuster WEB web信息收集 searchsploit cms信息收集 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:2…

Blender_查看版本

Blender_查看版本 烦人的烦恼,没找见哪儿可以查看版本? 算是个隐蔽的角落!

华清作业day56

SQLite特性: 零配置一无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由共享;支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB…

09 AB 10串口通信发送原理

通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现…

休斯顿NASA太空机器人进入最后测试阶段,或可模拟人类执行外星任务!

美国宇航局开发研制的太空智能机器人目前正在德州休斯顿的约翰逊航天中心接受最后的运行测试,距离太空智能化时代又要更进一步了! NASA表示,日前在德州休斯顿附近的约翰逊航天中心进行测试的机器人名为Valkyrie,是以北欧神话中的一…

机器学习9-随机森林

随机森林(Random Forest)是一种集成学习方法,用于改善单一决策树的性能,通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

《动手学深度学习(PyTorch版)》笔记7.6

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

排序算法---冒泡排序

原创不易,转载请注明出处。欢迎点赞收藏~ 冒泡排序是一种简单的排序算法,其原理是重复地比较相邻的两个元素,并将顺序不正确的元素进行交换,使得每次遍历都能将一个最大(或最小)的元素放到末尾。通过多次遍…

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候,发现了一个有趣的样本,该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包,对安全研究人员进行窃密与勒索双重攻击,这种双重攻击的方式也是勒索病毒黑客组织常用的…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

mac协议远程管理软件:Termius for Mac 8.4.0激活版

Termius是一款远程访问和管理工具,旨在帮助用户轻松地远程连接到各种服务器和设备。它适用于多种操作系统,包括Windows、macOS、Linux和移动设备。 该软件提供了一个直观的界面,使用户可以通过SSH、Telnet和Mosh等协议连接到远程设备。它还支…

【SpringBoot】JWT令牌

📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 什么是JWT JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

详细分析Redis性能监控指标 附参数解释(全)

目录 前言1. 基本指标2. 监控命令3. 实战演示 前言 对于Redis的相关知识推荐阅读: Redis框架从入门到学精(全)Python操作Redis从入门到精通附代码(全)Redis相关知识 1. 基本指标 Redis 是一个高性能的键值存储系统…

网络分析仪的防护技巧

VNA的一些使用防护技巧,虽不全面,但非常实用: [1] 一定要使用正规接地的三相交流电源线缆进行供电,地线不可悬浮,并且,火线和零线不可反接; [2] 交流供电必须稳定,如220V供电&#x…

【开源】SpringBoot框架开发桃花峪滑雪场租赁系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性,通过精确测量和分析设备的振动数据,以识别和校正不平衡问题,从而保证机械设备的高…

Mac 使用AccessClient打开 windows 堡垒机的方式

使用AccessClient打开连接到 windows 页面 需要下载Microsoft remote Desktop 远程连接工具 在国内,无法下载正式版,beta 版本不需要从 app Store 下载 macOS 客户端下载地址 | Microsoft Learn 在浏览器点击对应的windows机器打开即可,会自动唤醒 Microsoft remote Desktop 进…

【MySQL】_JDBC编程

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

HiveSQL——条件判断语句嵌套windows子句的应用

注:参考文章: SQL条件判断语句嵌套window子句的应用【易错点】--HiveSql面试题25_sql剁成嵌套判断-CSDN博客文章浏览阅读920次,点赞4次,收藏4次。0 需求分析需求:表如下user_idgood_namegoods_typerk1hadoop1011hive1…