[webhacking.kr] 3번 문제 풀이[SQL]

1 분 소요

💡 Webhacking.kr challenge(old) 3번 문제에 대한 풀이입니다.

문제

문제 화면

처음 문제를 늘어가면 그림과 같이 네모네모 로직을 푸는 문제가 나옵니다. 가뿐히 풀어줍니다. 노노그램이라고 부르는구나..

image

image

문제를 풀면 다음과 같이 이름을 적는 칸이 나옵니다.

image

guest를 입력해 주면 다음과 같이 기록이 됩니다.

image

문제 접근

이번 문제는 소스코드는 따로 없고 웹사이트 작동 로직을 분석해서 공격 벡터를 찾는 문제 같습니다.

기록이 되는 페이지를 보니 name,answer,ip가 기록이 되고 이것들을 내가 변조할 수 있는지 생각해서 sql injection을 시도해 봤습니다.

먼저 가장 만만한 name에 인젝션을 시도해 봤습니다. ' 문자를 넣어서 오류가 나는지 확인해보니 텍스트 그대로 저장이 되는걸 보니 name쪽은 아닌것 같습니다. 그 다음은 ip나 answer 부분에 입력이 가능한 곳을 찾아야 합니다.

image

개발자 모드로 확인을 해보니 answer값을 hidden value로 전송해 주고 있었습니다.

image

이 값을 다음과 같이 변조 해서 보내봅니다.

image

??? 풀렸다. image

문제 해석

문제가 너무 허무하게 풀려서, PHP 코드가 어떻게 되어 있는지 추측을 해보고 왜 저 구문으로 인해서 문제가 풀렸는지 분석해 보겠습니다.

우선 제가 입력한 값으로 인해서 나온 페이지는 다음과 같습니다.

image

결과 값을 보아하니 DB에서 데이터를 불러오는 부분에서 where 조건절을 우회하여 모든 컬럼 값을 뽑아온 것 같습니다. 몇가지 시도를 해보고 나니 다음과 같이 php 코드가 짜여 있었을 것으로 추측이 됩니다.

 <?php
  $ip =  $_SERVER["REMOTE_ADDR"];
  $name = $_POST['id']
  $answer = $_POST['answer']

  # DB에 값이 들어갈 땐 성공적으로 들어간 것을 보니, 들어갈 땐 특수문자 ' 에 대한 처리를 해줬다.
  mysqli_query($db,"insert into chall3(ip,name,answer) values('$ip','$name','$answer'))";

  # 문제는 불러오는 부분에서 특수문자 처리를 안해줘서 다음의 구문에서 Injection 취약점이 발생한 듯.
  $result = mysqli_query($db,"select name,answer,ip from chall3 where answer ='$answer'  and  ip='$ip'");
  ... 나온 결과  화면 출력	
  ?>

위처럼 쿼리가 작성되어 있어서 저의 입력 값이 들어가면 다음과 같이 where 구문을 우회한 모든 값들을 뽑아온 것 같습니다.

  select name,answer,ip from chall3 where answer = '1' or 1=1 -- and ip='$ip'

댓글남기기