[ch4n3] Strcmp (Web)
Strcmp (Web)Created by 해커지망생 | You can get 100point!
|
이 문제는 PHP 에서 strcmp 취약점을 이용한 인증 우회 기법을 이용한 문제다.
근데 아니... 저거 404 NOT FOUND뜸 ;; 일단 패스
문제오류가 수정되었다!
- No...
- <?php
- require_once("./flag.php");
- $password2 = $_GET['password2'];
- echo "Gooooooooooood! flag is ".$flag;
- }
- else{
- echo "No...";
- }
- ?>
이게 본 문제의 소스다. 들어가면 바로 저 소스가 보인다.
flag를 얻기 위해서는 password와 password2를 strcmp로 비교하여 같다면 flag를 출력하게 되어있고
아니라면 No...를 출력하게 되어있다.
일단 밑과 같이 동작한다.
http://respect.dothome.co.kr/strcmp.php?password2=123
=> No...
여기서 password 파라미터를 GET방식으로 얻는데 (POST로 얻어도 상관없다.)
strcmp 함수의 내용을 살펴보면 아래와 같다.
Description ¶
$str1
, string $str2
)Return Values ¶
Returns < 0 if str1
is less than str2
; > 0 if str1
is greater than str2
, and 0 if they are equal.
strcmp($str1, $str2)에서 $str1이 $str2보다 작으면 음수, 반대로 더 크면 양수, 같으면 0이 반환된다.
문제에서 우리가 password의 값과 같은 값을 password2에 넣으면 0이 반환된다. 하지만 rand함수로.. 랜덤으로 나오겠지;;
그래서 password 값을 모르면서 저 값을 0으로 우회할 방법이 필요하다.
구글에 (Google : strcmp() expects parameter 2 to be string, array given in ) 검색하면
PHP 버전 5.2, 5.3에서 strcmp에 대한 취약점을 찾을수 있다.
PHP 버전 5.2에서 strcmp(String, Array())을 실행하면 1 or -1을 반환한다. (5.2에서는 Array()를 "Array"라는 문자열로 변환하여 비교한다...)
PHP 버전 5.3에서는 strcmp(String, Array())을 실행하면 NULL 을 반환한다.
예제를 하나 들면
- <?php
- $str1 = 'rand';
- echo "good !";
- else
- echo "bad ....";
- ?>
이 코드를 실행하면 결과는 "good !"이 나온다.
이는 PHP 5.3 버전에서 strcmp 함수 인자값에 문자열이 들어오지 않을 경우 NULL을 반환하는 것에서
발생한 취약점으로 인해 if( NULL==0 ) 에서 NULL==0은 TRUE가 되어 if문이 실행되는것이다.
여기서 우리는 미리 결과를 봤기 때문에 NULL == 0 의 결과가 TRUE라는 것을 알지만
그러면 결과적으로 NULL은 0 인 것인가 하면... 밑의 비교표를 보면 알 수 있다.
"==" 으로 느슨한 비교를 한 결과
"===" 으로 엄격한 비교를 한 결과
위 두 표를에서 나오듯 느슨한 비교를 할 시에는 NULL이 숫자 0과 같기 때문에 0 == NULL 이 TRUE를 반환하지만
NULL이 0과 같은 타입이 아니기 때문에 0 === NULL 시에는 FALSE를 얻게 된다.
그러므로 위 취약점이 있는 PHP 버전에서 위 같은 취약점이 생기길 원하지 않을 경우 엄격한 비교인 ===을 사용하거나
비교대상이 Array가 아닌지 확인을 통해 취약점을 해결할수 있다. ( 참고로 PHP 5.5버전도 통한다... 어디까지 되는거여 ㄷㄷ)
어쨋든 .. 그러므로 다시 문제로 돌아와서
password2의 값에 array값을 넣어주면 답이 출력된다.
http://respect.dothome.co.kr/strcmp.php?password2[]
Gooooooooooood! flag is {are_y0u_kn0w_strcmp_bo9?} <?php |
flag is {are_y0u_kn0w_strcmp_bo9?}
'Write-up > Web' 카테고리의 다른 글
[ch4n3] 초보 개발자의 일기 (Web) (0) | 2017.03.08 |
---|