wargame.kr strcmp
<?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부터는 패치되서 안된다고 한다.