전화번호를 입력하는 페이지가 나왔다.

 

?phone=010-9333-0222&id=guest

카페에서 여자가 내 번호를 물어봤을 때, 내가 여자의 폰에 전화번호를 입력하는 설레는 마음으로 입력하여, 서버로 보내니 no hack이 출력되었다.

왜 까였는지 확인하기 위해, 코드를 분석하였다.

$db = dbconnect();
if($_GET[‘phone’] && $_GET[‘id’]){
  if(preg_match(“/\*|\/|=|select|-|#|;/i”,$_GET[‘phone’])) exit(“no hack”);
  if(strlen($_GET[‘id’]) > 5) exit(“no hack”);
  if(preg_match(“/admin/i”,$_GET[‘id’])) exit(“you are not admin”);
  mysqli_query($db,”insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})”) or die(“query error”);
  echo “Done<br>”;
}

phone과 id가 파라미터로 받는다.

phone에 *, /, =, selcet, -, #, ; 문자가 포함되어 있으면, “no hack”이 출력된다.

id의 길이가 5 초과이면, “no hack”이 출력된다. 또한 id이 admin의 문자가 포함되어 있으면 “you are not admin”이 출력된다.

위 조건을 모두 통과를 하면, insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})의 쿼리를 통해 값이 저장이 된다.

$isAdmin = mysqli_fetch_array(mysqli_query($db,”select ip from chall35 where id=‘admin’ and ip=‘{$_SERVER[‘REMOTE_ADDR’]}’”));
if($isAdmin[‘ip’] == $_SERVER[‘REMOTE_ADDR’]){
  solve(35);
  mysqli_query($db,”delete from chall35”);
}

select ip from chall35 where id=‘admin’ and ip=‘{$_SERVER[‘REMOTE_ADDR’]}’의 결과가 나의 공인 IP와 일치한다면, Flag를 출력한다.

 

$phone_list = mysqli_query($db,”select * from chall35 where ip=‘{$_SERVER[‘REMOTE_ADDR’]}’”);
echo “<!--\n”;
while($r = mysqli_fetch_array($phone_list)){
  echo htmlentities($r[‘id’]).” - “.$r[‘phone’].”\n”;
}
echo “-->\n”;

select * from chall35 where ip=‘{$_SERVER[‘REMOTE_ADDR’]}’의 결과를 HTML 주석으로 출력한다.

나는 코드를 보고 일단 chall35 테이블에 내 IP로 저장된 데이터들을 출력하였다.

 

주석으로 데이터가 출력되었다.

나의 IP으로 저장된 admin 계정이 없고, guest 계정만 있다는 것을 알 수 있었다.

나는 insert into chall35(id,ip,phone) values(‘{$_GET[‘id’]}’,’{$_SERVER[‘REMOTE_ADDR’]}’,{$_GET[‘phone’]})를 통해 admin을 삽입하고자 하였다.

Id 파라미터에서 Hex을 검증을 안하여, hex를 이용하여 admin를 삽입하고자 하였다.

 

시도를 하였지만 no hack이 출력이 되었고 그 이유를 보니, id의 길이가 5를 초과하여 no hack이 출력된 것이였다.

시도할 수 있는 공격백터는 id와 phone으로 진행해야하는데, id는 길이 때문에 공격에 사용할 수 없다.

phone로 공격해야한다는 것을 생각을 하였고, 혹시 내가 모르는 insert 쿼리 사용법이 있는지 알아보기로 하였다.

공부해서 남 주자
위 블로그에서 방법을 찾을 수 있었다.

테스트를 해보니, admin이 잘 삽입된 것을 볼 수 있다.

 

2'), ('admin', '223.38.91.158', '3으로 계속 시도하였는데 query error가 나와서 당황했는데, 문제의 코드를 자세히 보니 phone의 타입은 int형이였다.

2), ('admin', '223.38.91.158', 3으로 시도하니, 정상 작동하였다.

 

내가 생각한 이론이라면, Flag가 바로 출력되어야 하는데 출력이 되지 않아서 주석을 확인해보니 admin이 저장되지 않았다.

 

Query문이 잘못되었다면, Error를 출력했을텐데 출력이 되지 않았으니 IP주소가 틀린 것인데 IP주소는 틀림없이 맞는 주소였다.

집에서 한번 더 시도하고, 안되면 다른 사람의 풀이를 참고해야겠다……

 

 

집에서 시도하였더니, flag를 획득할 수 있었다.

밖에선 아이폰의 핫스팟으로 시도하였는데, 왜 안됬는지 의문이다. 일단 문의 넣어봤다.

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

[Webhacking.kr] Old - 53 Write Up  (0) 2021.05.30
[Webhakcing.kr] Old - 48 Write Up  (0) 2021.05.29
[Webhacking.kr] Old - 8 Write Up  (0) 2021.05.28
[Webhacking.kr] Old - 3 Write Up  (0) 2021.05.28
[Webhacking.kr] Old - 60 Write Up  (0) 2021.05.27
복사했습니다!