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

news2024/9/24 13:16:59

基本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.coloradmin.cn/o/1440220.html

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

相关文章

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机,而原IP地址和目的IP地址就是用于标识两个主机的,既然叫做地址必然有着路径规划的作用,而路径规划最重要的就是,从哪来到哪去&#xff0…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

2023年出版的新书中提到的《人月神话》(202402更新)(2)共8本

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推…

MySQL 升级脚本制作

当数据库更新字段后或添加一些基础信息&#xff0c;要对生产环境进行升级&#xff0c;之前都是手动编写sql&#xff0c;容易出错还容易缺失。 通过 Navcat 工具的数据库结构同步功能和数据同步功能完成数据库脚本的制作。 一、结构同步功能 1、选择 工具–结构同步&#xff1…

WifiConfigStore初始化读取-Android13

WifiConfigStore初始化读取 1、StoreData创建并注册2、WifiConfigStore读取2.1 文件读取流程2.2 时序图2.3 日志 1、StoreData创建并注册 packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java mWifiConfigStore.registerStoreData(mNetworkL…

机器学习 - 梯度下降

场景 上一章学习了代价函数&#xff0c;在机器学习中&#xff0c;代价模型是用于衡量模型预测值与真实值之间的差异的函数。它是优化算法的核心&#xff0c;目标是通过调整模型的参数来最小化代价模型的值&#xff0c;从而使模型的预测结果更接近真实值。常见的代价模型是均方…

猫头虎分享已解决Bug ‍ || TypeError: Object of type ‘int64‘ is not JSON serializable

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

fghbbbbbbbbbb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

【精选】java继承进阶——构造方法的访问特点 this、super使用

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

Vulnhub-Empire靶机-详细打靶流程

渗透思路 1.确认靶机IP地址2.端口服务扫描3.敏感目录扫描4.ffuf命令在这个目录下&#xff0c;继续使用ffuf工具扫描 5.ssh私钥爆破1.将私钥写进sh.txt中2.将私钥转换为可以被john爆破的形式3.通过John爆破 6.ssh私钥登陆7.icex64提权8.arsene提权 1.确认靶机IP地址 ┌──(roo…

Unity引擎学习笔记之【动画剪辑和曲线操作】

动画剪辑和曲线Animation Clip 点选一个包含动画的FBX模型&#xff0c;在其检查器中便可查看动画剪辑 一、动画剪辑 1.Model 2.RIg 538.jpg%20%3D600x&pos_idimg-st6QJc3x-1707050419493) 无动画、旧版Animation动画、普通道具或角色动画、人形角色动画 3.Animation 二…

1 月 Web3 游戏行业概览:市场实现空前增长

作者&#xff1a;lesleyfootprint.network 今年一月&#xff0c;区块链游戏领域迎来了爆发式增长&#xff0c;活跃用户的数量大幅提升。 区块链游戏不断融合 AI 技术&#xff0c;旨在提升玩家体验并扩大其服务范围&#xff0c;公链与游戏的兼容性问题也日渐受到重视。技术革新…

又一款图像AI应用爆火,团队仅两人,单月吸引40万用户

又一款AI原生应用火了。近日&#xff0c;AI图像增强应用Magnific AI广受追捧&#xff0c;该应用在发布一个多月之后吸引了40万注册用户。 Magnific AI不仅可以用生成式AI技术放大图像&#xff0c;还能一键提升图像的分辨率&#xff0c;把原图呈现的更清晰&#xff0c;更有质感…

Web前端-移动web开发_rem布局

文章目录 移动web开发之rem布局1.0 rem基础1.1 rem单位(重点)1.2 em单位(了解)1.3 媒体查询什么是媒体查询媒体查询语法规范 1.4 less 基础维护css弊端Less 介绍Less安装Less 使用之变量使用node编译less的指令Less 编译 vocode Less 插件Less 嵌套Less 运算Less中的Mixin混入L…

xinput1_3.dll丢失怎么办?7种不同解决方法分享

xinput1_3.dll是微软Microsoft DirectX的一个重要动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它主要与DirectInput API相关&#xff0c;为Windows操作系统中的游戏和应用程序提供对各种输入设备的支持。以下是关于xinput1_3.dll的详细全面介绍&#xff1a; 1、属性…

谷歌seo搜索引擎优化有什么思路?

正常做seo哪有那么多思路&#xff0c;其实就那么几种方法&#xff0c;无非就关键词&#xff0c;站内优化&#xff0c;外链&#xff0c;可以说万变不离其宗&#xff0c;但如果交给我们&#xff0c;你就可以实现其他的思路&#xff0c;或者说玩法 收录可以说是一个网站的基础&…

宏观行业心得

OLAP的特点 电商这样的OLTP场景大家更熟悉。相比之下&#xff0c;OLAP的特点&#xff1a; 读相对多&#xff0c;1000row以上大批写入&#xff0c;不改已有数据查询时输出很多行、很少列&#xff0c;结果被过滤或聚合后能够在一台服务器的内存中单台服务器qps数百&#xff0c;…

222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干…

Python中的HTTP代理与网络安全

在当今数字化的世界里&#xff0c;网络安全已经成为我们无法忽视的重要议题。无数的信息在网络上传递&#xff0c;而我们的隐私和敏感数据也在这个过程中可能面临被窃取或滥用的风险。在Python编程中&#xff0c;HTTP代理作为一种工具&#xff0c;能够在网络安全方面发挥重要的…

Markdown:简洁高效的文本标记语言

引言 在当今信息爆炸的时代&#xff0c;我们需要一种简洁、高效的文本标记语言来排版和发布内容。Markdown应运而生&#xff0c;它是一种轻量级的文本标记语言&#xff0c;以其简单易学、易读易写的特点&#xff0c;成为了广大写作者的首选工具。本文将介绍Markdown的语法优缺…