SQL注入——入门篇

article/2025/9/16 21:46:59

SQL 注入的定义

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 —— [ 百度百科 ]

网页链接存在参数传递,后台并没有对用户的输入进行过滤,导致用户的输入直接被SQL解释器执行。SQL注入的产生条件

  • 有参数传递
  • 参数值带入数据库查询并且执行

举个简单的例子:

  • A www.test.com/index.php?id=1
  • B www.test.com/index.php
  • C www.test.com/index.php?id=1&parm=3

这里,A把参数值1赋值给参数‘id’,并且传到index.php的网页中,达到相应的效果。那么,就有可能存在注入漏洞。同样的道理,C也有可能存在注入漏洞,因为其解析了两个参数值。而B只是对一个网页进行简单的访问,并没有涉及到参数的传递。

我们这里只是在网页链接上,对SQL注入进行浅显易懂的解释,事实上也有一些SQL注入并不会显示在链接地址上,这就需要分析网页的源代码,才能定位到相应的漏洞,这方面的进阶,我们以后再加以叙述。

原理分析

我们以DVWA平台分析SQL注入产生的原因,DVWA的搭建过程,可自行参考网上教程。
当用户在User ID的文本框中输入 ID,点击提交,网页就会以GET方式把用户刚刚的输入提交到后台,并且进行相应的查询。

当用户在User ID的文本框中输入ID,点击提交,网页就会以GET方式把用户刚刚的输入提交到后台,并且进行数据库查询,查询结果又会返回在前端页面下。我们来分析以下源码,以帮助我们更好的了解SQL注入形成的原因。

<?php     
if(isset($_GET['Submit'])){ // Retrieve data // 用$符号定义一个变量,叫id,预定义的$_GET变量用于收集来自表单‘id’的值,也就是说用户在网页后缀提交的id=1,数字1最终会赋值给$id$id = $_GET['id'];       $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";// 执行SQL语句,在这两句代码中,我们可以看到,用户提交的id未经任何过滤,直接赋值到SQL语句中$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); // 以下代码是服务器返回给前端的查询结果,可暂时忽略$i = 0;while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } 
} 
?>

从以上代码的注释分析,可以看出,用户提交的数据并没有进行过滤。如果用户提交的不仅仅是一个id,而是一段标准的SQL语句,那么会被SQL解释器执行。例如输入1‘ and 1=1 order by 4 #,那么上述代码中的SQL语句就会变为

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1 order by 4 #'";

#号将后续的引号注释了。order by 是用来查询列数的,当字段数超过数据库的字段数,数据库就会返回错误信息,因此,我们可以利用order by来猜测数据库的字段数。至此,如果熟悉SQL语句,那么可以进一步写入更多的语句,查询数据库,导致隐私数据泄露。

注入过程

漏洞判断

  • 1.判断网页链接的格式是否符合我们一开始提出的SQL注入产生的条件
  • 2.使用常见的 and 1=1 或者 单引号’ 来判断用户的输入是否被SQL解释器执行。

-比如:1’ and 1=1 #,同样的,我们带入到网页的源码中,

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1 #'"

and 1=1 是一个逻辑判断语句,也就是说,因为 1=1,所以前面的SQL语句查询,可以执行。
那么如果换成 and 1=2,很明显,逻辑判断不成立,所以前面的SQL语句无法查询,网页返回错误信息。

查询数据库名称

  • 联合查询法
  • 逐字猜解法

在这里,我们输入 1’ union select 1,database() #,就可以在网页前端返回数据库名称。
这里写图片描述

这里的dvwa就是指数据库的名字叫dvwa。至于为什么可以查询到名称,刚刚我们已经有过类似的分析,读者可自行将我们的输入带入到网页源码。database()在SQL语句中,就是指数据库的名称。

查询数据库表名

输入1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

  • group_concat() 是一个函数,将同一个id的其他字段合并起来。 table_name,顾名思义,就是表名的意思。
  • information_schema.tables 是MySQL提供的自带的数据库,主要是提供用户自行建立的一些表的信息。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
  • table_schema=database() 是指数据库名称为database()。

这里写图片描述
说明dvwa数据库中,一共有两个表,分别为guestbook和users。

获取字段名

输入1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #
这里写图片描述
查询成功后,可以看到users表中的字段有user_id, first_name, last_name, user…

获取数据库的详细内容

输入1’ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
这里写图片描述
最终,我们得到数据库的详细内容。

防御SQL注入

归根到底,需要对用户的输入进行过滤,因为在Web攻防中,我们永远不要相信用户的输入 1。
1.使用预编译语句,绑定变量。
2.使用安全的存储过程对抗SQL注入。
3.检查数据类型。
4.使用安全函数。

总结

在此篇文章中,我们对SQL注入进行实际的分析,并以awvs作为试验平台。通过一个简单的小试验,希望大家对SQL注入能够有一个更加清晰的认识和了解。当然实际注入过程,我们可以借助自动化平台或软件实现,如Sqlmap、穿山甲、啊D注入等等工具。最后,简要说明几种常见的防注入方法。


  1. 吴翰清. 白帽子讲Web安全[M]. 电子工业出版社, 2014. ↩

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

相关文章

什么是SQL注入攻击?SQL注入攻击的危害以及防护

