web_security/wargame.kr

[wargame.kr] strcmp

HawordFREAKEK 2019. 1. 13. 15:30

학기 중이라 바빠서 라이트 업을 자주 못 썼네요... 슬슬 종강도 다가오고 시간도 남으니 라이트 업 다시 적어보도록 하겠습니다.

일단 이 문제에 접근하기에 앞서 strcmp 가 무엇인지 알아야 합니다. 이 문제를 풀 당시에만 해도 파이썬만 주구장창 공부하던터라 c관련 함수는 잘 몰랐었는데요.



string 해더를 선언해주고, strcmp에 두가지의 문자열을 입력하면 두 문자열의 아스키 코드 값의 차를 -1,0,1 중 하나로 표현해줍니다. 그렇다고 해서 소문자에서 대문자를 빼면 무조건 -1 인가 찾아봤는데 그건 또 아니라고 하더군요..

두 문자열이 같으면 0이 나옵니다.

이렇게 strcmp 의 사용 방법을 알았다면 문제로 들어가봅시다.



일단 입력창이 있고, 입력창은 text 타입이며, password라는 명으로 저장되어 chk을 누르면 제출이 되는 형식입니다.

소스코드를 봅시다.

<?php
    
require("../lib.php"); // for auth_code function

    
$password sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());

    if (isset(
$_GET['view-source'])) {
        
show_source(__FILE__);
        exit();
    }else if(isset(
$_POST['password'])){
        
sleep(1); // do not brute force!
        
if (strcmp($_POST['password'], $password) == 0) {
            echo 
"Congratulations! Flag is <b>" auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo 
"Wrong password..";
        }
    }

?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>

if (strcmp($_POST['password'], $password) == 0) {
            echo 
"Congratulations! Flag is <b>" auth_code("strcmp") ."</b>";
            exit();

이 줄을 보면 건내 받은 password 값이랑 정해져 있는 값이 password 값과 같으면 "축하합니다! 플래그 값은 <b> 하고 뜬다고 하네요..

정해져 있는 password 값이 무엇일까 생각해봤는데, // do not brute force! 브루트 포싱하지말라네요.

이럴 땐 strcmp의 취약점을 사용하면 됩니다. 문자열과 문자열을 비교하는 strcmp에 문자열이 아닌 배열을 입력해주면 0이 반환 됩니다. 뒤에 == 이 아니라 ===을 사용하면 고쳐진다고 하네요.



이런 식으로 password 뒤에 []를 붙혀 배열 꼴로 만들고 제출합니다.



flag 값 이 출력됩니다.