지난 파일 업로드 취약점을 다뤄보고 난 후 문득 든 의문, 확장자 제한이 걸려있는 php, jsp 와 같은 파일이 아닌
jpg, png 와 같은 이미지 파일로는 웹 쉘을 다룰 순 없는 것일까?
결론만 얘기하자면 단순히 이미지파일을 업로드 한것으로는 '불가능' 하다. 서버에서는 이미지 파일을 인식하고 내부의 코드를 실행하지 않기때문.
그렇지만 몇가지 가능한 경우가 존재한다.
1. 확장자를 검사하는 코딩을 어떻게 하였나에 따라 다르다.
> 만약 개발자가 확장자를 검사하는 코딩을 문자열 맨 앞부터 검사하는 방식으로 만들었다면 'webshell.jpg.php'와 같은 파일을 업로드 하였을때 해당 파일은 php 파일이지만 jpg로 인식하여 파일 업로드가 가능하다.
2. NULL Byte Injection
> 문자열을 인식할때 널을 만나면 문자가 끝난것으로 간주한다, 널 바이트 인젝션이란 널 문자열을 삽입하여 우회하는 기법이다.
예를 들어 URL 언어를 사용한다고 가정, 'webshell.php.jpg' 이란 파일이름 중간에 널 문자열인 %00을 삽입하여 'webshell.php%00.jpg' 라는 이름으로 업로드 하게 된다면 웹 서버에서는 jpg 파일로 인식하지만 저장 될 시에는 널 문자열인 %00 을 만났을때 문자가 끝난것으로 간주하여 'webshell.php'라는 이름으로 저장이 되게 된다.
3. .htaccess ( 웹 설정 추가 )
> 해당 웹 서버에 .htaccess 라는 확장자를 가진 파일을 업로드 한다.
.htaccess의 내용은 [ AddType application/x-httpd-php .(원하는 확장자 이름) ] 으로 입력을 해주게 되면 해당 웹 서버에서는
내가 원하는 확장자 이름을 실행할 시 php파일로 인식하여 읽어주게 된다.
4. File Include 취약점
> 해당 서버 내에 File Include 취약점이 존재할 경우에 png파일을 읽어 올 수 있게 된다.
php를 예시로 들자면 아래와 같은 코드가 있다고 가정해보자.
<?php
include $_GET['name'];
?>
GET방식으로 name 파라미터를 받아와 include 하는 코드, 만약 내가 파라미터를 '웹쉘.png' 파일을 요청 하게 된다면
해당 파일은 이미지지만 내부의 코드가 실행되어 나타나게 된다. 해당 문제는 실습문제로 덧붙여 설명하겠다.

우선 해당 웹 서버는 php, php5, pHp, phP 등 여러가지 방식으로 업로드를 우회 시도하였지만 모두 막아 둔 것만 같다.
그래서 File Include 취약점을 활용, png 파일을 업로드 하여 웹 쉘을 실행 시켜 보았다.

해당 URL을 보면 GET방식으로 파라미터를 보내 각각 해당 나라에 맞춰 [en.php, ko.php, jp.php, sp.php] 파일을 Include 하여
보여주는 사이트이다. 해당 요청에 미리 업로드 해둔 webshell.png 파일을 파라미터와 함께 요청 해보았다.

이와 같이 파일 Include 취약점을 활용하면 이미지 파일이여도 웹 쉘이 실행 가능함을 알 수 있다.
이것 뿐만이 아니라 여러가지 시나리오도 가능한데, 우리가 만약 웹 로그가 기록되는 access.log의 경로를 알고있다고 가정,
해당 웹 사이트에 고의적으로 웹 쉘 실행 코드를 요청하게 되면, 웹 로그(access.log)에 웹 쉘 실행 코드가 담기게 된다.
그리고 우리는 웹 로그를 File Include 취약점을 활용하여 불러오게 되면 웹 쉘이 실행이 가능하다.
그럼 이제 마지막으로 File Upload의 대응 방안을 알아보자.
1. 파일 이름 난독화. (파일 경로를 감추는 전략)
> 이 경우 SQL Injection과 같은 파일 경로가 노출되는 취약점이 존재할 시에 위험하다.
2. 확장자 화이트 리시트 기반 필터링.
> 이것또한 NULL Byte Injection과 같은 우회 방법이 존재하여 위험하다.
3. DB에 파일을 저장
> 웹 서버에 파일을 저장하는 것이 아닌 DataBase 내부에 BLOB / CLOB와 같은 방식으로 저장하게 된다면 웹 서버에서 실행 될 일이 없다.
4. NAS 서버
> 위 DB에 저장하는것과 비슷한 방식인데 NAS란 네트워크 연결 스토리지(Network Attached Storage)의 약자로 네트워크를 통해 여러 사용자가 데이터를 저장하고 공유할 수 있도록 하는 장치이다.
'웹 해킹' 카테고리의 다른 글
| 불충분한 인증과 인가 취약점. (0) | 2025.07.26 |
|---|---|
| 파일 다운로드 취약점과 실습 문제 풀이 (1) | 2025.07.21 |
| 리버스 쉘 (0) | 2025.07.16 |
| 파일 업로드 취약점, 문제풀이 (1) | 2025.07.13 |
| CSRF 대응방법, SOP와 CORS (2) | 2025.07.09 |