본문 바로가기
wargame/wargame.kr

9번 strcmp

by NTART 2019. 10. 30.

strcmp 우회 문제이다.

 

sql문은 가볍게 실패하였다.

 

<?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..";
        }
    }

view source문을 보면 서버 php 소스를 보여준다.

핵심인 곳을 살펴보면,

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

입력한 패스워드 값과, $password 값이 같으면 플래그 값을 얻을 수 있다.

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

그런데 $password값은 랜덤함수 돌린 값을 md5 해쉬암호화를 한 후, sha1 해쉬 암호화를 더 한다.

이 암호를 맞추는 것은 사실상 불가능하며 strcmp 우회를 해야 한다.

 

php stcmp 문자열 비교 함수는 strcmp($a, $b)에서 두 값이 같으면 0을 반환하며, $a가 작으면 음수값을, 크면 양수값을 반환한다.

차이값을 정확히 어떠한 방식으로 내는지는 모르겠다. 왼쪽 그림을 보면, abc까지는 같기 때문에 이후의 글자 길이 차이를 반환한 것 같다. 하지만 오른쪽 사진을 보면 아예 다른 값을 반환한 것으로 보아.. 글자 위치와 ascii코드 값도 반영을 하는 것 같다. 하지만 핵심은 같을 때 0을 반환하는 것이기 때문에 깊게 볼 필요는 없을 것 같다.

 

#cf) strcmp int형 비교 함수는 같으면 0, $a가 작으면 음수로, $a가 크면 양수로 정확한 차이값을 반환한다.

  

#

 

 

하지만 php strcmp함수에는 $a값에 문자열이나 숫자열이 아닌 배열을 인자로 넣으면 반환 값을 비교 값이 같은 0으로 출력하는 취약점이 있다.

ref : https://hackability.kr/entry/PHP-strcmp-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B8%EC%A6%9D-%EC%9A%B0%ED%9A%8C

 

[PHP] strcmp 취약점을 이용한 인증 우회

최조 작성: 2014-02-01 최종 수정: 2015-01-20 안녕하세요. Hackability 입니다. 이번에 작성할 내용은 PHP 에서 strcmp 취약점을 이용한 인증 우회 기법 입니다. 아래와 같이 간단히 인증을 하는 login.php 가 있..

hackability.kr

 

burp suite을 활용하여 보면, php문은 나오지 않고 html문이 나오지만, password를 입력 받는 란이 있다.

name="password"--> name="password[0]"으로 배열 형식으로 입력을 받게 바꿔 foward를 눌러 서버로 전송하였다.

 

그리고 아무 값이나 적어 pw값을 서버로 전송하면

 

플래그 값을 얻을 수 있다. strcmp 취약점을 알고 있다면 쉽게 풀 수 있는 문제인 것 같다.

 

그리고 추가로 php에서 ==는 상당히 취약하며, ===를 해주어야 안전하다 볼 수 있다. 

ref: https://link2me.tistory.com/1144

 

PHP strcmp(string1,string2) (느슨한 비교가 부르는 참사)

문자열 비교 strcmp strcmp(string1,string2); 결과값 0 : 두 문자열이 같다. <0 : string1 is less than string2 >0 : string1 is greater than string2

link2me.tistory.com

 

'wargame > wargame.kr' 카테고리의 다른 글

11번 tmitter  (0) 2019.11.01
10번 md5_compare  (0) 2019.10.31
8번 DB is really good  (0) 2019.10.09
7번 md5_password  (0) 2019.10.08
6번 fly me to the moon  (0) 2019.10.05