Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

White Security

Easy PHP 문제풀이 본문

CTF Writups

Easy PHP 문제풀이

POSIX 2019. 3. 30. 20:51

 

b00t2root 2019 web 1번

PHP Type juggling, unserialize 취약점 문제입니다.

 

페이지에 접속하면 highlight_file 함수에 의해

소스가 출력되는데. 그 아래를 보면

$_GET['1']과 md5($_GET['1']) 을 비교하고 있습니다.

 

 

md5에는 해싱 이후에도 동일한 0e[0-9]+ 형식이 반환되는

매직 해시가 존재하는데

 

http://3.16.68.122/Easy-php/?1=0e215962017

 

둘 모두 지수표현으로서 매우 작은 값이므로 

이 매직 해시와 php의 느슨한 비교 취약점을 사용하면

비교문을 통과할 수 있습니다.

 

다음은 $_GET['2']와 $_GET['3'] 을 인자로 사용하는데

엄격한 비교 연산자 !== 를 사용해 둘이 모두 같지 않아야 하고

숨겨진 값인 $salt를 접두시켜 해싱한 결과같이 동일해야 합니다.

 

http://3.16.68.122/Easy-php/?1=0e215962017&2[]=1&3[]=2

 

그러나 이 hash함수는 두 인자에 배열을 입력해줌으로서

isset을 통과하고 hash 인자로서 기능하지 않도록 할 수 있습니다.

 

unserialize 함수로 $_GET['4'] 인자를 역직렬화 시키는데

친절하게도 상단에 Secrets이라는 객체를 선언해 주었습니다.

$flag3 가 대입되는 $res->flag와 $res->temp가 동일해야 하는데

 

http://3.16.68.122/Easy-php/?1=0e215962017&2[]=&3[]=&4=O:7:"Secrets":2:{s:4:"temp";N;s:4:"flag";R:2;}

 

이 두 값들은 인자를 역직렬화 시켜 나온 객체를 통해

연산하므로 $res->temp 를 $res->flag의 레퍼런스 변수로 생성해 줌으로서

비교문을 통과할 수 있습니다.

 

이로서 간단하게 플래그를 얻어낼 수 있었습니다.

다른 도구를 사용하지 않고 브라우저만으로 해결이 가능한 문제라 편했네요.

'CTF Writups' 카테고리의 다른 글

PingService 문제풀이  (0) 2019.03.30
Set Me Free 문제풀이  (0) 2019.03.30
neverlanctf 2019 - React to this writeup  (0) 2019.02.04
neverlanctf 2019 - purvesta writeup  (0) 2019.02.04
neverlanctf 2019 - Dirty Validate writeup  (0) 2019.02.04
Comments