1. 이승용 - bongbongco@gmail.com
문자열이란 무엇인가.
어순이 다른 언어
1. 세계의 다양한 언어
지난 문서에서 미국이 주도한 컴퓨터 시장에서 미국의 문자 집합인 ASCII TABLE로 표현할 수 없는 문자
를 표현하기 위해서 문자집합과 인코딩 방식을 만들어서 여러 문자를 지원하는 것을 살펴보았습니다. 세
계의 다양한 언어 중에는 한글과 반대 어순을 가지고 있는 언어가 있는 데 여기에 대해서 알아보도록 하겠
습니다.
2. 어순이 다른 언어
2.1. 셈어파
중동과 북동부 아프리카의 어파로 약 2억명 이상의 인구가 사용하고 있습니다. 아랍어와 히브리어가 여기
에 속합니다. 아랍어의 경우 해당 언어를 모르는 사람들이 보면 어디서 부터 읽어야 할지도 모를 정도로
개성이 강한 언어입니다. 한국인 입장에서 느낄 수 있는 큰 특징으로 문자를 오른쪽에서 왼쪽으로 작성한
다는 것이 있습니다.
2.2. 아랍어 윈도우
이미지에서 확인할 수 있듯이 어순이 반대이기 때문에 모든 인터페이스가 반대로 되어 있는 것을 볼 수 있
습니다. 윈도우 인터페이스 이외에도 워드 프로그램으로 아랍어를 혼용하여 사용하게 되면 부호와 특수문
자의 위치가 변경되는 등의 혼란스러운 경험을 하게 됩니다.
1. 아랍어로 구동된 윈도우 운영체제
2. 이승용 - bongbongco@gmail.com
2.1. RTLM (Right To Left Mark)
라틴 계열 언어를 기반으로 만들어진 컴퓨터는 알파벳을 제외한 다른 언어를 고려하지 않았었습니다. 컴
퓨터가 세계적으로 보편화되면서 다양한 언어들을 지원하게 되는 데, 아랍어와 같이 어순이 다른 언어는
어떻게 지원하고 있을까요. 바로 어순 변경을 알리는 출력되지 않는 문자를 삽입하여 이를 해결하고 있습
니다.
RTLM을 사용한 HTML 문서
1. 동일한 두 문장 중에서 한 문장에만 RTLM 삽입
2. RTLM을 삽입한 문장이 역순으로 출력된 것을 확인
Right to Left Mark 를 삽입한 줄은 어순이 반대로 출력된 것을 볼 수 있습니다. (아랍어를 해석할 수는
없지만 느낌표를 보면 알 수 있습니다!)
3. 이승용 - bongbongco@gmail.com
3. RTLM 을 활용한 취약점
유니코드에서는 ‘U+202e’ 문자를 이용하여 어순을 오른쪽에서 왼쪽으로 변경하고 있으며 RTLO(Right
To Left Override) 혹은 RLO(Right Left Override)로 명명하고 있습니다. 단순히 어순 변경 문자를 삽입
하였을 뿐인데 여러가지 형태의 치명적인 공격이 가능하게 되는 데 이를 알아보도록 하겠습니다.
3.1. 악성코드 공격
오랜만에 피카츄 배구가 하고 싶어 네이버에서 피카츄 배구를 검색하여 다운받은 압축파일에는 “피카츄
배구잘하는방법exe.txt” 이라는 파일이 함께 압축되어 있다고 가정해보겠습니다.
1. 동일한 이름의 두개의 파일 확인
2. 텍스트 문서 아이콘으로 작성되어 있는 파일 실행하여 메모장 실행 확인
3. 응용프로그램 아이콘으로 작성되어 있는 파일 실행하여 응용프로그램 실행 오류 창 확인
4. 이승용 - bongbongco@gmail.com
‘pika.exe’ 와 함께 있는 두 개의 ‘피카츄배구잘하는방법exe.txt’ 파일을 실행하고 그 결과를 확인하였습니
다. 동일한 ‘.txt’ 확장자를 가지고 있는 것으로 보이지만 실행 결과를 보면 다른 형식의 파일이라는 것을
알 수 있습니다. 다시 말해 응용프로그램의 아이콘을 가지고 있는 파일의 확장자는 ‘.txt’ 가 아니라 ‘.exe’
인 것입니다. 어떻게 이것이 가능할 수 있을까요. 유니코드의 ‘U+202e’ 를 이용하면 가능합니다. ‘피카츄
배구잘하는방법[U+202e]exe.txt’ 는 [U+202e] 이하 문자가 역순으로 처리되어 ‘피카츄배구잘하는방법
txt.exe’로 처리됩니다. 아이콘을 변경한 상태에서 유포하게 된다면 별다른 의심없이 파일을 실행하게 되
어 공격자의 랜섬웨어에 감염되거나 키로거가 실행되는 등의 악성 행위에 피해를 입을 가능성이 높아 보
입니다.
3.2. 파일 업로드 공격
사용자가 직접 확장자나 파일 유형을 확인하는 경우도 있지만, 컴퓨터가 확장자를 확인해야 하는 경우도
있습니다.
어순 변경을 통해서 확장자 체크 로직 우회하기
업로드 확인을 위한 ‘Hello World!’를 출력하는 간단한 코드를 작성하고 어순을 변경하여 업로드를 시도
하였습니다. 서버 프로그램에서 확장자를 추출하는 방식에 따라서 로직을 우회할 수 있는 가능성이 있습
니다.
1. RTLO 문자를 삽입한 PHP 파일로 업로드 시도
2. 파일 업로드 확인
<? echo "Hello World!" ?>
5. 이승용 - bongbongco@gmail.com
4. 마치며
어순이 다르다는 언어적 특징을 악용해서 발생될 수 있는 취약점에 대해서 알아보았습니다. 모르셨던 분
들에게는 도움이 되는 문서가 되었으면 좋겠습니다. 실습을 하다보니 간편하게 ‘U+202e’를 삽입하는 툴
을 하나 만들어둬야 겠다는 생각이 드네요. 재미없는 글 끝 까지 읽어주셔서 감사합니다.