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으로 출력하는 취약점이 있다.
[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 |