업로드 — 상품 사진 자리에 심는 뒷문
웹셸 · 그리고 여러 겹의 방어
업로드 기능은 편리하지만, 공격자가 서버에 파일을 놓는 통로이기도 합니다.
쇼핑몰에는 상품 사진 업로드가 있습니다. 편리하죠. 그런데 이 기능은
공격자가 내 서버에 파일을 놓을 수 있는 통로이기도 합니다.
공격자가 사진 대신 프로그램을 올리고, 그게 실행되면 어떻게 될까요?
그 결과물이 웹셸입니다 — 브라우저 주소창이 곧 서버의 터미널이 되는, 최악의 상황.
웹셸 — 한 줄짜리 재앙
웹셸은 놀랍도록 짧습니다. 이 한 줄이 서버에 올라가 실행되면:
<?php echo shell_exec($_GET['cmd']); ?>
공격자가 ?cmd=whoami 라고 주소창에 치면, 그 명령을 서버에서 실행하고
결과를 화면에 뿌립니다. SSH 를 아무리 잘 잠갔어도(10강), 웹 서버가 업로드된 파일을
실행해 주면 다 소용없어요.
어설픈 검사는 다 뚫립니다
확장자 검사
cat.jpg.php — 점을 두 번 쓰면 뚫린다
MIME 검사
Content-Type 은 공격자가 직접 적어 보낸다
매직 넘버 + 이름 변경
파일 앞 바이트로 진짜 이미지인지 확인, 이름은 무작위로
확장자 검사는 이름만 봅니다 — 이름은 공격자가 정해요. MIME 검사가 보는
Content-Type 헤더도 공격자가 적어 보내는 값이라 못 믿습니다(13강의 원칙!).
믿을 수 있는 건 파일 내용 그 자체뿐이에요.
사진만 있어야 할 폴더에 .php 가 있으면 웹셸입니다.
🖥️ 내 가상 서버
브라우저 안에서 실행 (계산용)
🤔 확인 문제
업로드 파일 검사로 가장 안전한 것은?
해설 확장자와 MIME(Content-Type)은 공격자가 정하는 값이라 못 믿습니다. 믿을 수 있는 건 파일 내용뿐이에요. 매직 넘버 확인 + 이름 무작위화 + 실행 끄기를 겹쳐 씁니다.
🤔 확인 문제
'심층 방어(defense in depth)'가 뜻하는 것은?
해설 여러 겹으로 방어하는 것입니다. 업로드 검사(1겹)가 뚫려도 폴더 실행 차단(2겹), 이름 무작위화(3겹)가 막아요. 완벽한 단일 방어는 없다는 전제에서 나온 원칙입니다.