문제 링크 : http://webhacking.kr:10008/
문제설명
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;
}
$_SESSION['login'] == "admin" 이고 preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR']) 여야 플래그를 얻을 수 있다.
세션이 존재하지 않을 때의 소스
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>");
}
}
http://webhacking.kr:10008/proxy.php?page=/admin/ 을 접속해보았다.
Request Header에 무언가를 삽입할 수가 없고 접근만 한다.
요청시에 세션이 포함되도록 쿼리를 작성한다.
프록시 페이지의 Request Header에 세션 값을 삽입할 수 있게 우회를 해야한다.
프록시 페이지에서는 Header Injection을 이용한다.
개행 문자(%0d%0a)를 이용한다.
/admin/ HTTP/1.1%0d%0aCookie: PHPSESSID=do01jvo450c2j3qteldt46j79l%0d%0aUser-Agent:
로 요청을 보내면 플래그를 얻을 수 있다.