Wargame/webhacking.kr

Challenge old 51 (250)

마띠(쥔장) 2020. 2. 11. 16:18

초기 화면에는 Webhacking.kr 내 ID와 비번이 들어있고 제출을 눌러보면

Wrong 이 뜬다

<?php
  if($_POST['id'] && $_POST['pw']){
    $db = dbconnect();
    $input_id = addslashes($_POST['id']);
    $input_pw = md5($_POST['pw'],true);
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"));
    if($result['id']) solve(51);
    if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>";
  }
?>

id와 pw는 post 방식으로 넘겨지고 id는 addslashes()를 통해 쿼트 처리가 된다.

pw는 md5() 처리가 되는데, 

md5("문자열"): 문자열을 md5 암호화해서 32자리의 16진수 값으로 반환하고

md5("문자열", true): 위의 값을 16자리의 2진수 형식으로 반환한다. 기본값은 false다.

 

id는 쿼트 같은 거 처리만 해주는 함수기 때문에 아무거나 넣어도 상관이 없을 것 같은데

pw는 내가 넣은 값 -> md5 암호화 -> 16자리 2진수로 표현의 과정을 거치기 때문에 아무거나 넣어서는 안된다.

 

select id from chall51 where id='{$input_id}' and pw='{$input_pw}' 의 쿼리문에서

pw 변수가 들어가는 양쪽으로 싱글 쿼터가 있기 때문에

위의 일련의 과정을 고려해 양쪽으로 싱글쿼터가 있고 그 둘을 이어줄 '='이 있어야 한다.

즉, aaaa'='bbbb 의 형식이다. 물론 여기서 aaaa와 bbbb는 무슨 값이든 상관없다.

'거짓=거짓'은 참이기 때문이다.

md5암호화, 16자리 2진수 표현값에 '='가 포함되면 그만이다.

 

그럼 pw를 찾아보자

문자열에 내가 찾는 특정 문자열이 포함되어 있는지 확인할 수 있는 strpos()를 사용했다.

결과값은 다음과 같다.

id는 admin으로, pw는 1839431로 넣어보자

 

 

728x90