분석 일기 - php dynamic variable
🚪 Intro
취약점을 찾기 위해 분석하고 있는 오픈소스 웹 서비스가 있습니다.
며칠 동안 삽질을 통해 발견한 취약점(?)을 기록 및 정리하고자 합니다.
💡 Analysis
해당 취약점은 웹 관리자만 접근 가능하며, php dynamic variable 을 통해 다른 변수의 값을 overwrite 하여 Stored XSS를 동작 시킬 수 있습니다.
관리자 페이지에는 아래 사진처럼 어떤 범위를 지정해 줄 수 있습니다.
하지만, 해당 소스 코드를 분석해 본 결과, 숫자 여부를 확인하지 않고 있었습니다.
위 사진에서 100 이라는 값은 아래 사진 56번째 줄인 `$mb_id1_to` 변수에 저장되어 있습니다.
각각의 값을 `$ma_last_option` 변수에 이어 붙이는 것을 볼 수 있습니다.
최종적으로 `$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를 저장합니다.
위 과정을 보면 어디에도 `||` 라는 문자열을 필터링 하는 코드는 없었습니다.
따라서 공격자는 [그림 1]에서 `||` 문자열과 overwrite 할 변수 이름과 값을 넣으면 경우에 따라 코드 흐름을 바꿀 수 있습니다.
SQLI 를 시도하려고 했으나, overwrite 할 변수가 마땅히 없었습니다. 아쉬운대로 아래 코드에 있는 `$ma_id` 변수를 타겟으로 정해 overwrite 하는 방법을 적어보려고 합니다.
🚩 PoC
위에서 설명했듯이 [그림 1]에서 공격을 하려고 합니다. 아래 사진 처럼 입력합니다.
그럼 [그림 2]의 `$ma_last_option` 변수에는 다음과 같은 값이 저장됩니다.
아래 코드처럼 `||` 문자열과 `=` 문자열로 분리 시키고, 이를 32번째 줄에서 `$ma_id` 변수 값이 `"><script>alert(1)</script>` 로 overwrite 됩니다.
결과를 보면 XSS가 동작하는 것을 볼 수 있습니다.
💀 ETC
XSS 보다 좀 더 강력한(?) 것을 찾아보려고 했으나, 위 취약점으로 할 수 있는게 없네요..
또한 관리자 페이지에서만 되는거라 분석 후 트리거 한 것에 만족해야 겠네요.
'🔒Security' 카테고리의 다른 글
Node.js querystring 함수 분석과 bug 설명 (0) | 2022.07.09 |
---|---|
분석 일기 - file upload 취약점 (0) | 2022.05.12 |
Foobar CTF 2022 writeup (0) | 2022.03.06 |
nodejs express routing case sensitive options (0) | 2022.03.06 |
java URL class를 이용한 내부 파일 읽기 (0) | 2022.03.02 |
댓글
이 글 공유하기
다른 글
-
Node.js querystring 함수 분석과 bug 설명
Node.js querystring 함수 분석과 bug 설명
2022.07.09 -
분석 일기 - file upload 취약점
분석 일기 - file upload 취약점
2022.05.12 -
Foobar CTF 2022 writeup
Foobar CTF 2022 writeup
2022.03.06 -
nodejs express routing case sensitive options
nodejs express routing case sensitive options
2022.03.06