免责声明
本文只做学术研究使用,不可对真实未授权网站使用,如若非法他用,与平台和本文作者无关,需自行负责!
User-defined function injection:用户自定义函数注入
- --udf-inject:用于注入用户自定义函数(UDF) 的高级参数,主要针对 MySQL 和 PostgreSQL 数据库,通过上传并调用自定义函数实现系统命令执行等高危操作(没做出来,关卡是堆叠注入,一直提示不存在堆叠注入)
-
🔍UDF 注入目的:
- 提权与命令执行:通过注入自定义函数(如 sys_eval),直接执行操作系统命令(如 whoami、文件读写),突破数据库权限限制
- 绕过安全机制:在数据库用户具备写权限时,可绕过 AppArmor/SELinux 等安全策略(需临时关闭或配置例外)
-
💡适用场景:
- 获取系统 Shell(--os-shell 的前置步骤)
- 读取敏感文件(如 /etc/passwd)
- 数据库提权(如从普通用户提升至 DBA)
-
⚙技术依赖:
- 数据库支持:仅限 MySQL 和 PostgreSQL(需支持堆叠查询)
- 权限要求:
- 数据库用户需具备 CREATE FUNCTION 权限(通过 --is-dba 验证)
- 需可写入数据库安装目录下的 lib/plugin 路径(若目录不存在需手动创建)
- 文件兼容性:UDF 文件需与数据库架构匹配(32/64位),否则注入失败(通过 mysql -V 确认版本)
-
⚡典型用法:
- 基础命令:sqlmap -u "http://1.1.1.1/vuln.php?id=1" --udf-inject
- 操作步骤:
- 上传 UDF 文件:
- SQLMap 自动检测目标系统类型,上传预编译的共享库(如 lib_mysqludf_sys.so 或 .dll)到数据库服务器的 lib/plugin 目录
- 手动指定路径(若默认上传失败): sqlmap -u <URL> --udf-inject --shared-lib="/path/to/udf.dll"
- 创建自定义函数:
- 调用上传的 UDF 文件注册函数(如 sys_eval): CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
- 执行系统命令: SELECT sys_eval('whoami');
- 实战:
- 确认数据库架构(64位): sqlmap -u <URL> --sql-query="SELECT @@version_compile_os, @@version_compile_machine"
- 注入 UDF 并创建函数: sqlmap -u <URL> --udf-inject --shared-lib="./sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so"
- 执行系统命令: SELECT sys_eval('cat /etc/passwd');
-
⚠注意事项:
- 权限与目录问题:
- 目录不存在:MySQL 5.1+ 默认无 lib/plugin 目录,需手动创建并赋予写权限
- 安全机制拦截:Ubuntu 的 AppArmor 或 CentOS 的 SELinux 可能阻止 UDF 执行,需临时关闭(sudo /etc/init.d/apparmor stop)或配置规则
- 版本兼容性:
- 32/64 位不匹配:SQLMap 自带 UDF 文件需与数据库架构一致,错误使用会导致 ERROR 1126
- MySQL 5.1+ 适配:高版本 MySQL 需使用 SQLMap 预编译的专用 UDF 文件(位于 /sqlmap/data/udf/mysql)
- 替代方案:
- 若仅需执行单条命令 → 使用 --os-cmd="id"(无需手动注入)
- 若需交互式 Shell → 直接使用 --os-shell(自动完成 UDF 注入)
-
💎 安全与合规建议:
- 风险控制:
- UDF 注入可能触发 WAF/IDS 告警,建议结合 --proxy 和 --delay=2 降低风险
- 避免执行破坏性命令(如 rm -rf),优先使用只读操作验证权限
- 合法授权:⚠️所有操作需在授权范围内进行,未授权注入 UDF 违反《网络安全法》及《刑法》第 285 条
-
📌扩展工具:
- UDF 文件生成:
https://github.com/sqlmapproject/sqlmap/tree/master/data/udf
- --shared-lib=SHLIB:用于指定自定义共享库路径的关键参数,主要应用于通过用户自定义函数(UDF)扩展攻击能力的场景
-
🔍加载自定义共享库:
- UDF注入支持:通过 --shared-lib 指定本地共享库文件(如 .dll 或 .so),SQLMap 可将其注入目标数据库,实现执行系统命令、读写文件等高阶操作
- 绕过限制:在数据库用户权限受限时,通过注入自定义函数绕过安全策略(如禁用系统命令执行)
-
💡典型应用场景:
- 执行系统命令:注入共享库中的函数调用 system() 或 exec()
- 文件读写:读取服务器敏感文件(如 /etc/passwd)或上传后门
-
⚡典型用法:
- 基础语法:sqlmap -u <目标URL> --shared-lib=<共享库路径> [其他参数]
- 支持共享库注入的数据库:
数据库类型 |
共享库扩展名 |
注入方式 |
依赖条件 |
MySQL |
.so(Linux) |
通过CREATE FUNCTION注入 |
lib_mysqludf_sys等预编译库 |
PostgreSQL |
.so |
使用CREATE OR REPLACE FUNCTION |
pg_exec等函数支持 |
Microsoft SQL Server |
.dll |
调用xp_cmdshell扩展 |
需启用Ole Automation Procedures |
- 实战案例:MySQL 执行系统命令
- 编译共享库:使用预置的 UDF 库(如 lib_mysqludf_sys)编译生成 .so 文件
- gcc -shared -fPIC -o lib_mysqludf_sys.so lib_mysqludf_sys.c
- 注入并执行命令: sqlmap -u "http://1.1.1.1/vuln?id=1" --shared-lib="/home/user/lib_mysqludf_sys.so" --os-cmd="id"
-
⚠注意事项:
- 权限要求:
- 数据库用户权限:需具备 CREATE FUNCTION 权限(通过 --is-dba 验证)
- 文件系统访问:共享库需能被数据库服务进程读取(如 MySQL 的 plugin_dir 路径)
- 兼容性问题:
- 数据库版本:MySQL 5.1+ 需手动指定 plugin_dir;Windows 系统需 .dll 文件
- 架构匹配:共享库需与数据库服务器的操作系统架构一致(如 x86 vs x64)
- 隐蔽性与风险:
- 日志记录:注入操作可能被数据库审计日志捕获,需结合 --proxy 隐匿流量
- 破坏性操作:慎用 DROP FUNCTION 避免函数残留
-
🔄替代方案与最佳实践:
- 内置命令执行:若目标支持直接命令执行(如 MSSQL 的 xp_cmdshell),优先使用 --os-shell 避免文件上传
- sqlmap -u <URL> --os-shell
- 自动激活内置功能
- 无文件注入:通过内存加载共享库(仅限 PostgreSQL)
- sqlmap --shared-lib="mem:<base64编码的库文件>" --dbms=postgresql
- 安全合规性:⚠️仅限授权测试,未授权使用共享库注入违反《网络安全法》
-
💎 总结:--shared-lib 是 SQLMap 高阶渗透能力的核心参数,适用于需定制化攻击逻辑的场景,但其依赖严格的权限与环境配置。建议操作流程:
- 权限验证 → --is-dba → 确认 plugin_dir 可写性
- 库文件编译 → 适配目标数据库类型与架构
- 注入测试 → 使用 --os-cmd="whoami" 验证功能
原文始发于微信公众号(一个努力的学渣):Sqlmap全参数讲解之第八篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论