SQL注入基本教程

article/2025/10/12 6:30:18

注:只是自己学习记录,若有不对的地方请指出,文章有过一次修改,修改了关于order by函数的知识点
个人小站


SQL注入基本教程

    • 数据库的结构
    • 注释符
    • SQL注入简单教程

数据库的结构

学习SQL注入首先要知道数据库的结构
数据库由三个部分组成:数据库——表——列

在初始化安装MySQL数据库后有四个默认的库:
information_schema
mysql
performance_schema
test

information_schema
保存着数据库中所有数据库的信息,具体有数据库中有那些表,和表中的字段。
tables表,其中tales表中含有数据库中所有的表,有一个检索的功能:

•	table_schema列:存放着所有数据库的名字
•	table_name列:存放着所有数据库的表的名字

columns表中:

•	table_schema列:存放着所有数据库的名字
•	table_name列:存放着所有数据库的表名
•	column_name列:存放着所有数据库的列名

schemata表:
存放着所有数据库的名字

•	schema_name列:存放着所有数据库的的名字。只有数据库的名字

所以注入时常用information_schema

mysql:
这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。

performance_schema
mysql5.5 版本 新增了一个性能优化的引擎,performance_schema这个功能默认是关闭的。

test
没有东西

基础的查询语句:
查询语句:select table_schema from information_schema.tables
数据库和表的连接用”.
这条指令是查询information_schema数据库的tables表中查询table_schema表的值

查询语句:select group_concat(table_schema) from information_schema.tables
函数:group_concta(将相同的行组合起来)

执行语句:insert into information_schema.tables(id,name,password) values(9,zxt,toor)
添加东西到表里面

注释符

搭建好环境后可以开始做题了
先记录一个知识点注释符:–+和#和/**/的使用
在mysql中–和#代表的是注释符
mysql中单行注释#号,使用方法是注释符后直接加注释内容
而–则是要在后面加一个空格才能生效,实现注释的作用。
在这里插入图片描述

能看到这里的命令没有执行-- 后面的语句。
这也就是在做题中输入–
显示语法错误的原因,为什么要输入–+呢?因为+等于空格,所以在注入中才要输入–+
在这里插入图片描述

SQL注入简单教程

在做题前,先修改一下环境,在环境中加入:echo "有效语句:".$id."<br>";echo "MySQL执行语句:"."$sql"."<br>";
如下:

