해당 문제는 느슨한 문자열 비교에 의해 발견된 취약점을 이용한 문제이다.
먼저 소스코드를 분석해보면 sleep_rand(); 함수를 선언하고 post 방식으로 flag 값이 세팅되어있으면 해당 함수를 호출하는데 이는 flag를 찾는 것과는 무관하다.
그냥 말 그대로 random한 값대로 sleep 하는 함수이다.
중요하게 봐야할 곳은 바로 아래 쪽이다.
<?php
if (! strcasecmp ($_POST['flag'], $flag))
echo '<div class="alert alert-success">Here is your flag: <mark>' . $flag . '</mark>.</div>';
else
echo '<div class="alert alert-danger">Invalid flag, sorry.</div>';
?>
POST 방식으로 넘겨준 flag 파라미터값과 $flag 변수의 값이 일치할 경우 $flag를 출력해준다고 한다.
strcasecmp는 strcmp와 동일한 함수인데 단지 대소문자 비교를 하지 않는다는 차이만 존재하다.
따라서 strcmp의 취약점을 통해 flag를 배열로 넘겨주면 flag가 출력된다.
※ strcmp 취약점
- strcmp(str1,str2)의 경우 return 값이 총 3가지 경우로 나눠져있다.
1) str1>str2 => 양수
2) str1<str2 => 음수
3) str1=str2 => 0
- PHP 5.3 이상의 버전에서 문자열과 배열을 비교하게 되면 NULL을 출력한다. PHP 5.2 이하 버전에서는 문자열과 배열을 비교했을 때 문자열과 "Array"를 비교한다고 한다.
- 문자열 비교 시 느슨한 비교(==)를 할 경우 NULL과 0을 비교하면 True가 되므로 문자열을 알지 못하더라고 배열을 넣으면 두 가지 인자값이 동일하다고 판단하는 것이다.
자세한 사항은 아래 블로그를 참고하길 바란다.
'Hacking > Web' 카테고리의 다른 글
[Websec.fr] level 8 Writeup (0) | 2019.04.11 |
---|---|
[websec.fr] level 25 writeup with parse_url bug (0) | 2019.04.07 |
PHP Object Injection with websec level 4 (0) | 2019.03.26 |
WAS별 default로 허용되어있는 jsp 관련 확장자 (0) | 2019.03.26 |
SQL Injection in SQLite3 (0) | 2019.03.17 |