올바른 id와 pw 값을 넣으면 flag값을 반환하는 문제이다.
소스코드
화면의 기본적인 출력을 담당하는 페이지며 로그인 기능을 구현하였다.
정해진 id와 pw값을 지정한 후 form을 통해 입력받은 데이터와 비교하여 맞을 경우 flag를 아닐 경우 에러를 출력한다.
풀이
function getRandStr($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand(0, $charactersLength - 1)];
}
return $randomString;
getRandStr이라는 함수는 characters변수에 나올 수 있는 값을 미리 저장한 후 랜덤 한 값을 10번 가져와 randomString에 저장한 후 리턴을 하는 함수이다.
$id = getRandStr();
$pw = sha1("1");
변수 id에 getRandStr을 통해 랜덤 한 문자열 10자리를 가져와 저장하고
변수 pw에 1이라는 문자열을 sha1함수를 통해 암호화 한 값을 넣어준다
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_id = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
input 받은 값들을 각 변수에 저장한다.
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
input_id 값이 랜덤 한 문자열과 동일하고 10자리라면 ID pass를 출력하고 그 후
input_pw값이 sha1 암호화한 값의 8자리라면 flag를 출력한다.
id값을 알기 위해서 모든 값을 대입해 보는 브루트포스 공격을 사용할 것이다.
브루트포스를 통해 id를 찾으려 할 수 있겠지만 해당 문제는 php의 비교 연산자의 취약점에 대해 알려주는 문제였던 것이다.
여기서 중요하게 봐야 할 코드는 이 코드이다.
if((int)$input_id == $id
input_id를 가져와 비교할 때 int형으로 변환을 해준다. 이때 만약 input_id가 문자열로 시작한다면 해당 값은 0이 되고 숫자가 먼저 올 경우 먼저 온 숫자까지만 값으로 변환한다
예를 들어 아래의 코드가 실행된다면
결괏값은 이렇게 나오게 된다.
이렇듯 문자열이 먼저 올 모든 경우에는 0이 반환이 된다.
이때 좌항을 비교하던 id도 int형과 비교를 하기 때문에 id의 값 역시 int형으로 형 변환을 하여 비교하게 된다.
그러니 해당 id의 값은 서로 0이 되는 값을 넣기만 하면 되는 것이었다.
그럼 10자리를 모두 0으로 채워준다면 id는 해결이 된 것이다.
그 후 pw를 알기 위해 sha1암호화 방식으로 1을 암호화하게 된다면 356a192b7913b04c54574d18c28d46e6395428ab 라는 값이 나오는데 이 중 8자리만 필요하기에 356a192b를 비밀번호로 사용하게 된다면
성공적으로 flag를 확인할 수 있다.
'Hacking > DreamHack' 카테고리의 다른 글
[DreamHack] 드림핵 amocafe (0) | 2023.11.17 |
---|---|
[DreamHack] 드림핵 random-test (1) | 2023.11.17 |
[DreamHack] 드림핵 baby-union (1) | 2023.11.14 |
[DreamHack] 드림핵 phpreg (0) | 2023.11.14 |
[DreamHack] 드림핵 Carve Party (0) | 2023.11.13 |