if(isset($_GET['id']))
{
$id=$_GET['id'];
echo "有效语句:".$id."<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo "MySQL执行语句:"."$sql"."<br>";

然后按照要求输入参数id
输入:?id=1
可以看到我在url中输入的参数就相当于在sql中执行了:SELECT * FROM users WHERE id=‘1’ LIMIT 0,1
在这里插入图片描述

判断注入类型,注入类型分为两种:字符型,数字型。
那么如何判断呢?
就拿这个题目来说,我输入:?id=1 and 1=1,正常回显,输入:?id=1 and 1=2,正常回显。
在这里插入图片描述

观察这个地方,注意,我输入的参数是 ?id=1 and 1=2 ,如果是数字型注入的话,这里就会有一个逻辑判断,会判断出1不等于2,没有语法错误但有逻辑错误,所以返回一个null值,返回错误页面。
也就是在url中输入: id=1 and 1=1?正常回显,输入: ?id=1 and 1=2 报错就说明这是数字型注入。注意不一定要输入?id=1 and 1=1,主要是要进行一个逻辑判断,如果逻辑错误就会返回错误。从而判断是数字型注入。

那这个为什么没有报错呢?因为在sql中字符串应该要被单引号或者双引号来闭合声明这是一个字符串,所以url的参数传入到sql里的语句就是:SELECT * FROM users WHERE id=‘1 and 1=2’ LIMIT 0,1,也就是说我输入的值变成了字符串,整个值都传给了id,数据库此时接收到语句后会把admin and 1=1当作是一个查询条件,而不会进行逻辑判断,怎么解决呢?

输入:?id=1' and 1=2

在1的后面添加一个’号。于前面的’引号闭合,声明了1是一个字符串,这样后面的and 1=2就不会被闭合,判断为字符串。
在sql中的语句就变成了SELECT * FROM users WHERE id=‘1’ and 1=2’ LIMIT 0,1
执行一下,显示结果报错,但这个报错不是逻辑报错,是sql语句错误。
在这里插入图片描述

因为sql中的语句SELECT * FROM users WHERE id=‘1’ and 1=2’ LIMIT 0,1,多了一个单引号,我们添加了一个单引号,导致后面的单引号没有闭合,所以sql语句报错,在and 1=2后面添加注释符–或者#,来注释掉这一个单引号。

输入:?id=1' and  1=2 --+

逻辑错误,返回一个空值,这就是字符型注入。
在这里插入图片描述

简单来说就是构建一个逻辑判断,and 1=1可以执行,那么and 1=2,1不等于2,正常来说应该返回一个空值。如果返回,就是数字型。
不返回就说明他加上了单引号或者双引号,我们输入的值变成了字符串,整个值都传给了id,就是字符型注入

为什么要在注释符--后面加+号呢?因为--在sql中要在后面加一个空格才能实现注释的作用,而+号在sql中是空格的意思
and 1=2正常执行了,可以把and 1=2换成正常的查询语句,来执行一些查询语句。

输入:?id=1' order by 3 --+

没有报错

输入:?id=1' order by 4 --+

输入4报错,没有第4列,说明一共有3列
在这里插入图片描述
通过order by来判断字段数,通过字段数得知多少列,因为order by 是通过字段数量进行排序,也就是列数排序,我后面要使用联合查询,联合查询必须要知道第一个select语句查询了几列
如下:
查询数据库security.users表里面所有的列,可以看到有三列,这里我order by后面输入小于3的数字都是显示的三列,但如果输入的数字大于三就会报错,因为它没有第4列。
在这里插入图片描述

报错信息:
在这里插入图片描述

输入:?id=-1' union select 1,2,3 --+

判断显示位,可以看到2,3字段是显示位,那么下面就可以查询数据库了
在这里插入图片描述

输入:?id=-1' union select 1,2,database() --+

可以用database()来代替2,3中的其中一个来显示查询结果
使用联合查询查询数据库,union select是联合查询语句,这里?id=1,改成?id=1,如果不改的话执行后就不显示显示后面的内容,仍然查询的第一个的内容,也就是仍然查询?id=1,那么把?id=1的写成0或-1就可以了,写成它查询不到的内容,它比较发现是-1或者0那么它返回的值就是null,就会执行后面的内容。

database()函数作用是返回当前数据库名称

在这里插入图片描述

这一步也可以输入:?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+

这条语句的意思是从数据库information_schema的schemata的表里面查询schema_name这一列的值,schema_name列:存放着所有数据库的的名字。只有数据库的名字,也就是读取所有数据库的名称,这schema_name这一列的值,这一列的值有很多,但浏览器只显示第一行,所以用group_concat()将相同的行组合起来,组合成一行,显示在浏览器。如下:
在这里插入图片描述

注意:报错会告诉你,语法哪里错误,回显是能告诉你查询的结果
知道了数据库的名称,下面就该查询数据库的表

输入:?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

where子句是用来设置查询条件的
这句意思就是从数据库information_schema的tables表中查询security的表名,tables表中table_name列存放着所有数据库的表名。
查询出四个表,users表一般都存放着用户和密码,查看一下
在这里插入图片描述

查到了数据库的表,接着查询数据库的列

输入:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where  table_schema='security' and table_name='users'--+

从数据库information_schema的columns表中查询security的列名,columns中存放着数据库所有的列名,表名。column_name是存放着数据库中所有的列名。
前面查询数据库的表也可以用columns表来查询,不过显示结果会显示重复表名
现在已经查询到列名,可以看到username和password用户名和密码,到这一步基本上就可以获取用户信息了
在这里插入图片描述
查询用户信息,俗称爆表

输入:?id=-1' union select 1,2,group_concat(username),group_concat(password) from security.users --+

报错
在这里插入图片描述
提示我们使用的select查询有不同的列数

修改一下,输入:?id=-1' union select 1,group_concat(username),group_concat(password) from security.users --+

从数据库security的users表中查询username和password列的值
在这里插入图片描述


http://chatgpt.dhexx.cn/article/E9btO1Qx.shtml

相关文章

Sql注入的入门教程

Sql注入比较常见的漏洞之一&#xff0c;例用程序员的漏洞来进行无账号的登陆&#xff0c;篡改数据库。任何客户端可控&#xff0c;传参数到服务端的变量&#xff0c;和数据库交互&#xff0c;都有可能存在sql注入 原理 用户通过构造sql语句来模仿服务器发向服务器的语句&…

ImageJ 插入插件和基本教程

文章目录 前言一、ImageJ的下载二、ImageJ的安装三、给ImageJ添加自定义插件四、ImageJ闪退怎么办 前言 该软件是一个使用Java语音编写的图像处理和分析软件。ImageJ基于插件架构体系设计&#xff0c;可以通过编写插件对其功能进行扩展 一、ImageJ的下载 这款软件是完完全全免…

FIJI (ImageJ) 图像处理合集

1.更改伪彩颜色 ImageJ可以打开CAI格式&#xff0c;尼康的2084的原始格式等等。 将图片直接拖拽到imageJ软件上。 会弹出一个窗口 这个窗口就是告诉我们&#xff1a;关于这个图像的原始格式是否需要进行设置。通常使用默认的&#xff0c;点击Ok。 就可以打开这个图像 如果打…

ImageJ -介绍与安装

写在开头 ImageJ&#xff0c;一款免费却又极其强大的图像处理软件。百科 但很不幸的是&#xff0c;这款软件对于电脑小白而言&#xff0c;可能并不容易上手。 看一下这个软件的界面就知道了。 反正我第一打开的时候就直接想关掉&#xff0c;这些个 icon 根本不知道干嘛的好吧…

JS操作图片的利器:Jimp VS GM

前段时间&#xff0c;笔者有一个项目需求&#xff0c;需要在一张图片上面添加文件&#xff0c;并另存为一张新的图片。刚开始的时候&#xff0c;笔者使用的是大名鼎鼎的jimp。 。 其功能能满足我的要求&#xff0c;而且其license是MIT&#xff0c;不依赖于第三方的可执行程序…

imgageJ开发【Java】

一&#xff0e;ImageJ简介 ImageJ是一款由NIH&#xff08;National Institutes of Health,美国国家卫生研究院&#xff09;发起&#xff0c;可用于Windows,Mac,OSX和Linux等操作系统的图像处理开元软件&#xff0c;ImageJ小巧&#xff0c;只有5MB左右&#xff0c;界面简洁&…

ImageIO类的使用

重点内容 (一) How to read an image from file or URL&#xff1f; 从本地文本读取图片 File sourceimage new File("c:\\mypic.jpg"); Image image ImageIO.read(sourceimage); 从网络上获取图片 URL url new URL("http://www.mkyong.com/image/mypic…

安装Image J 插件

1.下载imageJ&#xff0c;网址&#xff1a;https://imagej.net/Fiji/Downloads 2.解压 3.安装插件 &#xff08;1&#xff09;https://imagej.nih.gov/ij/plugins/index.html这个网址下载你需要的插件。打开toolsets或者tools。 ![在这里插入图片描述](https://img-blog.csd…

ImageJ工具使用简介

ImageJ工具使用简介 在以前的博文中也介绍过看Raw图的方法&#xff0c;自己平常也使用windows上的一些插值工具来看raw图&#xff0c;最近发现了一个宝贝----ImageJ&#xff0c;最让我惊喜的是它可以完美的在Windows以及Ubuntu中使用&#xff0c;避免了我抓取Raw图之后拷贝到w…

JavaSE小项目(小游戏)

JavaSE编写的小游戏 源码下载地址&#xff1a;https://github.com/ygsama/SmallGame 游戏名(难度) 满天星&#xff08;★☆☆☆☆&#xff09; 球球&#xff08;★☆☆☆☆&#xff09; 打字游戏&#xff08;★☆☆☆☆&#xff09; 汤姆猫&#xff08;★★☆☆☆&#x…

JAVA小项目(6)javaSE

1 记帐本 1.1 使用技能点&#xff1a; 分支、循环、String的拼接 1.2 功能和效果 1.3 项目架构 public class Test {public static void main(String[] args) {while(true){System.out.println("-------欢迎使用记账系统--------");System.out.println("1.收…

java项目源码分享——适合新手练手的java项目

源码下载&#xff08;实例一&#xff09;&#xff1a;jsp开发完整的博研图书馆后台管理系统&#xff0c;不使用框架开发的&#xff0c;太完美了 源码下载&#xff08;实例二&#xff09;&#xff1a;javaWeb图书馆管理系统源码mysql版本 源码下载&#xff08;实例三&#xff09…

java小项目 ATM机(简易版)

目录 说明 项目介绍 功能介绍 结构图 各模块代码 登录界面 服务选择界面 存取款界面 修改密码模块 转账模块 总代码 说明 简单做了一个java的ATM机项目、本项目只能作为一个简单的运行程序。因为没有学到数据库&#xff0c;文件等内容&#xff0c;没有存储功能&…

适合新手练习的 java 小项目

适合新手练习的 java 小项目 智能电话本 视频连接在下方↓ 包括源码也在下面 不要问我为什么推荐这个&#xff0c;因为我也只是一个新手&#xff0c;这个项目是纯命令行的&#xff0c; 不需要数据库和网页编程知识&#xff0c;做起来很简单&#xff0c;可以帮助新手巩固基础…

JavaWeb新手小项目以及源码

此项目主要实现的功能有&#xff1a; jsp连接数据库、MD5加密、验证码验证、Ajax、文件的上传与下载、session登录验证等。 先来几张截图&#xff1a; 一、首先写登录页面 login.jsp <% page language"java" import"java.util.*" pageEncoding&qu…

java小项目水果摊

介绍 刚学完java 集合和IO流&#xff0c;想做了一个简单的小项目来练手&#xff0c;于是我就运用一些基础知识做了这个水果摊。水果摊的主要功能有&#xff1a; 进货查看水果列表购买水果查看购物车结账退出 都是一些简单的功能&#xff0c;下面就来展示代码&#xff1b; …

Java个人Web小项目

JavaWeb-HTML实列开发 目录源代码链接部分效果图 目录 #1.用户列表开发 新建一个Maven项目 创建包&#xff1a;com.iflytek 在项目中 在com.iflytek.controller中新建一个类为控制器类&#xff1a;(本网址为/UserController.java) UserController.java package com.iflytek…

Java小项目(一)---超市管理系统

超市管理系统 一、使用技术二、实现功能三、运行效果图3.1 货物清单3.2 增加货物3.3 删除货物3.4 修改货物3.5 退出 四、实现的代码4.1 Good商品货物类4.2 ShoppingSystem超市管理系统测试类 一、使用技术 Java SE 二、实现功能 使用选择结构&#xff0c;循环结构&#xff0…

Java小项目另一个水果摊

文章目录 前言一、包和表截图二、源代码1.JDBC连接Mysql数据管理员界面&#xff1a;增删查改用户界面 &#xff1a;查找水果建立断开连接 2.GUI窗口界面开始选择界面用户购买水果界面管理员登录界面管理员界面 3.水果属性4.main方法 总结拒绝白嫖&#xff0c;给个三连鼓励一下吧…