White Security
Easy PHP 문제풀이 본문
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 |