보안 문제 풀이

배재현·2025년 3월 26일

정보 보안

목록 보기
3/12

2025년 3월 20일 학교에서 풀었던 보안 문제 5개에 대한 풀이와 해설이다.

Dreamhack devtools-sources

문제 바로가기

문제 개요

이 문제는 브라우저의 개발자 도구를 이용해서 플래그를 찾는 문제다.

소스코드를 다운로드 받으면 html 페이지가 나오는데, 저 많은 파일들 중에 어딘가에 숨겨진 플래그를 찾겠다고 파일을 하나하나 까보는건 미친짓이다.

해결 방법

개발자 도구를 사용해야한다고 했으니 아무 html이나 열어서 개발자 도구를 열어보자. 개발자 도구에는 전체 검색 기능이 있으므로 파일을 하나하나 열어볼 필요가 없다. 플래그는 DH{...} 형식이므로 Ctrl + Shift + F 로 전체 검색을 켜서 DH{를 검색하면 쉽게 플래그의 위치를 찾을 수 있다.

Webhacking.kr old-15

문제 바로가기

문제 개요

이 문제는 누르자마자 Access Denied라는 알림과함께 홈으로 리다이렉트된다. 당황하지 말고 저 알림을 뚫고 플래그를 얻으면 된다.

해결 방법

1. 자바스크립트 차단

알림은 자바스크리브에서 alert()함수로 띄우는 것이므로 자바스크립트를 차단하면 alert에 방해받지 않고 문제에 들어갈 수 있다. 개발자도구에서의 Disable JavaScript 설정은 그 페이지에서만 일시적으로 적용되는거라서 webhacking.kr 사이트 설정에 들어가서 자바스크립트를 아래와 같이 차단해야한다.

  alert("Access_Denied");
  location.href='/';
  document.write("<a href=?getFlag>[Get Flag]</a>");

이후 문제에 다시 들어가면 하얀 페이지만 나오는데, 개발자 도구에서 Elements에 들어가면 getFlag라는 쿼리 스트링과 함께 요청을 보내면 Flag를 얻을 수 있다는 것을 알 수 있다. 요청을 보내기 전에 사이트 설정에서 자바스크립트를 다시 허용해야 정상적으로 플래그를 얻을 수 있다.

2. fetch로 html 본문 가져오기 (내가 푼 방법)

자바스크립트를 차단하지 않고 풀려면 이 방법을 사용하면 된다.
문제 리스트에서 개발자 도구를 켜서 보면 webhacking.kr/challenge/js-2/라는 url로 리다이렉트 된다는걸 알 수 있다. 그래서 Console창에서 fetch() 함수로 요청을 보내면 html 본문을 가져올 수 있다.

fetch('https://webhacking.kr/challenge/js-2/')
  .then(response => response.text())
  .then(data => {
    console.log(data);
  })

주의! console에서 붙여넣기를 사용하려면 allow pasting이라는 명령어를 입력해야한다.

이후에는 1. 과 동일한 방식으로 진행하면 풀 수 있다.

Webhacking.kr old-20

문제 바로가기

문제 개요

nickname, comment, captcha 이렇게 3개의 입력 칸이 있는 html form이 주어져있다. 하지만 이걸 단 2초만에 모두 입력하고 Submit 버튼까지 눌러야하는 손가락 근육을 테스트하는 매우 어려운 피지컬 문제이다.

해결 방법

개발자 도구에서 Elements를 보면 lv5frm이라는 form 안에 각 input별로 name이 정해져 있다. 여기서 중요한건 captcha 코드도 값이 채워져있는 input이기 때문에 자바스크립트로 접근할 수 있다.

lv5frm.id.value = 'a';
lv5frm.cmt.value = 'a';
lv5frm.captcha.value = lv5frm.captcha_.value;
lv5frm.submit();

주의! console에서 붙여넣기를 사용하려면 allow pasting이라는 명령어를 입력해야한다.

새로고침 후 자바스크립트를 2초안에 붙여넣으면 플래그를 획득할 수 있다.

Webhacking.kr old-24

문제 바로가기

문제 개요

접속한 기기의 뭔가 이상한 형태의 IP와 User Agent를 볼 수 있다. view-source를 클릭하면 php 코드를 볼 수 있고, 최종적으로 ip가 127.0.0.1이면 풀린다는 것을 알 수 있다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 24</title>
</head>
<body>
<p>
<?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($HTTP_USER_AGENT){
    $agent=htmlspecialchars($HTTP_USER_AGENT);
  }
  echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>";
  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }
?><hr>
<a href=?view_source=1>view-source</a>
</body>
</html>

해결 방법

하지만 우리의 ip가 127.0.0.1이 되어서 요청을 보낼 수는 없다. 그렇다면 ip 변수에 어떤 값이들어가는지 보면 된다.
extract($_SERVER)로 서버와 클라이언트의 변수를 가져오고, extract($_COOKIE)로 쿠키 값도 가지고 온다. 그 이후에 REMOTE_ADDR값이 ip에 대입된다. 그렇다면 REMOTE_ADDR이라는 이름의 쿠키를 넣으면 $_SERVER의값을 무시하고 들고 올 수 있지 않을까?
하지만 ip를 str_replace로 이상한 값으로 치환을 해버린다. 그래서 치환 후에 정확히 127.0.0.1이 되도록 112277...00...00...1을 넣으면 된다.

Webhacking.kr old-32

문제 바로가기

문제 개요


이 문제에 접속한 사람들의 아이디가 나오고, Hit가 많은 순서대로 정렬이 되어있다. 내 아이디의 Hit가 100이 넘으면 문제를 해결할 수 있다.

해결 방법

아무 유저의 id를 클릭하면 그 사람의 Hit가 1 늘어나고 내 id가 보드에 등록된다. 하지만 그 이후 자신의 id를 다시 클릭하면 you already voted라는 메시지만 뜬다.
쿠키를 뜯어보면 vote_check라는 쿠키가 ok되어 있을텐데, 그 쿠키를 삭제하면 투표를 하지 않은것으로 간주되고 다시 투표를 할 수 있다.
하지만 이렇게 투표하고 삭제하고를 우직하게 100번 하는것은 너무 비효율적이므로 python으로 매크로를 짜서 1초만에 100번 투표하는 선거 조작을 해보자.

import requests

session = requests.Session()

url = "https://webhacking.kr/challenge/code-5?hit=${자신의_아이디}"

cookies = {
    'PHPSESSID': ${자신의_세션_아이디}
}

for i in range(100):
    session.get(url, cookies=cookies)
    session.cookies.clear()

개발자 도구에서 내 id와 세션 id를 복사한 다음 저 매크로에 넣어서 실행하고 새로고침하면 된다.

profile
많관부

0개의 댓글