CTF

[SSUCTF] hellOphp

wermut 2025. 2. 27. 01:10

 

 


 

문제  페이지에 접근한 모습

 

문제 페이지에 접근하면 위 페이지를 확인 가능하다.

코드는 매우 간단한데, 아래와 같다.

 

  • try 파라미터는 GET으로, dest 파라미터는 POST로 전달되어야 한다
  • dest 파라미터로 특정한 파일의 경로를 전달하여야 한다.
  • dest 파라미터로 전달된 경로의 파일을 단방향 해싱하여 클라이언트에게 보여준다.
  • 세션과 config.php에 플래그 값은 저장되어 있다.
  • dest 파라미터로 전달되는 값에 config 문자열이 있으면 이를 필터링한다.

문제는 위 내용만으로 설명이 가능하다.

 


 

문제를 해결하기 위해선 몇 가지 사전 지식이 필요하다.

 

  1. PHP에선 세션값을 파일로 관리하며 해당 파일 경로가 정해져 있다.
  2. PHP filter chains: file read from error-based oracle 기법을 사용해야 한다.

 

/var/lib/php/sessions/sess_[ session name ]

 

PHP 에선 위 경로에 세션 값을 사용한다. 위 문제의 flag가 저장된 세션명은 flag로 

/var/lib/php/sessions/sess_flag에 세션 파일이 저장되어 있다.

 

 

flag가 해싱된 모습

 

위 방법을 통해 flag의 해싱 값은 비교적 쉽게 알아낼 수 있으나, 문제에서 사용하는 암호화 알고리즘은

haval224,5로 단방향 암호화 알고리즘이기에 위 방법만으론 flag를 복호화할 수 없다.

 

따라서 플래그 파일의 글자 하나씩을 슬라이싱 하여 레인보우 테이블로 알아내야 하며

이를 PHP Filters chain을 기반으로 구현 가능하다.

 


 

PHP Filters Chain

 

PHP Filters Chain 이란 PHP에 존재하는 Wapper과 Conversion Filter들을 활용하여 

임의의 코드 조각 또는 String을 생성하는 방법이다.

 

여기서의 Wrapper과 Conversion Filter은 다음과 같다.

 

 

  1. Wrapper

PHP Wrapper은 fopen(), copy(), file_exists(), filesize()와 같은 함수들을 지원하기 위해

존재하는 URL-Style Protocol이다.

 

PHP Wrapper의 종류와 기능은 다음과 같다.

Wrapper 종류 기능
file:// 로컬 파일 시스템 접근
http:// HTTP(s) URL 접근
ftp:// FTP URL 접근
php:// 다양한 I/O 스트림 접근
zlib:// 압축 스트림
data:// 데이터(RFC 2379)
glob:// 패턴과 일치하는 경로 이름 검색
phar:// phar 파일 지원
ssh2:// SSL 연결 지원
rar:// rar 파일 지원
ogg:// 오디오 스트림
expect:// 프로세스 상호 작용 스트림 (stdio, stdout, stderr)

 

 

  1. Conversion Filter

PHP Conversion Filter은 스트림 필터로 데이터를 읽거나  쓸 때

특정 변환을 수행하는 기능을 제공한다.

 

Filter 종류 기능
convert.base64-encode 스트림 데이터를 Base64로 인코딩한다. 
convert.base64-decode Base64로 인코딩한 스트림 데이터를 디코딩한다. 
convert.quoted-printable-encode 스트림 데이터를 Quoted-Printable 형식으로 인코딩한다.
convert.quoted-printable-decode Quoted-Printable 형식으로 인코딩한 스트림 데이터를 디코딩한다.
convert.iconv.*. 스트림 데이터의 문자 인코딩을 변환한다. iconv() 함수와 동일한 작업을 수행한다.

 


 

PHP Filter Chains: file read from error-based oracle

 

세션파일의 Flag를 한 글자 씩 유출해 내기 위해선

PHP Filter Chains: file read from error-based oracle을 통해 substr과 같은 기능을 구현 가능하다.

 

 위 공격 방식은 php://filter Wrapper을 악용하는 방법으로,

로컬 파일의 내용을 슬라이싱 하여 알아낼 수 있으며 자세한 방법은 아래와 같다.

 

 

  1. iconv 필터를 반복 적용하여 데이터 크기를 급격히 증가시켜 PHP의 메모리 제한을 초과시킨다.

# Payload

http://[ URL ]/?file=php://filter/convert.iconv.UTF-8.UCS-4LE|convert.iconv.UCS-4LE.UTF-8/resource=[ file path ]

 

위 페이로드에선 UTF-8 > UCS-4LE , UCS-4LE > UTF-8 형식으로 변환하는데,

이는 1-4byte의 가변크기를 사용하는 UTF-8과 4byte의 고정 크기를 사용하는 UCS-4LE의 특성을 이용한 것으로

위 페이로드와 같이 인코딩 변환을 반복하면 문자열의 크기를 키워 PHP의 메모리 제한을 초과할 수 있다.

 

 

  2. dechunk 필터를 활용하여 파일의 첫 번째 문자가 특정문자(16진수)에 속하는지 판별할 수 있다. 

# Payload

http://[ URL ]/?file=php://filter/convert.dechunk/resource=[ file path ]

 

위 페이로드에선 dechunk 필터를 사용하여 파일의 첫 번째 문자가 유효한 청크 인코딩 방식을 

만족하는지 확인한 후, 이를 해석해 순수한 데이터만 반환하게 된다.

 

 

  3. iconv 필터를 사용해 다음 글자를 첫 번째 위치로 이동시켜 위 과정을 반복한다. 

# Payload

http://[ URL ]/?file=php://filter/convert.iconv.UTF-8.UCS-4LE/resource=[ file path ]

 

 위 페이로드에선 이전에 변환시킨 데이터를 다시 변환하여 문자들이 새롭게 UTF-4LE 형식으로

정렬되게 유도해 문자의 위치가 이동하게끔 유도한다. 

 

이러한 일련의 방식을 통해 파일의 내용을 유출시키는 것이 가능하나, 이를 전부 직접 컨트롤하기엔

그 페이로드가 너무 길고 복잡해, 자동으로 파일의 내용을 유출하는 툴이 만들어졌다.

 


 

Payload

 

https://github.com/synacktiv/php_filter_chains_oracle_exploit

 

GitHub - synacktiv/php_filter_chains_oracle_exploit: A CLI to exploit parameters vulnerable to PHP filter chain error based orac

A CLI to exploit parameters vulnerable to PHP filter chain error based oracle. - synacktiv/php_filter_chains_oracle_exploit

github.com

 

위 툴을 사용하여 플래그를 얻어낼 수 있었는데 try 파라미터를 넘김으로써 생성되는

PHPSESSID를 파라미터로 넣어줌으로써 툴을 실행시킬 수 있었다. 

 

페이로드는 아래와 같다.

 

# Payload

python3 filters_chain_oracle_exploit.py --target http://ssuctf.kr:31337/?try=1 --file "/var/lib/php/sessions/sess_[ PHPSESSID ]" --parameter dest

 

Flag가 출력된 모습

 

flag : ssu{54e5c4a213a354beed7b050659435cf1}

'CTF' 카테고리의 다른 글

[ISITDTU CTF] Another one Write-Up  (0) 2025.02.27
[hkcert] Custom-Web-Server(1) Write Up  (0) 2025.02.27
[hkcert] Mystiz's Mini CTF (2) Write Up  (0) 2025.02.27
[IrisCTF] Political  (0) 2025.02.27
[IrisCTF] Password Manager  (0) 2025.02.27