어디서 많이 본 페이지가 나왔다.

 

디폴트 값을 Get 메소드로 서버에 보내니, id가 출력되었다.

코드가 주어져서 확인을 해봤다.

if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']);
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      echo "hi {$result['id']}";
      if($result['id'] == "admin") solve(45);
    }
    else echo("Wrong");
}

코드를 확인해보니, 50번 문제와 유사한 코드가 있었다.

 

$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');

50번 문제에선 문자의 인코딩 방식이 utf-8로 변경된 것을 이용하여 addslashes 함수에 걸리는 문자 앞에 %a1를 넣어줌으로써 \에 해당하는 %5c%a1과 합쳐서 하나의 문자가 나오게 되어 우회를 할 수 있었다.

나는 해당 코드를 보고 방법이 풀이 방법이 생각이 났다.

admin을 출력해야하는데, preg_match 함수로 막혀있으니 Hex로 admin을 출력해야한다.

50번 문제처럼 서버에 해당 문제의 코드를 돌려서 테스트를 해보니, 아주 잘 먹혔다.

 

위 SQLi 쿼리를 삽입을 하니, 아무 반응이 없었다.

 

그래서 자세히 보기 위해 DataGrip에서 쿼리를 입력하여 해당 결과를 살펴봤다.

그 결과 나는 한가지 실수를 하였다는 것을 알 수 있었다. 내가 생각한 SQLi 쿼리는 SELECT id FROM chall45 WHERE id=‘?’ or True;이라서 전체 데이터가 출력이 된다. 그래서 문제 페이지에선 제일 먼저 들어간 guest가 맨 위에 있어서 guest가 출력된 것이고, 내 서버는 admin이 먼저 생성이 되어서 admin이 출력된 것이였다.

 

이를 해결하기 위해선 SELECT id FROM chall45 WHERE id=‘?’ or id=0x61646D696E;와 같이 id를 지정하면 되는데, 해당 문제에선 =을 검증하고 있기 때문에 LIKE로 우회하여 사용하겠다.

 

그 결과 Flag를 획득할 수 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old - 9 Write Up  (0) 2021.06.14
[Webhacking.kr] Old - 57 Write Up  (0) 2021.06.12
[Webhacking.kr] Old - 44 Write Up  (0) 2021.06.09
[Webhacking.kr] Old - 40 Write Up  (0) 2021.06.08
[Webhacking.kr] Old - 28 Write Up  (0) 2021.06.07
복사했습니다!