발생 원인
며칠 전 블로그에 백엔드 관리 기능을 추가했으며, SQLite 데이터베이스 디렉토리를 새로 도입했습니다. Mdata 캐시 디렉터리 Mcache기능이 정상적으로 작동한 후, 갑자기 한 가지 생각이 떠올랐다:
직접 접속할 경우 https://域名/Mdata/content.db어떤 일이 일어날까요?해당 기능을 시도해 보니, 브라우저가 특정 파일을 다운로드하기 시작했고 — —— 데이터베이스 파일이 완전히 노출되었다. 이 파일에는 모든 게시물 내용, 사용자 비밀번호 해시값, 번역 캐시 등이 포함되어 있었으며, 만약 크롤러나 일반 사용자가 이 파일을 다운로드했다면 전체 사이트는 마치 투명한 유리창과도 같은 상태가 되었다.
이 글은 문제 진단 및 해결 과정을 기록하여 후속 사용자들에게 참고자료가 되도록 하려 합니다.
1. 먼저 폭발 여부를 확인하세요.
직관에만 의존하지 말고, 먼저 측정하세요. 사용하세요. curl 또는 브라우저에서 하나씩 접속할 수 있습니다:
curl -I https://你的域名/Mdata/content.db curl -I https://你的域名/Mcache/_config.php curl -I https://你的域名/Mdata/views.log curl -I https://你的域名/Mdata/content.db-wal
반환된 HTTP 상태 코드를 확인하세요:
반환 코드의 의미 200 OK 위험문서가 공개적으로 다운로드되었습니다. 403 Forbidden 거절되었지만, 이는 경로의 존재를 드러냈습니다. 404 Not Found 이상적인 결과가 마치 그런 게 없었던 것과 같다면? 200이제 이 문제를 처리해야 합니다.
II. 왜 보타는 기본적으로 방어가 불가능한가?
Baota 패널의 기본 Nginx 설정에서 PHP 처리 규칙은 다음과 같습니다:
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock;
include fastcgi.conf;
}
그것은 단지 관리만 하죠. .php 문서, 기타 확장명(.db、.log、.lock) 이는 정적 파일 처리 규칙을 따릅니다. 따라서 Nginx는 이를 일반 파일로 간주하여 사용자에게 전송합니다. content.db 그렇게 그냥 달리기 시작했다.
어떤 사람들은 이렇게 생각할 수 있습니다: "그건 어때요?" .db PHP 규칙에 추가하는 것으로 해결할 수 있을까요? 아닙니다. 그렇게 하면 Nginx가 PHP를 사용하여 이진 파일을 분석하려고 시도하게 되어 결과적으로 애니메이션 또는 500 오류가 발생합니다.
올바른 방법은독립적인 전фикс 매칭 규칙을 사용하여 전체 디렉터리를 제거합니다.。
III. 핵심 구성 요소
Baota 패널을 열어 → 웹사이트 → 사이트를 클릭 → 구성 파일찾기 server {} 블록에 다음 내용을 추가하세요:
# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
return 404;
}
location ^~ /Mcache/ {
return 404;
}
저장하면 Nginx가 자동으로 재로드됩니다. 그 네 개의 URL을 다시 확인해 보세요. 모두 정상적으로 응답을 반환할 것입니다. 404。
이 두 가지로 문제를 해결했습니다.
IV. 보강: 전체 사이트에 적용
두 개의 디렉터리를 설정하는 것은 단지 시작점일 뿐입니다. 이에 따라 몇 가지 일반적인 규칙을 추가하여 더 다양한 상황을 포괄할 수 있습니다:
# ============ 安全加固 ============
# 屏蔽隐藏文件(放行 .well-known 给证书验证用)
location ~ /\.(?!well-known) {
return 404;
}
# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
return 404;
}
location ^~ /Mcache/ {
return 404;
}
# 屏蔽后台密钥 / 会话文件
location ~ ^/admin/_(key_.*|auth)\.php$ {
return 404;
}
# 兜底:禁止访问任何数据库文件
location ~* \.(db|sqlite|sqlite3|db-wal|db-shm)$ {
return 404;
}
# 禁止访问日志 / 锁文件
location ~* \.(log|lock)$ {
return 404;
}
# 禁止访问备份 / 临时 / 配置文件
location ~* \.(bak|old|orig|save|swp|swo|tmp|inc|ini|conf)$ {
return 404;
}
항목별 해설:
- 숨겨진 파일 규칙차단
.git、.env、.htaccess이러한 종류의 문서.(?!well-known)음성 선도적 주장으로, 부적절한 피해를 방지합니다..well-known(Let's Encrypt를 이용한 SSL 인증서 발급용). - 목차 차단Mdata / Mcache – 두 개의 핵심 디렉터리.
- 백엔드 파일 차단:
Madmin/_key_*.php로그인 키가 저장되어 있습니다._auth.php내부에 대화 토큰이 저장되어 있습니다. 콘텐츠가 주석으로 감싸여 있어 유출되지 않지만, 여전히 추가적인 보안 층이 존재합니다. - 확장명(최종 대체 방안)어느 날 당신이 그것을 가져가게 되면요?
Mdata명칭 변경: 성Data또는 다른 목록에도 포함되어 있을 수 있습니다..db이 규칙은 여전히 막을 수 있습니다. - 로그/잠금 파일:
views.log、views.lock、php_error.log이러한 문서의 내용에는 IP 주소, UA, 오류 스택 등이 포함될 수 있습니다. - 백업/임시 파일편집기(Vim / VSCode / PHPStorm)를 사용하여 생성합니다.
.swp、~、.orig이와 같은 사항에서 개발자가 코드를 수정할 때 삭제하지 않으면 원본 코드가 노출됩니다.
6. 관련 사항 403 和 404 철학
안전 루프에는 이런 오래된 속담이 있습니다:
공격자에게 자신이 무엇을 잘못 했는지 말하지 마세요.
1개 403 Forbidden 이러한 반응은 스캐너에 "여기서 무언가가 있지만, 지금은 당신에게 제공하지 않습니다"라는 메시지를 전송하는 것과 동일합니다. 공격자의 다음 동작은 경로를 우회하거나 경로를 추정하거나 보안 취약점을 찾아내는 것입니다.
而 404 Not Found 침묵 — — — "당신이 보는 것과 내가 보는 것 사이에는 별 차이가 없다."
개인용 소규모 서버에 대한 공격에서는 공격자들이 반드시 '정밀 공격'을 수행하는 것은 아니며, 대부분 자동화된 스캐닝 방식을 사용합니다. 404 오류를 발생시키면 스캐너는 일반적으로 해당 요청을 간과합니다.