<?php
include "./config.php";
login_chk();
$db = mssql_connect("kraken");
if(preg_match('/master|information|;/i', $_GET['id'])) exit("No Hack ~_~");
if(preg_match('/master|information|;/i', $_GET['pw'])) exit("No Hack ~_~");
$query = "select id from member where id='{$_GET['id']}' and pw='{$_GET['pw']}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
if($result['id']) echo "<h2>{$result['id']}</h2>";
if($krakenFlag === $_GET['pw']) solve("kraken");// Flag is in `flag_{$hash}` table, not in `member` table. Let's look over whole of the database.
highlight_file(__FILE__);
?>
공격 백터
id
pw
공격 백터에 대한 검증
id : master, information, ;
pw : master, information, ;
코드 분석
$db = mssql_connect("kraken");
MsSQL 문제이다.
$query = "select id from member where id='{$_GET['id']}' and pw='{$_GET['pw']}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
if($result['id']) echo "<h2>{$result['id']}</h2>";
필터링을 통과한 공격 백터 id, pw는 쿼리문에 들어가게 된다. 들어가게된 쿼리문은 id='공격 백터 id' and pw='공격 백터 pw'인 member 테이블에 저장된 id을 반환한다.
만약 반환된 id가 있다면 id을 페이지에 출력한다.
if($krakenFlag === $_GET['pw']) solve("kraken");// Flag is in `flag_{$hash}` table, not in `member` table. Let's look over whole of the database.
문제 클리어 조건은 flag_{hash} 테이블에 저장된 flag 값과 공격 백터 pw가 같으면 클리어하게 된다.
문제 풀이
MsSQL에서 테이블을 출력할 수 있는 방법은 master, information, sys를 이용한 방법이다. 하지만 master, infomation은 필터링되어 sys를 이용하여 테이블과 컬럼을 찾아내도록 하겠다.