Hash collision write up
<?php
error_reporting(0);
require __DIR__.'/lib.php';
if(isset($_GET['foo'], $_GET['bar'])){
if(strlen($_GET['foo']) > 30 || strlen($_GET['bar']) > 30){
die('Too long');
}
if($_GET['foo'] === $_GET['bar']){
die('Same value');
}
if(hash('sha512', $_GET['foo']) !== hash('sha512', $_GET['bar'])){
die('Different hash');
}
echo $flag, '<hr>';
}
highlight_file(__FILE__);
이 프로그램을 만든 개발자는 사용자로부터 foo 라는 값과 bar 라는 값 두 개를 받습니다.
첫 번째 분기문에서 foo 의 값과 bar의 값이 같은지 확인합니다.
두 번째 분기문에서는 사용자로부터 받은 foo와 bar를 각각 sha512로 해시처리하여 비교하고 만약 다르다면 Different hash 를 출력하고 프로그램을 종료합니다.
사실 이 문제를 푸는 방법은 간단합니다.
개발자는 사용자가 foo와 bar에 각각 문자열을 입력하리라 예상하고 있습니다. 하지만, 우리가 해당 프로그램에 입력할 수 있는 것은 Array도 있습니다. 항상 취약점이라는 것은 개발자가 예상한 사용자의 입력 집합이 사용자가 입력할 수 있는 입력 집합보다 작을 때 터지는 것입니다.
hash 함수에 모두 Array가 들어가면 둘 다 똑같이 오류를 내뿜습니다. 그리고 php interactive shell에서 확인해보면 다음은 참이라는 것을 확인할 수 있습니다.
그리고 플래그를 얻습니다.
'write-ups > solveme.safflower.kr' 카테고리의 다른 글
URL filtering write up (1) | 2018.03.04 |
---|---|
Hell JS write up (0) | 2018.03.04 |
thirty six write up (0) | 2018.02.27 |
Give me a link write up (0) | 2018.02.26 |
solveme.safflower.kr bad compare write up (0) | 2017.11.16 |