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.mzph.cn/news/675396.shtml

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

相关文章

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由,AR4模拟我们的设备,最终实现Telnet的远程控制路由! 本次笔记主要记录Telnet技术实现原理,后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…

【精选】java初识多态 子类继承父类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

github拉取项目,pycharm配置远程服务器环境

拉取项目 从github上拉取项目到pycharmpycharm右下角选择远程服务器上的环境 2.1. 如图 2.2. 输入远程服务器的host,port,username,password连接 2.3. 选择服务器上的环境 链接第3点 注:如果服务器上环境不存在,先创建…

vue3-内置组件-Teleport

Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 基本用法 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看…

基于Linux操作系统的Docker容器安装MySQL随笔

1、在Linux上安装Docker容器 cd /etc/yum.repos.d/ curl -O https://download.docker.com/linux/centos/docker-ce.repo sed -i s/$releasever/8/g docker-ce.repo yum install -y docker-ce 2、修改Docker默认镜像仓库&#xff0c;然后启动Docker容器 sudo mkdir -p /etc/do…

yolov8自制数据训练集

目录 1.YOLOv8是啥 2.系统环境 3.安装labelimg 3.1安装 3.2启动 labelimg 4.自制分类图片 4.1 YOLO数据集要求 4.2 图片保存目录 4.3 利用labelimg进行标注 4.4 存储图片 4.5 标注文件 5.数据集训练 5.1yaml文件 5.2训练命令 5.3查看训练过程 5.3.1启动tensorb…

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》

论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接&#xff1a;https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们证明&#xff0c…

Qt网络编程-TCP与UDP

网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了&#xff0c;具体可以查看对应百度百科介绍&#xff1a; TCP&#xff08;传输控制协议&#xff09;_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别&#xff1a; 可靠性&#xff1a; TC…

Java面向对象 方法的重写

目录 重写重写的规则实例创建Person类创建Student类测试 重载和重写的区别 重写 发生在子类和父类中&#xff0c;当子类对父类提供的方法不满意的时候&#xff0c;要对父类的方法进行重写。 重写的规则 子类的方法名字和父类必须一致&#xff0c;参数列表&#xff08;个数&…

15章-Python编程:从入门到实践

第15章生成数据 数据可视化指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘数紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。 数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据。漂亮地呈现数据关乎的并…

C++:二叉搜索树模拟实现(KV模型)

C&#xff1a;二叉搜索树模拟实现&#xff08;KV模型&#xff09; 前言模拟实现KV模型1. 节点封装2、前置工作&#xff08;默认构造、拷贝构造、赋值重载、析构函数等&#xff09;2. 数据插入&#xff08;递归和非递归版本&#xff09;3、数据删除&#xff08;递归和非递归版本…

开源免费的物联网网关 IoT Gateway

1. 概述 物联网网关&#xff0c;也被称为IOT网关&#xff0c;是一种至关重要的网络设备。在物联网系统中&#xff0c;它承担着连接和控制各种设备的重要任务&#xff0c;将这些设备有效地连接到云端、本地服务器或其他设备上。它既能够在广域范围内实现互联&#xff0c;也能在…

P1297 [国家集训队] 单选错位 对期望的理解

[国家集训队] 单选错位 - 洛谷 思路&#xff1a; 其实每个位置的得分只和前一个位置有关。 而他们俩的所有情况的期望就是答案的这部分。 ——这是难想的&#xff0c;我期望学的不好。 &#xff08;题目给的是每种情况的所有位置的和&#xff0c;全加起来是答案&#xff1…

【龙年大礼】| 2023中国开源年度报告!

【中国开源年度报告】由开源社从 2015 年发起&#xff0c;是国内首个结合多个开源社区、高校、媒体、风投、企业与个人&#xff0c;以纯志愿、非营利的理念和开源社区协作的模式&#xff0c;携手共创完成的开源研究报告。后来由于一些因素暂停&#xff0c;在 2018 年重启了这个…

基于 Python opencv 的人脸识别的酒店客房入侵系统的检测

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

排序算法---插入排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将待排序的元素分为已排序和未排序两部分&#xff0c;每次从未排序部分中选择一个元素插入到已排序部分的合适位置&#xff0c;直到所有元素都插入到已排序部分…

FANUC机器人外部远程启动的相关参数设置示例

FANUC机器人外部远程启动的相关参数设置示例 如下图所示,在MENU---设置---选择程序中,设置程序选择模式:RSR(这个根据自己实际使用的自动启动方式来决定,你用RSR选RSR,用PNS就选PNS), 自动运行开始方法:选择UOP,即RSR1-RSR8的启动信号分别对应UI9-UI16, 最后,点击…

数字图像处理实验记录六(图像的傅里叶变换和频域处理)

前言&#xff1a; 一、基础知识 1&#xff0c;傅里叶变换是什么 傅里叶变换是一种线性积分变换&#xff0c;通俗来说&#xff0c;通过傅里叶变换就是把一段信号分解成若干个简谐波。 二、实验要求 1&#xff0e;产生一幅如图所示亮块图像f(x,y)&#xff08;256256 大小、…