webhacking/etc

wargame.kr strcmp

qkqhxla1 2014. 10. 2. 19:43


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

?>


코드게이트 2013에서 나왔던 php strcmp취약점.


찾아보니 루비야님이 잘 정리 해놓으셨음... http://blog.naver.com/withrubiya/70173344266


데이터 전송시 배열형태로 전송하면 된다. password[]=a


배열 형태이면 무조건 0이 반환.... 근데 루비야님의 실험을 보면 php 5.2부터는 제대로 1로 


나온다고함..



$password는 sha1로 변환한 엄청나게 복잡한 값이고 내가 입력해서 POST방식으로 받은


password변수와 비교해서 0이 리턴되면 통과.


php 4버전 이하로 strcmp함수에 배열값이 들어왔을때 NULL값이 반환되어 무조건 0이 반환된다.


PHP5부터는 패치되서 안된다고 한다.