Is unicode safe?

2024. 8. 28. 19:42Web Security/웹 해킹

Is unicode safe?

2024년 5월 경 위와 같은 질문글이 reddit이라는 사이트에 올라왔고 다양한 토론들이 오갔다. 이번 기회를 통해서 unicode를 통해서 발생되는 문제를 살펴보고자 한다. 추가적으로 아래에 댓글에서 사진과 같은 특수문자열들을 통해서 의도하지 않는 패턴을 그려놓았다. 이 또한 일반적인 문자만을 고려하여, 문자열의 입력 길이를 고려하였고, 유니코드와 같이 U+0307 (Combining Dot Above) 또는 U+030A (Combining Ring Above)와 같은 문자를 고려하지 않았기에 원래 문자가 존재하면 안되는 html 영역까지 넘어가 버린 것이다.

 

유니코드란 아스키코드의 한계점을 보안하기 위해서 나온 체계이다. 과거 컴퓨터에서는 아스키코드라는 언어체계를 사용하였지만 7bit만을 사용하여 언어를 표현하였기에 모든 문자열을 담기는 힘들었고, 더 많은 문자 중국어, 한국어 등을 모두 표현하기 위해서 유니코드가 개발된 것이다. 하지만 이러한 유니코드에도 단점이 있다. 정보보안 전문가의 관점에서 본다면, 너무 많은 글자들이 존재하기 때문에 이들을 모두 고려하면서 개발하다 보면 치명적이 오류들이 발생한다는 것이다.

 

유니코드 bybass ngnix

ngnix는 웹 서버이다. 동적 콘테츠가 필요한 경우 was로 넘겨주어서 동작된다.

 

우리가 웹 사이트를 운용할 때, 사이트의 전반적인 운영이 필요하기에 따로 빼두는 페이지가 있을 것이다. 이러한 admin 페이지에 외부인 무작정 접속한다면 사이트 운영에 어려움을 겪을 수 있다. 그렇기에 웹 서버 단 혹은 웹 응용 서버 단에서 필터링을 할 수 있다. 하지만 종종 웹 서버단에서의 필터링을 믿고 웹 응용 서버단 에서 필터링을 하지 않고 전체 IP 접속 허용을 하는 경우가 있다. 다음과 같은 필터링은 유니코드를 통해서 우회할 수 있다.

아래는 웹 서버인 nginx의 구성이다.

아래 사진은 flask이다.

 

ngnix와 flask는 입렵받을 수 있는 유니코드에서 차이가 존재한다. \\x85, \\xA0 문자는 ngnix에서는 입력되지만 flask에서는 무시되어지는 유니코드이다. 그렇기에 만약 www.취약점사이트.com/admin\\xA0 이라는 사이트에 접속요청을 보낸다면 ngnix에서는 /admin\\xA0 에 접속시도를 한 것으로 받아드려서 차단하지 않을 것이고, flask에서는 /admin 사이트에 접속한 것으로 받아드려 admin 페이지를 보여줄 것이다. 이외에도 유니코드가 정규화 되면서 문제점이 발생한다.

이는 다음페이지에서 설명할 것이다.

 

유니코드 xss bypass

유니코드 정규화(Unicode normalization)는 유니코드 문자열에서 같은 의미를 가지는 여러 다른 표현들을 표준화된 형태로 변환하는 과정입니다. 여기서 발생되는 문제를 통해서 다양한 공격시도를 할 수 있다. 아래 내용은 정규화 과정에서 유니코드가 예측할 수 없는 값으로 바꾼다는 뜻이다.

아래 사진은 Chloé 라는 사람의 이름을 a와 b의 방식으로 다르게 표현한 것이다. 정규화를 거치지 않은 상태에서 비교한다면 잘못된 결과가 나온다. 이를 통해서 정규화가 필요한 것을 알 수 있다.

 

이를 이용해 sql injection filter를 우회할 수 있다.

 // [a] 쿼리 문자열 매개변수 "name_search"를 읽습니다.         
     문자열 이름 검색 = Request.QueryString["이름 검색"];         

     // [b] SQL 주입을 방지하기 위해 따옴표 제거         
     이름 검색 = 이름 검색.Replace("'","");           
     문자열 연결_문자열 = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSQLServer"].ConnectionString;         

     // [c] 유니코드 호환성을 보장하기 위해 이름 문자열을 정규화합니다.          
     name_search = name_search.Normalize(NormalizationForm.FormKD); 

위 처럼 정규화 하기전에 sql injection filter를 진행할 경우, %uff07 다음과 같은 풀와이드'(Full-width) 작은따옴표 입력하여 bypass할 수 있습니다. 일반적인 작은 다옴표 아님. %uff07 가 정규화되면 일반적인 다음표로 정규화됩니다.

 

공격자가 users 라는 테이블에서 사용자 이름 과 비밀번호 열을 검색하려고 한다고 가정하면 다음 UNION SELECT 문이 삽입될 수 있습니다.

?name_search=chloe%uff07 UNION SELECT username, password from users --

 

 

쉽게 말해서 아래와 같은 흐름으로 진행된다. 

 

일반적인 작은따옴표와 비교 → 다름 → 필터되지 않음 → 정규화 → 일반적인 다음표로 정규화 → sql injection 성공

 

이러한 정규화에 따른 문제점은 xss filter bypass에도 사용됩니다. 

 

출처

https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/

https://velog.io/@gkqkehs7/nginx-web-server-was

https://www.reddit.com/r/hacking/comments/1cwq329/is_unicode_safe/

https://blog.rubiya.kr/index.php/2018/11/29/strtoupper/

'Web Security > 웹 해킹' 카테고리의 다른 글

CSP : Content-Security-Policy  (1) 2024.09.19
CSRF - CSRF token, SameSite Cookie  (1) 2024.09.19
SOP와 CORS  (2) 2024.09.18
XSS에 대해서 기초적인 내용  (2) 2024.09.16
Document Object Model??  (4) 2024.09.01