数据库信息收集是指需要通过帐号及口令直接访问数据库中的内容,特别是获取数据库中的一些有关配置的表,涉及后台登录的用户名及密码等。
1.1.1数据库客户端表查询
1.图形界面获取
navicate打开MySQL数据库中的某个数据库,然后在对象最左边可以对特定关键字进行查询,包含该关键字的表会自动显示。
2.SQL命令查询
(1)Mysql数据库
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_name LIKE '%sys%';
(2)PostgreSQL
SELECT table_name FROM information_schema.tables WHERE table_catalog = 'your_database_name' AND table_name LIKE '%sys%';
(3)MSSQL
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'your_database_name' AND TABLE_NAME LIKE '%sys%';
SELECT name FROM sys.tables WHERE name LIKE '%sys%';
(4)Oracle
SELECT table_name FROM user_tables WHERE table_name LIKE '%SYS%';
(5)sqlite
SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%sys%';
1.1.2数据库重要表信息收集
1. 获取数据库中各个表的行数
(1)MySQL
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'your_database_name';
请注意,对于InnoDB表,table_rows可能不是准确的行数,因为它基于统计信息。要获得更准确的结果,可以对每个表执行 COUNT(*) 操作:
SELECT table_name, (SELECT COUNT(*) FROM table_name) AS row_count FROM information_schema.tables WHERE table_schema = 'your_database_name';
(2)PostgreSQL
SELECT relname AS "Table", n_live_tup AS "Rows" FROM pg_stat_user_tables;
(3)SQL Server
SELECT t.name AS TableName,p.rows AS RowCounts FROM sys.tables t
INNER JOIN sys.partitions p ON t.object_id = p.object_id
WHERE t.type = 'u' -- Only user tables AND p.index_id IN (0, 1) -- Heap or clustered index
GROUP BY t.name, p.rows;
(4)Oracle
SELECT table_name, num_rows FROM all_tables WHERE owner = 'YOUR_SCHEMA_NAME';
2. 获取数据库连接帐号和密码
(1) MySQL / MariaDB
用户表 mysql.user,密码字段: password,authentication_string (MySQL 5.7+)
查询用户及密码哈希:
SELECT user, host, authentication_string FROM mysql.user;
SELECT user, host, password FROM mysql.user;
(2)PostgreSQL
用户表:pg_catalog.pg_shadow,密码字段passwd,查询用户及密码哈希(需超级用户权限):
SELECT usename, passwd FROM pg_shadow;
注意: 默认使用 md5 或 scram-sha-256 哈希,需离线破解。
(3)Microsoft SQL Server
视图:sys.sql_logins,密码字段 password_hash,查询登录名及密码哈希:
SELECT name, password_hash FROM sys.sql_logins;
注意: 使用 SHA-512 加盐哈希,无法直接解密。
(4)Oracle Database
视图DBA_USERS,密码字段: PASSWORD (旧版本) 或 SPARE4 (11g+),查询用户及密码哈希(需DBA权限):
SELECT username, password FROM dba_users; -- 10g及之前
SELECT name, spare4 FROM sys.user$; -- 11g+(密码哈希存储在spare4字段)
注意: 11g+ 使用 SHA-1 或 SHA-512 哈希。
3. 获取包含密码的表信息
查找字段名包含“password”,“pwd”,“pass”等关键字的列。
检查这些列的数据类型,通常是字符型(如VARCHAR)。
(1)MySQL
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name' AND COLUMN_NAME LIKE '%pass%' OR COLUMN_NAME LIKE '%pwd%';
(2)PostgreSQL
对于PostgreSQL,可以使用类似的查询方法,但需要访问information_schema.columns:
SELECT table_name, column_name, data_type FROM information_schema.columns
WHERE table_catalog = 'your_database_name' AND (column_name LIKE '%pass%'
OR column_name LIKE '%pwd%' OR column_name LIKE '%password%');
(3)SQL Server
在SQL Server中,可以通过查询系统视图如sys.columns和sys.tables来获取相关信息:
SELECT t.name AS TableName, c.name AS ColumnName,ty.name AS DataType
FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id
JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE (c.name LIKE '%pass%' OR c.name LIKE '%pwd%' OR c.name LIKE '%password%')
AND t.type = 'u'; -- Only user tables
(4)Oracle
在Oracle数据库中,可以查询ALL_TAB_COLUMNS视图来查找相关字段:
SELECT
table_name,
column_name,
data_type
FROM
all_tab_columns
WHERE
owner = 'YOUR_SCHEMA_NAME'
AND (column_name LIKE '%PASS%'
OR column_name LIKE '%PWD%'
OR column_name LIKE '%PASSWORD%');
(5)SQLite
SQLite没有信息模式视图,但可以查询sqlite_master或使用.schema命令结合文本搜索工具(如grep)来查找:
# 使用命令行工具
echo "SELECT name FROM sqlite_master WHERE type='table';" | sqlite3 your_database.db | xargs -I{} grep -Ei 'pass|pwd|password' <(echo ".schema {}" | sqlite3 your_database.db)
或者直接在SQLite命令行中使用:
-- 首先列出所有表名
SELECT name FROM sqlite_master WHERE type='table';
-- 然后对每个表执行如下查询:
.schema YourTableName | grep -Ei 'pass|pwd|password';
1.1.3数据库密码信息收集
1.php配置文件
文件: config.php、database.php、settings.php、.env
// MySQL 连接配置
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'Admin@123';
$db_name = 'myapp';
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
2.ython (Django/Flask)
文件: .env, settings.py, config.yaml
典型代码 (.env):
# Django 数据库配置
DATABASE_URL=postgres://user:Passw0rd@db-host:5432/mydb
典型代码 (settings.py):
# Django settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'django_user',
'PASSWORD': 'Secur3P@ss!',
'HOST': 'db.internal',
'PORT': '3306',
}
}
3.Java (Spring Boot)
文件: application.properties, application.yml
(1)application.properties文件
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=admin
spring.datasource.password=P@ssw0rd2023
(2)application.yml文件
spring:
datasource:
url: jdbc:postgresql://db-prod:5432/appdb
username: appuser
password: "s3cr3t#db"
4. NET (ASP.NET)
文件: Web.config, appsettings.json
Web.config文件:
<configuration>
<connectionStrings>
<add name="MyDb"
connectionString="Server=sqlserver;Database=ProdDB;User Id=sa;Password=Str0ngP@ss;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
5. Node.js
文件: .env, config.js, knexfile.js
典型代码 (config.js):
module.exports = {
db: {
host: 'redis-12345.internal',
port: 6379,
password: 'redisPass123'
}
};
1.1.4数据库通用配置文件及敏感信息
1. 环境变量文件 (跨语言)
文件: .env, .env.production, .env.local
典型内容:
DB_HOST=mysql-cluster
DB_PORT=3306
DB_USER=app_user
DB_PASSWORD=C0mpl3xP@ss!
2. 容器化配置
(1)文件: docker-compose.yml, kubernetes-secret.yaml
典型代码:
# docker-compose.yml(明文密码)
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
(2)yaml文件
# Kubernetes Secret(Base64编码,但易解码)
apiVersion: v1
kind: Secret
data:
db-password: U3VwZXJTZWNyZXQh
3.本地搜索
# 查找包含 "password" 关键字的文件
find /var/www -type f -exec grep -Hn 'password' {} ;
# 检查备份文件
find / -name "*.bak" -o -name "*.old" -o -name "*.swp"
原文始发于微信公众号(小兵搞安全):内网渗透&渗透中的数据库信息收集
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论