🗂️ INDEX

글 작성자: Universe7202

🚪 Intro

취약점을 찾기 위해 분석하고 있는 오픈소스 웹 서비스가 있습니다.

며칠 동안 삽질을 통해 발견한 취약점(?)을 기록 및 정리하고자 합니다.

 

💡 Analysis

해당 취약점은 웹 관리자만 접근 가능하며, php dynamic variable 을 통해 다른 변수의 값을 overwrite 하여 Stored XSS를 동작 시킬 수 있습니다.

 

관리자 페이지에는 아래 사진처럼 어떤 범위를 지정해 줄 수 있습니다.

하지만, 해당 소스 코드를 분석해 본 결과, 숫자 여부를 확인하지 않고 있었습니다.

[그림 1] 관리자 페이지 기능 중 일부

 

위 사진에서 100 이라는 값은 아래 사진 56번째 줄인 `$mb_id1_to` 변수에 저장되어 있습니다.

각각의 값을 `$ma_last_option` 변수에 이어 붙이는 것을 볼 수 있습니다.

[그림 2]

 

최종적으로 `$ma_last_option` 변수의 값은 DB에 다음과 같이 저장 됩니다.

mb_id1=1||mb_id1_from=1||mb_id1_to=100||mb_email=admin@domain.com||mb_mailling=1||mb_level_from=1||mb_level_to=10||gr_id=

 

위에서 저장된 값을 불러오는 과정은 아래 코드와 같습니다.

27번째 줄에서 `||` 문자열을 기준으로 나눕니다.

이후 for문을 통해 한번 더 `=` 문자열을 기준으로 나눕니다. 이는 key와 value 를 나누기 위함 입니다.

31번째 줄에서 key를 `$var` 변수에 저장하고 value 값이 있다면, `Dynamic variable` 을 사용하여 `$$var` 변수에 value를 저장합니다.

[그림 3] Dynamic variable 동작 과정

 

위 과정을 보면 어디에도 `||` 라는 문자열을 필터링 하는 코드는 없었습니다.

따라서 공격자는 [그림 1]에서 `||` 문자열과 overwrite 할 변수 이름과 값을 넣으면 경우에 따라 코드 흐름을 바꿀 수 있습니다.

 

SQLI 를 시도하려고 했으나, overwrite 할 변수가 마땅히 없었습니다. 아쉬운대로 아래 코드에 있는 `$ma_id` 변수를 타겟으로 정해 overwrite 하는 방법을 적어보려고 합니다.

[그림 4] 타겟 변수

 

🚩 PoC

위에서 설명했듯이 [그림 1]에서 공격을 하려고 합니다. 아래 사진 처럼 입력합니다.

[그림 5] payload 입력

 

그럼 [그림 2]의 `$ma_last_option` 변수에는 다음과 같은 값이 저장됩니다.

[그림 6] $ma_last_option 변수의 값 전후 비교

 

아래 코드처럼 `||` 문자열과 `=` 문자열로 분리 시키고, 이를 32번째 줄에서 `$ma_id` 변수 값이 `"><script>alert(1)</script>` 로 overwrite 됩니다. 

[그림 7] Dynamic variable 동작 과정

 

결과를 보면 XSS가 동작하는 것을 볼 수 있습니다.

[그림 8] XSS 동작

 

 

💀 ETC

XSS 보다 좀 더 강력한(?) 것을 찾아보려고 했으나, 위 취약점으로 할 수 있는게 없네요..

또한 관리자 페이지에서만 되는거라 분석 후 트리거 한 것에 만족해야 겠네요.