iconv

agnusdei·2025년 8월 3일

CTF

목록 보기
55/185

iconv문자 인코딩 변환을 수행하는 표준 함수이자 유틸리티입니다. PHP, Linux, C 등 다양한 환경에서 사용되며, 특히 PHP에서는 php://filter/convert.iconv.* 스트림 필터를 통해 LFI(Local File Inclusion) 기반 RCE(Remote Code Execution)에 악용될 수 있습니다.


0. 문제

iconv란 무엇이며, PHP의 php://filter/convert.iconv.*가 보안적으로 어떻게 악용될 수 있는가?


1. 서론

정의

  • iconv: 문자 인코딩 변환기 (e.g., UTF-8 → ISO-8859-1).
  • PHP에서는 iconv() 함수 또는 php://filter/convert.iconv.{src}.{dst} 스트림 필터 형태로 사용.

배경

  • PHP에서는 파일 입출력 시 php://filter 스트림 래퍼를 통해 데이터를 실시간으로 변환하거나 가공할 수 있음.
  • 이 중 convert.iconv는 문자셋을 바꾸는 데 사용됨.
  • 원래 목적은 텍스트 변환이나 다국어 지원 등 합법적인 문자열 처리.

출현 이유

  • 다양한 문자 인코딩 간의 호환성 확보 필요성 (웹, 데이터 교환 등).

2. 본론

구성 요소

  • convert.iconv.SRC.DST: 입력 문자셋 SRC를 출력 문자셋 DST로 변환.
  • 예: php://filter/convert.iconv.UTF-8.UTF-7/resource=index.php

보안 악용 원리

[1] LFI(Local File Inclusion) 기반 RCE

  • 조건:

    • 공격자가 include() 또는 require() 등에 파일명을 조작할 수 있을 때
    • 업로드 없이 직접 payload를 넣을 수 없을 때
  • 방법:

    1. 공격자가 원하는 PHP payload (예: <?=\id`?>`)를 변환 체인으로 인코딩
    2. 그 결과를 php://filter/convert.iconv.* 체인으로 구성
    3. 이를 include($_GET['file']) 같은 곳에 삽입하여 실행

[2] 변환 체인 기반 payload 인코딩

  • 인코딩 체인을 통해 파일을 인코딩 → 디코딩 반복하면서 원본 payload를 간접적으로 구성
  • php_filter_chain_generator 도구가 이 체인을 자동 생성

예시

include($_GET['file']);
curl http://target.com/vuln.php?file=php://filter/convert.iconv.UTF8.UTF7|...|resource=php://temp

→ 이 때 payload는 <?=\curl ...`?>` 등 RCE 목적의 쉘 명령 포함 가능

장점

  • 파일 업로드 필요 없음
  • WAF 회피 가능
  • 정적 분석 어렵게 만듦

단점 및 한계

  • allow_url_include 등 설정 의존
  • 인코딩 체인 길이가 너무 길면 필터 오작동
  • 최신 PHP에서는 일부 필터 체인 제한, 탐지 가능

타 기술과의 비교

기법설명업로드 필요탐지 우회성
Web Shell 업로드파일 직접 업로드 후 실행O낮음
Base64 포함 LFIBase64로 파일 감싸기X중간
iconv 체인 이용인코딩 필터로 Payload 삽입X높음

3. 결론 (어린이 버전 요약)

iconv는 글자 인코딩을 바꾸는 기술이에요. PHP에서는 이걸 이용해 글자처럼 보이는 해킹 코드를 서버에 몰래 전달할 수 있어요. 원래는 다른 나라 글자 지원을 위해 만든 기능인데, 해커들이 이걸 돌려서 파일을 안 올려도 서버에서 코드를 실행하게 만들 수 있어요. 보안에선 이런 점을 꼭 조심해야 해요.


핵심만 말하자면: 한글을 영어로 바꾸는 게 아니라, 문자 인코딩 변환 과정에서 바이트 배열이 조작되어 결과적으로 코드가 실행되게 되는 겁니다.

🔥 어떻게 가능한가? — 핵심 개념

  1. php://filter는 파일을 열면서 지정한 방식대로 인코딩/디코딩 필터를 적용해줌.

예:

php://filter/convert.base64-encode/resource=some.php

→ 이건 some.php의 내용을 base64로 인코딩해서 보여주는 필터입니다.

  1. iconv 필터는 문자셋을 바꾸는데, 이 문자셋 변경 과정에서 특정 바이트값이 특정 문자로 해석됨

예를 들어,
• 특정 인코딩에서는 0x3C 0x3F 0x70 0x68 0x70 → <?php로 해석될 수 있어요.
• 그리고 PHP는 <?php부터는 코드를 실행하죠.

  1. 이를 이용해서…

…이런 payload를 여러 문자 인코딩 필터를 조합해서 간접적으로 만들어냄.

그러면 PHP 입장에서는 “이건 텍스트가 아니고, PHP 코드구나!”라고 착각해서 실행하게 되는 거예요.

🧠 예를 들어서 설명하면:

  1. 우리가 직접 PHP 파일에 를 쓰면 실행되죠?

  2. 그런데 파일 업로드도 안 되고, 직접 쓰지도 못하는 상황이면…

우회로로 다음을 시도합니다:
• filter 체인을 사용해서 PHP가 payload처럼 보이도록 유도
• 즉, 인코딩 필터를 조합해 <, ?, = 등 특수문자를 구성

결국 서버는 이렇게 해석:

이게 서버에서 실제로 실행됨 → RCE 달성.

🔬 한글이 영어가 되는 게 아님!
• iconv는 “한글→영어”가 아니라 문자셋 간 바이트 매핑을 바꾸는 도구
• 이 바이트 매핑을 잘 이용하면, 단순 텍스트에서 코드 실행 문자열로 탈바꿈 가능

💥 한 문장 요약:

iconv는 문자 인코딩을 바꾸는 도구인데, 이걸 복잡하게 엮으면 실제로 파일을 만들지 않고도, 서버가 악성 코드를 실행하도록 속일 수 있어요.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글