用户打开一个输入框&#xff0c;可以输入任何内容&#xff0c;包括SQL语句。如果网站开发者&#xff0c;没有对用户输入的内容&#xff0c;进行判断和过滤&#xff0c;那么这些语句将被执行。攻击者可以在管理员毫不知情的情况下&#xff0c;对数据库服务器进行操作。 SQL注入攻…

SQL注入分类,一看你就明白了。SQL注入点/SQL注入类型/SQL注入有几种/SQL注入点分类

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top200、阿里云博客专家、华为云享专家、网络安全领域优质创作者 SQL注入分类 一、数值型注入二、字符型注入1&#xff09;单引号字符型注入2&#xff09;双引号字符型注入3&#xff09;带有括号的注入a. 数…

什么是SQL注入?

有人的地方就有江湖&#xff0c;有数据库存在的地方就可能存在 SQL 注入漏洞。 什么是SQL 注入&#xff1f; SQL 注入是一种非常常见的数据库攻击手段&#xff0c;SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情…

sql注入攻击的原理(sql注入攻击防范)

SQL 注入&#xff08;SQLi&#xff09;是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。他们也可利用 SQL 注入对数据进行增加、修…

SQL注入的一般过程

SQL注入的一般过程 概述SQL注入的步骤一道例题总结 概述 SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以…

细说——SQL注入

目录 SQL是什么&#xff1f;什么是SQL注入漏洞原理漏洞原因为什么会有SQL注入注⼊点可能存在的位置漏洞危害提交方法判断注入点判断字符型还是数字型sql注入绕过获取网站路径SQL 注入读写文件1. 数据库支持文件读写2. 当前用户具有文件权限3. 知道文件绝对路径 查询方式及报错盲…

什么是SQL注入

什么是sql注入&#xff1f; 既然你会来看这篇文章&#xff0c;说明你和写这篇文章时的我一样&#xff0c;是个安全小白。不管你是以何种原因想要了解“什么是sql注入”&#xff0c;我都希望这篇文章尽可能地会给你一点收获。 两个通俗的概念 SQL 注入就是指 web应用程序对用户…

SQL注入(一)—— sql手动注入实操

SQL SQL注入sql 注入的核心 SQL 手注的一般流程判断注入点 —— 第一步判断字段数 —— 第二步判断回显点 —— 第三步查询相关内容 —— 第四步判断库名判断表名判断列名查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网络攻击中最常见的手段之一&#xff0c;曾被冠以 “…

【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类

目录 1 SQL注入概述1.1 SQL注入简介1.2 SQL注入原理&#xff08;掌握&#xff09;1.3 SQL注入漏洞的危害&#xff08;掌握&#xff09; 2 SQL注入漏洞分类2.1 注入位置分类&#xff08;掌握&#xff09;2.2 注入数据类型分类&#xff08;掌握&#xff09;2.3 注入手法分类&…

SQL注入详解(全网最全,万字长文)

漏洞原因 一些概念&#xff1a; SQL&#xff1a;用于数据库中的标准数据查询语言。 web分为前端和后端&#xff0c;前端负责进行展示&#xff0c;后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…

sql注入基础原理(超详细)

一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中&#xff0c;再在后台 Sql 服务器上解析执行进行的攻击&#xff0c;它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层架构(3-tier architecture) 通常意义上就…

数据库存储过程语法

mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法&#xff1a; create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法&#xff1a;call sp_name() 注意&#xff1a;存储过程名称后面必须加括号&#xff0c;哪怕该存储过程没有参数传递…

存储过程语法--变量

目录 实例演示 定义默认值并使用 定义赋值再使用 定义2变量&#xff0c;通过查询表内数据进行赋值并使用 定义变量declare 变量名 数据类型 [default 默认值];变量赋值方式一set 变量名 变量值;变量赋值方式二select 列名 into 变量名 from 表名 [where 条件]; 实例演示 定义…

mysql 5.0存储过程(包括语法,符号)

一.创建存储过程 1.基本语法&#xff1a; create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法&#xff1a;call sp_name() 注意&#xff1a;存储过程名称后面必须加括号&#xff0c;哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法&a…

Oracle存储过程语法学习

Oracle存储过程&#xff1a; 1.1 第一个存储过程 --创建存储过程 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name : 张三; p_para3 : v_name; …

sql存储过程语法详解

一、定义变量 使用关键字declare申明变量&#xff1a; declare 变量名 变量类型 /*简单赋值*/declare a intset a5print a/*select赋值*/declare b nvarchar(10) select b stu_name from dbo.student where stu_id6 print b/*update赋值*/declare c nvarchar(10) upd…

MySQL常用操作之创建存储过程语法详解

MySQL常用操作之创建存储过程语法详解 前言简介语法创建结构变量结构入参变量和出参变量流程控制判断(IF 语句)判断(CASE 语句)循环(LOOP 语句)循环(WHILE 语句)循环(REPEAT 语句)再次循环(ITERATE 语句) 总结参考链接 前言 场景介绍 作为一名Java搬运工&#xff0c;实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表&#xff08;测试数据准备&#xff09; -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码&#xff0c;用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

后来者居上&#xff0c;不是easy的事情 尤其技术类work&#xff0c;更加如此。都是have one 投入的过程的。尤其开发&#xff0c;还是属于技术壁垒挺高的行业。 创建基本的存储过程 1 CREATE OR REPLACE PROCEDURE MyProName IS 2 BEGIN 3 NULL; 4 END; 行1:CREATE OR REPL…