[SuNiNaTaS(써니나타스)] 7번 문제 풀이


오늘(3.13)은 어제 6번 문제에 이어서 7번 문제를 풀기로 했다. 하얀색 바탕이 파란색 바탕으로 바뀌는 것을 보니 기분이 좋았다. 하나씩 채워가는 모습을 보면서 이런 맛에 문제를 푸는 것 같다.

(문제 목록)

 

 

7번 문제를 클릭하게 되면 아래의 사진처럼 처음에는 아이유 사진이 나온다. 아이유 사진 위에는 'Do U Like girls?'라는 문구와 함께 스크롤을 내리다보면 끝부분에서는 윤아 사진을 볼 수 있다. 맨 처음에 문구는 단순히 물어보는 문구인 것 같다. 해당 박스에 난수 값을 입력해도 아무일도 일어나지 않았기 때문이다.

(처음에 아이유 사진이 엄청 크게 나와서 놀랐다......)

(7번 문제)

 

 

그리고 아이유와 윤아 사진 중간에 'YES' 입력 버튼 하나가 덩그러니 있었다. 

(뭘까...?)

('YES' 입력 화면)

 

 

저렇게 덩그러니 있는 것들은 한번 눌러보고 싶은 욕구가 생기기 마련이다. 그래서 바로 클릭해봤더니 아래와 같은 팝업창이 떴다.

('YES'버튼을 누른 후 팝업창)

 

 

'실패... 내가 너무 느리다'라고 한다.... 이제 해당 페이지에서는 아무것도 발견할 수 없어서 html 소스코드를 확인해보기로 했다. 들어가자마자 힌트가 있었다.

'Faster and Faster'

힌트는 빠르게 하라는 데 어떤걸 빠르게 하는지 감이 안잡혔다. 그래서 소스코드 안에 숨겨져 있는 것을 자세히 확인해보기로 했다.

(힌트!)

 

 

<head>부분을 확인해보니 스크립트를 발견했다. 이벤트 부분인 것 같았다.

(이벤트 : 사용자가 어떤 행동을 취했을 때, 그로 인해서 변화가 이루어지는 것을 말한다. 여기서 행동은 "사용자가 클릭했을 때", "스크롤을 내렸을 때" 등을 의미한다.)

(스크립트)

 

 

소스코드 해석


        function noEvent() { // noEvent라는 함수
        
            if (event.keyCode == 116 || event.keyCode == 9) { // keyCode가 116,9일때 실행한다.
            
                alert('No!');	// 'No!'을 출력한다.
                
                return false;	// false 값을 반환한다.
            }
            
            else if (event.ctrlKey && (event.keyCode = 78 || event.keyCode == 82)) {
            			// Ctrl을 누르면서 keyCode 값이 78이거나 82일때 실행한다.
            
                return false;	// false 값을 반환한다.
                
            }
            
        }
        document.onkeydown = noEvent;	// 행동을 했을 때 noEvent 함수가 실행된다.
    

 

더 자세히 설명하자면

event.keyCode


해당 함수는 Javascript로 사용자의 키 입력을 감지하는 함수입니다. 아래 표는 event.keyCode 모음을 나타낸 것이다.

(출처:  https://fruitdev.tistory.com/144 )

 

 

즉, 해당 소스코드

event.keyCode == 116 || event.keyCode == 9

116은 'F5', 9는 'tab'으로 7번 문제 페이지에서 'F5'와 'tab'을 입력시 'No!' 팝업창이 출력되고 false 값을 반환하는 것이다.

 

또,

event.ctrlKey && (event.keyCode == 78 || event.keyCode == 82)

78은 'n', 82는 'r', ctrlKey는 'Ctrl키를 누르는 것'으로 결국 'Ctrl'을 누르면서 'n'키나 'r'을 누르면 false 값을 반환하는 것이다.

 

 

event.ctrlCode


해당 함수는 이벤트 발생시 어떤 키를 눌러야 되는지 알 수 있는 함수이다.

속성 개요
ctrlKey Ctrl 키를 눌렀는 가
altKey Alt 키를 눌렀는 가
shiftKey Shift 키를 눌렀는 가
which 키 코드의 종류

 

 

 

다시 문제풀이로 돌아와서 'F5'랑 'Tab'키를 눌렀을 때, 아래의 화면처럼 'No!'라는 팝업창이 뜨게 된다.

 

 

 

여기서 우리가 유추할 수 있어야 하는 것은 아까 중간에 봤던 'YES'버튼을 빠르게 눌러야지 문제가 해결 되는 것 같았다. 왜냐하면 스크립트 외에도 소스코드에서 힌트가 더 있었기 때문이다.

 

아래의 화면처럼 form 형식의 소스코드를 확인할 수 있었다. 소스코드를 간략하게 설명해보자면

해당 form의 이름은 'frm'으로 'post'방식으로 'YES'에서 submit 하게 된다면 './web07_1.asp' 페이지로 넘어가는 것이다.

(form 소스코드)

 

 

좀 더 자세히 설명을 하자면 일단 오른쪽 'YES' 코드는 

<input type = "submit" value = "YES">

입력받은 데이터를 서버에 전송하기 위한 'submit'란 type을 사용한 것인데, 이때 입력할 수 있는 버튼이 자동으로 생기게 된다. 이때 버튼 안의 값을 'YES'라고 넣은 것이다.

 

즉, 

1. 서버에 데이터를 전송할 수 있는 버튼(submit)이 생성

2. 버튼 안에 값을 'YES'로 지정

3. 이따가 설명할 <form> 태그 안에 입력된 'action' 속성으로 지정한 서버로 데이터가 전송!

 

 

이제 왼쪽 코드

<form method = "post" action = "./web07_1.asp" name = "frm">

- form 데이터를 "post" 방식으로 전송하는 것이다. 다시말해 form 데이터를 HTTP POST 메소드로 전송하는 것이다.

- action은 데이터를 받을 때 전송하는 서버를 적어 놓은 것이다.

- name은 form의 이름을 "frm"으로 지정하겠다는 말이다.

 

 

그러면 문제를 풀기 위해서 해야하는 작업은 재빠르게 'YES' 버튼을 눌러야 하는 것인데, 아까 내가 직접 'YES'버튼을 눌렀을 때는 실패라고 팝업창이 떴다. 그렇기에 'F12'에서 'Console'을 이용하기로 했다. 

아래의 화면처럼 "frm.submit()"을 입력하게 계속 엔터를 눌렀다.

(직접 새로고침하기)

 

 

반복적으로 엔터를 눌러주니 축하한다는 팝업창과 함께 키값이 나왔다.

(성공!)

 

 

키값을 복사해서 AUTH 창에 넣어주니 문제가 풀렸음을 알려줬다.

(문제 해결!)

 

물론 점수도 올라갔다.

(점수 획득!)

 

 

 

[잘못된 풀이]


form에서 web07_1.asp 서버로 데이터가 옮겨지는 것이니깐 콘솔을 이용해서 문제를 푸는 것이 아닌 바로 그 서버로 옮기게끔 입력을 했다. 아래의 화면처럼 도메인 주소창에 "/web07_1.asp"을 입력해서 넘어가게끔 했다.

 

 

 

결과는 아래의 화면과 같았다.

 

 

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

[SuNiNaTaS(써니나타스)] 6번 문제


오늘은 어제에 이어서 6번문제를 풀었다. WEB 문제이기도 하고 연속으로 문제를 풀고 싶은 마음에 6번을 풀었다.

(문제 목록)

 

 

6번 문제를 들어가보면 아래의 사진과 같다. 처음 문제를 봤을 때, 잘못들어온줄 알았다. 다른 웹사이트에 접속한 줄 알았지만, 게시물 목록을 보니 문제인 것을 알 수 있었다.

(6번 문제)

 

 

1번 게시물부터 5번 게시물까지 하나하나 들어가봤다.

 

첫번째 게시물은 아래와 같다.

영어를 해석하면 '써니나타스의 글을 읽어라' 이것이 힌트라고 하는데 감이 잡히질 않았다.

(1번 'Hint')

 

 

두번째 게시물은 'md5로 바꿔주는 사이트'이다. 나중에 문제를 풀때 필요한것인가보다.

(2번 'reference!')

https://md5hashing.net/

 

MD5Hashing

Ultimate Hashing and Anonymity toolkit

md5hashing.net

(MD5Hashing 사이트)

 

 

세번째 게시물은 다른 웹 페이지로 넘어가는 것이 아니라 password를 입력하라는 창이 떴다. 밑에 문장은 SQL구문으로 해석하면 이렇다.

Select szPwd from T_Web13 where nld = '3' and szPwd = '"&pwd&"'

T_Web13 테이블에서 컬럼 nld의 값이 3이면서 컬럼 szPwd의 값이 &pwd&szPwd의 이름으로 컬럼을 찾는 것이다.

아마도 'SQL Injection'문제로 password에 참 값을 넣는 것 같다. 그래서 여기서 패스워드를 입력해야 문제가 풀릴 것 같은데, 일단 다른 게시물에 힌트가 있는 지 확인해보기로 했다.

(3번 'README')

 

 

네번째와 다섯번째 게시글은 문제를 풀기에 도움이 되는 않는, 단순히 만들어 놓은 것들로 보여서 이건 넘어갔다.

(4번 5번 게시글)

 

 

전체적인 게시글을 보았는 데, 세번째 'README'를 풀어야 문제를 푸는 데 진행이 될 것 같다.

이 문제는 'SQL Injection'로 풀어야 하는데, 가장 많이 사용이 되는 "1 'or' 1 '=' 1" 을 대입해 봤다. 대입해본 결과 "NO! hacking!" 이라는 구문이 팝업창으로 나타났다. 쿼리문이 전달되지 않았던 것 같습니다.

(가장 많이 사용하는 구문 입력 시 화면)

 

 

그래서 연산자(=)를 바꿔보았습니다. '='과 비슷한 기능을 할 수 있는 'like'로 바꿔서 SQL문을 넣어보니 쿼리문이 성공을 했습니다. 그래서 팝업창에 'suninatastopofworld!' 라는 단어와 함께 글을 읽을 수 있었습니다.

(쿼리문 해결!)

 

 

세번째 게시글의 진짜 모습은 아래의 사진과 같습니다. 'README' 게시글을 보니 키를 찾으라고 합니다. 그래서 'F12' 버튼을 눌러서 소스코드를 확인했습니다. 

(진짜 'README' 게시글)

 

 

소스코드를 확인해보니 'KET_HINT'라는 이름 옆에 'Rome's First Emperor'가 있었습니다.

(힌트 발견)

 

 

바로 구글에다가 'Rome's First Emperor'을 검색하니 아래와 같은 결과가 발견됐습니다. 

(Rome's First Emperor)

 

 

그래서 Auth 키 값에 이름을 넣으니 문제가 풀렸습니다.

(문제 해결!)

 

점수도 올랐구요!

(점수 획득!)

 

 

 

[잘못 접근한 풀이]


사실 진짜 세번째 게시글을 발견했을 때, 키 값이 'suninatastopofworld!'라고 해서 이걸 이용해서 문제를 푸는 줄 알았습니다. 그래서 쿠키값에 해당 글자를 넣었습니다. 하지만 접근권한이 없다는 것으로 나왔습니다.

(쿠키에 값을 넣은 화면)

 

 

그래서 이번에는 두번째 게시글에서 'reference!'에 있는 MD5Hashing을 이용했습니다. 'suninatastopofworld!' 문자를 MD5 변환을 이용해서 쿠키 값에 넣었는 데, 아무련 변화가 없었습니다....

(MD5Hashing)

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

[SuNiNaTaS(써니나타스)] 5번 문제


오늘은 'Suninatas(써니나타스)' 문제를 풀기로 했다. 매번 100점 문제들만 풀다 보니 실력이 늘지 않는 것 같아서, 오늘은 4번 옆에 있는 301 point 5번 문제를 풀기로 했다. 1번부터 5번까지 보면 4번까지는 100점대인데 5번만 300점대이다. 처음에는 살짝 겁이 났지만 그래도 할 수 있을 거라 생각했다.

(문제 목록)

 

 

5번 문제를 들어가면 아래의 사진처럼 'Check key Value' 라고만 나와있었다. 문제를 처음 접했을 때 생각은 네모 박스 안에 올바른 key 값을 넣으면 되는 것 같았다. 그럼 이제 키값을 넣어야 하는데 화면에는 아무것도 없으니 'F12'을 눌러 화면 자체의 코드를 확인해보았다.

(5번 문제)

 

 

소스코드를 확인해보니(아래의 사진) 힌트로 숫자 '12342046413275659'가 보였다. 이것을 이용해서 문제를 해결하는 것 같다.

(사실 이 값을 그대로 네모박스에 넣어봤다.... 힌트라고 그래서.... 하지만 아무 일도 일어나지 않았다ㅜㅜ)

(힌트~)

 

 

주석으로 힌트처리된 거 말고 제대로 된 소스코드를 확인해보고자 숨겨져 있는 코드들을 확인하기 시작했다. 그랬더니 아래의 사진처럼 복잡해 보이는 스크립트가 존재했다. 이것을 보고 해석하려고 했지만 실력이 없어서 무슨 소리인지 한참을 들여다보았다.

(스크립트 소스코드)

 

 

한참을 봐도 무슨 소리인지 몰라서 머리가 지끈거릴 때, 아래에 'Authkey'값에서 힌트를 얻었다. 'Unpacking JavaScript'라는 힌트를 통해 해당 소스코드가 'Packing'되어 있다는 걸 깨닫고 문제를 풀었다.

(Unpacking JavaScript)

 

 

해당 스크립트가 'Packing' 되어 있으니 'Unpacking'을 시도해줘야 한다. 나는 그래서 대신 'Unpacking' 해주는 사이트를 이용하기로 했다. 아래 사이트가 대신해주는 사이트이다.

https://www.strictly-software.com/unpacker#unpacker

 

Unpack Javascript - Strictly Software

// Create a get elements by class name function document.getElementsByClassName = function(clsName){ var retVal = new Array(); var elements = document.getElementsByTagName("*"); for(var i = 0;i < elements.length;i++){ if(elements[i].className.indexOf(" ")

www.strictly-software.com

 

 

스크립트에 있는 소스코드를 긁어와서 'Unpack'을 눌러주면 숨겨져 있는 소스코드를 확인할 수 있다.

('Unpakcing' 하는법)

 

'Unpacking'한 소스코드는 아래와 같다. PASS함수를 이용하라고 하는데, 5번 문제 소스코드에서는 PASS함수가 보이지 않았다. 그러면 PASS함수 안에 힌트 값을 넣으면 문제가 풀리지 않을까 생각했다.

var digitArray = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
function PASS(n) {
	var result = '';
	var start = true;
	for (var i = 32; i > 0;) {
		i -= 4;
		var digit = (n >> i) & 0xf;
		if (!start || digit != 0) {
			start = false;
			result += digitArray[digit]
		}
	}
	return (result == '' ? '0': result)
}

 

 

그래서 'F12'을 눌러서 'Console'창에 들어갔다. 그다음에 내가 임의로 값을 만들어서 "PASS(12342046413275659)" 입력했다. 출력 값으로 난수 값이 출력되었고, 이 값을 그대로 네모 박스 안에 넣었다.

(PASS 안에 값 넣은 화면)

 

전체적으로 보면 아래의 사진과 같이 되는데, 난수 값을 넣어주면 'Authkey'값이 출력되는 것을 확인할 수 있다.

(키값 입력 화면)

 

 

나온 Auth 값을 메인 화면에 넣어주면 아래와 같이 점수가 올라가는 것을 확인 할 수 있다!

(점수 향상!)

 

 

 

[문제 해결]


이번 문제는 5번 문제를 풀면서 어려울 줄 알았다. 사실 'Unpacking JavaScript'가 아니었으면 문제 접근을 하기 힘들었을 것이다. 다행히 넓게 봐서 문제를 풀 수 있었던 것 같았다.

그리고 언패킹에 관해서 살짝 언급되어서 이 부분에 대해서 공부가 아주 조금 된 것 같기도 하다.

또 콘솔 창에서 작업을 이번이 처음인데 아직 많이 어색하다. 좀 더 익숙해질 수 있도록 연습해야겠다.

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

[Webhacking.kr] 24번 문제풀이


오늘은 "Webhacking" 24번 문제를 풀었다. 밖의 날씨도 비가 오고 늦잠도 자버려서 점수 배점이 낮은 문제를 풀었다. 

(Webhacking 24번문제)

 

 

24번 문제에 들어가면 아래의 화면처럼 'client ip'와 'agent'가 보인다. 'agent' 옆을 보니 사용자의 환경을 뜻하는 것 같았고, 'client ip'는 난수가 들어가 있는 것처럼 보였다. 그리고 'Wrong IP!'까지 현 화면에서는 문제를 풀 수 없는 것들만 보였다. 

(24번 문제)

 

 

처음 화면에서는 아무것도 발견할 수 없어서 'view-source'에 들어가서 소스코드를 확인해보기로 했다. 아래 화면은 24번 문제의 소스코드이다.

(24번 소스코드)

 

 

문제를 풀기 위해선 소스코드를 해석해야한다.

 

소스코드 해석


1. extract 함수

해당 함수는 배열 속의 키의 값들을 변수화 시키는 것이다.

 

예를 들어 

$a[x] = "Hello";

$a[y] = "World";

extract($a);

 

echo $x;

echo $y;

 

결과 값은 "Hello World"가 출력되는 것이다.

 

사실 extract() 함수를 사용하지 않고 배열을 이용해서 출력할 수 있다. 

$a[x] = "Hello";

$a[y] = "World";

 

echo $a[x];

echo $a[y];

 

결과 값은 위와 같이 "Hello World"가 출력될 것이다.

  extract($_SERVER);
  extract($_COOKIE);

 

 

2. htmlspecialchars() 함수

해당 함수는 HTML 코드가 들어가는 특수 문자를 일반 문자로 인식되어 출력되게 하는 것이다.

 

'&' -> '&amp;'

'"(큰 따옴표)' -> '&quit;'

''(작은따옴표)' -> '&#039'

'<' -> '&ltl'

'>' -> '&gt'

 

위에 써놓은 것처럼 HTML 코드가 들어오면 우리가 일반 문자로 바꿔주는 함수인데, 문제를 풀 때는 사용하지 않는 것 같다.

(문제에 풀 때 필요한 것이면 댓글로 알려주시겠어요?)

    $ip = htmlspecialchars($REMOTE_ADDR);

 

 

3. str_replace("1번","2번","3번") 함수

1번째 인수 : 변경 대상 문자

2번째 인수 : 변경하려는 문자

3번째 인수 : 변수 또는 문자열

 

즉, str_replce("노랭이", "키큰", "노랭이 라바")라고 할시 

'노랭이 라바' -> '키큰 라바'로 바뀌게 된다.

 

그러면  해당 소스코드는 아래와 같이 "ip" 값이 아래와 같이 바뀔 것이다.

'..' -> '.'

'12' -> ''

'7' -> ''

'0' -> ''

    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);

 

 

4. 'ip'값이 127.0.0.1 일 경우 문제가 풀리게 된다.

  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }

 

 

 

문제 풀이


이제 본격적으로 문제를 풀기 위해서는 (나 같은 경우는 크롬을 사용했다.) 쿠키 하나를 추가시켜줘야 한다.

 

저는 "EditThisCookie"라는 확장 프로그램을 이용해서 'REMOTE_ADDR'를 추가시켰다.

 

추가시키는 방법은 아래와 같다. 일단 오른쪽 위에 있는 쿠키 모양의 아이콘을 클릭한다. 그다음 '+' 모양을 클릭한다. 그리고 추가하고 싶은 이름의 쿠키를 작성하면 끝이다.

'쿠키 아이콘 클릭' -> '+' 클릭 -> 추가하고 싶은 쿠키 이름 설정 후 '체크 표시' 클릭 

 

 

REMOTE_ADDR에 값을 넣어서 ip 값을 127.0.0.1이 출력되게 하려면 "112277...00...00...1"을 넣어주면 된다.

112277...00...00...1

빨간색으로 된 글자는 지워지게 되고, 회색 바탕으로 된 것은 '..' -> '.'로 바뀌게 된다. 그래서 아까 만들었던 REMOTE_ADDR 값에 112277...00...00...1 넣어주면 끝이다.

 

 

쿠키 값에 값을 넣고 'F5'을 눌러주면 아래와 같은 팝업창이 뜨게 된다.

(문제 해결)

 

'client ip' 값에는 127.0.0.1 이 출력되면서 100 point을 얻었다는 문장과 함께 문제를 풀었다.

(문제 해결)

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[인코딩 & 디코딩]


오늘은 어제 문제를 풀면서 헷갈렸던 내용에 대해서 정리하고자 한다. 내용을 알고 있지만 두루뭉실하게 개념이 잡혀있어서, 문제를 풀때마다 매번 혼란이 오게 된다. 그래서 오늘 확실하게 개념을 잡고자 한다.

 

어제 풀었던 [Webhacking.kr] 26번 문제 링크이다.

https://200301.tistory.com/8

 

[Webhacking.kr] 26번 문제풀이

[Webhacking.kr] 26번 문제풀이 오늘은 "Webhacking" 26번 문제를 풀었다. 이 문제를 풀게 된 계기는 점수 배점도 낮고, 단순히 가운데 정도에 위치해 있기에 풀게 되었다. 26번 문제에 들어가보면 검은색 바탕화..

200301.tistory.com

 

 

사실 인코드와 디코드에 대해서 아래의 사진만 정확하게 이해하고 있다면 매번 구글에 인코딩, 디코딩을 검색할 이유가 없다. 즉, 아래 사진을 완벽하게 알고 넘어가야한다.

('Decode'와 'Encode' 명확한 사진)

출처 : https://sourcedexter.com/data-encodingdecoding-in-python/

 

Data encoding/decoding in python - Source Dexter

I was given a QR CODE  and the contents of it were encrypted or encoded data. It could have been any

sourcedexter.com

 

 

인코딩(Encoding)


인코딩 = 코드화 = 암호화 = 부호화

'컴퓨터에서 인코딩은 동영상이나 문자 인코딩 뿐 아니라 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정을 통틀어 말합니다. '

(출처: 나무위키)

 

 

즉, 사람이 인지하지 못하고 컴퓨터가 이해할 수 있도록 바꿔주는 것을 의미한다. 그 예로 'ASCII', 'URL인코딩', 'HTML인코딩', 'Base64인코딩' 등이 존재한다. 각각 컴퓨터가 이해할 수 있는 언어로 바꿔주기 때문에 어떤 것을 중심으로 인코딩을 해야하는 지 명확하게 이해한 후 인코딩을 진행해야 한다.

아래의 사진들은 각각 'ASCII 인코딩 표'와 'URL 인코딩 표'이다.

('ASCII 인코딩 표')

 

 

 

('URL 인코딩 표')

 

나무위키에서 명확하게 개념을 설명했지만 만약 그 내용이 길다고 생각하면 우리는 간단하게 "문자(문자열)을 바이트형식으로 변환" 라고 알고 있으면 된다.

 

 

디코딩(Decoding)


디코딩 = 역코드화 = 복호화

디코딩은 인코딩의 반대로서 사람이 이해 할 수 있도록 바꿔주는 것을 의미한다.

 

즉 "바이트형식을 문자(문자열)로 변환" 이다.

 

아래의 사진들은 각각 'ASCII 디코딩 표'와 'URL 디코딩 표'이다.

('ASCII 디코딩 표')

 

 

 

('URL 디코딩 표')

위에서 설명한 인코딩 표와 디코딩 표는 같을 수 밖에 없다. 문자를 바이트형식으로 바꾸거나, 반대로 변환할 때 필요한 표는 하나로 충분히 바꿀 수 있기 때문이다.

 

 

 

[인코딩 & 디코딩 변환 사이트]


사실 간단한 문자 같은 것들은 인코딩 표를 보고서 금방 변환 할 수 있다. 하지만 긴 문장일 경우에는 하나하나 대입해보기가 힘든 상황이다 그래서 나는 자동으로 변환해주는 인코딩 & 디코딩 사이트들을 가지고 왔다. 

 

ASCII 인코더 & 디코더

https://www.easycalculation.com/ascii-hex.php

 

String to ASCII chart, ASCII to decimal convertor, String to decimal converter, string hexadecimal / hex conversion

 

www.easycalculation.com

 

 

BASE64 인코더 & 디코더

http://www.convertstring.com/ko/EncodeDecode/Base64Encode

 

Base64로 인코딩 - 온라인 Base64로 인코더

 

www.convertstring.com

 

 

URL 인코더 & 디코더

http://www.convertstring.com/ko/EncodeDecode/UrlDecode

 

URL 디코드 - 온라인 URL 디코더

 

www.convertstring.com

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Security' 카테고리의 다른 글

화이트리스트 분석기법 & 블랙리스트 분석기법  (0) 2020.05.17

[Webhacking.kr] 26번 문제풀이


오늘은 "Webhacking" 26번 문제를 풀었다. 이 문제를 풀게 된 계기는 점수 배점도 낮고, 단순히 가운데 정도에 위치해 있기에 풀게 되었다.

("Webhacking"26번)

 

 

26번 문제에 들어가보면 검은색 바탕화면에 달랑 'View-source'만 존재한다.

(26번 문제)

 

 

그래서 'F12' 버튼을 눌러 'html'을 확인해봤지만, 아무것도 발견할 수 없었다.

(html 화면)

 

 

그러면 26번 문제를 풀려면 'view-source'를 확인해봐야 할 것이다. 바로 소스코드를 확인해봤다. 아래의 화면은 문제의 소스코드이다.

(26번 문제의 소스코드)

 

 

소스코드를 한번 해석해보았다.

<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  // id값에 admin이 발견되면 "no"가 출력된다.
  
  $_GET['id'] = urldecode($_GET['id']);
  // id의 값을 'urldecode' 한 값을 id에 넣는다.
  
  if($_GET['id'] == "admin"){ // 만약 id의 값이 'admin' 일 경우 실행한다.
    solve(26);  // 문제해결
  }
?>

 

 

"id"에 'urldecode' 하기 위해 인코딩 한 바이트 값을 넣어주면 되는 것이다. 

즉, 디코딩해서 'admin'이라는 단어를 출력하기 위한 인코딩 값을 넣어주면 되는 것이다.

 

 

소스해석이 끝나서 "id"에 인코딩한 값을 넣어주면 문제가 풀리게 되는데, 중요한 것은 "id"에 값을 어떻게 넣는 가? 였다.

 

 

id에 값 넣는 방법


소스코드를 전부 해석해서 답만 넣으면 끝인 줄 알았지만, 어떻게 넣는 지 모르니 난감했다. 어떻게 문제를 푸는지 고민을 하고 있을 때, 'view-source'를 보고 해결 방안을 찾았다.

 

 

아래의 소스코드도 'view-source'를 "GET"함수로 입력받는 것이다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?>

 

 

소스코드가 들어있는 'URL'을 확인해 보니, 아래의 화면처럼 "?view-source=1" 값을 넣어주면 되는 것이었다.

(GET 함수 이용한 방법)

 

 

그러면 나는 "?id=인코딩한값"을 넣어주면 문제를 풀 수 있다.

 

 

[해결]


id 값에 'URL-decode'을 해서 "admin"이 나오기 위한 인코딩 값은 "%61%64%6d%69%6e"이다. 아래의 'URL-encode 표'를 보면 쉽게 "admin"을 추출할 수 있을 것이다.

("URL-encode" 표)

 

 

그래서 id값에 ''%61%64%6d%69%6e"을 넣었다.

('id'에 %61%64%6d%69%6e 인코딩 값을 넣은 화면)

 

 

문제가 풀릴 줄 알았지만, 돌아오는 것은 답이 아닌 'no!' 였다.

("no!" 출력 화면)

 

 

소스코드를 정확하게 해석해서 문제를 풀었는데, 왜 "no!" 출력 됐는지 의아했다. 그래서 이번에는 인코딩 값을 넣은 것이 아닌 문자 그대로 'admin'을 넣어봤다.

('id'에 admin 문자 넣은 화면)

 

 

결과는 동일하게 'no!' 값이 출력되었다.

("no!" 출력 화면)

 

 

그래서 내 개인적인 생각으로는 브라우저(Browser)에서 자동으로 한번 디코딩을 해주는 것 같다.

다시말해서, 나는 ''%61%64%6d%69%6e"을 php에서 함수(URL-decode)를 통해 "admin" 으로 바뀌는 줄 알았지만,

동으로 ''%61%64%6d%69%6e"을 "admin"으로 바꿔서 함수(URL-decode)는 "admin" 값만 받게 돼 'no!'가 출력되는 것이다.

 

그러면 자동으로 한번 디코딩 해준다면 인코딩을 2번 한 값을 넣어주면 되는 것이다. 아래의 화면처럼 인코딩을 2번 한 값을 넣어주면 문제가 해결되는 것이다.

(두번 인코딩을 'id'에 값을 넣은 화면)

 

 

문제해결!

(문제 해결 화면)

 

문제해결!!

(문제 해결 문제)

 

 

 

[문제 풀이 도움]


인코딩을 두번하기 위해서는 사이트의 힘을 빌렸다.

아래의 사이트는 URL 인코딩, 디코딩을 자동으로 해주는 사이트이다!

https://www.convertstring.com/ko/EncodeDecode/UrlEncode

 

URL 인코딩 - 온라인 URL 인코더

 

www.convertstring.com

 

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[Burp Suite] 설치 방법


오늘은 어제 "Suninatas(써니나타스) 4번 문제"에서 사용했던 [Burp Suite]에 대한 설치 방법에 대해 설명하고자 합니다. 아래의 링크는 어제 내가 풀었던 링크를 걸어놨습니다.

https://200301.tistory.com/6

 

[SuNiNaTaS] 4번 문제 풀이

[SuNiNaTaS] 4번 문제 오늘은 'Suninatas(써니나타스)'에서 4번 문제를 풀기로 했다. 2번과 3번은 아직 공부가 부족해서 어떤식으로 접근을 해야하는 지 몰라서 나중에 풀기로 했다. 4번 문제를 들어가 보면 아래..

200301.tistory.com

 

 

 

일단 [Burp Suite]를 설치하기 전에 해당 툴에 대해서 간략하게 설명을 드리겠습니다.

 

[Burp Suite]란?


프록시(Proxy)를 사용하여 네트워크에서 통신하는 패킷을 가로채 사용자가 원하는 분석 및 조작 그리고 확인 등을 할 수 있게 도와주는 툴입니다. 그 외에도 다양한 기능을 이용해 취약점을 찾는 용도로도 사용이 됩니다.

 

주의사항!

사용자가 악의적인 의도를 가지고 사용하거나 불법적인 용도로 사용해서는 안되며, 그로 인해 피해를 입을 시 책임을 지지 않는 것을 명심해야 합니다.

 

 

자 이제 본격적으로 설치를 진행하겠습니다.

 

[Burp Suite] 사이트 접속


첫 번째로는 파일을 배포하고 있는 [Burp Suite] 사이트에 접속해서 다운로드를 하아야 합니다. 아래의 링크를 통해서 다운로드 시작합니다. 보통 설치를 하는 시간은 개인의 컴퓨터 사양에 따라 10~20분 정도 걸립니다.

https://portswigger.net/burp/communitydownload

 

Download Burp Suite Community Edition

PortSwigger offers tools for web application security, testing & scanning. Choose from a wide range of security tools & identify the very latest vulnerabilities.

portswigger.net

 

 

 

[Burp Suite] 설치 진행 과정


파일 다운로드가 끝났으면 실행파일을 열어줍니다. 처음 열게 되면 아래와 같은 화면이 보일 것입니다. 해당 화면은 이전에 설치한 적이 있어서 이전 버전보다 업데이트를 원하면 "Yes"를 클릭하면 됩니다. 새로 업데이트보다 이전 버전을 사용하고 싶으신 분들은 "No"를 클릭하고 "Next"로 넘겨주면 됩니다. 사실 어떤 것을 선택하는지 설치하는 과정에서는 큰 문제는 없습니다.

(업데이트 여부 화면)

 

 

다음으로는 파일 저장 경로를 설정하는 것입니다. 기본적으로는 C드라이브에 Program Files에 저장되는 데, 다른 곳에 저장하고 싶으신 분들은 "Browse"를 클릭해서 원하는 곳에 저장해주면 됩니다.

(저장 경로 지정 화면)

 

 

이제 거의 다 왔습니다. 지금부터는 계속 "Next" 버튼만 누르고 기다리기만 하면 설치가 완료됩니다.

("Next" 클릭)

 

(끝날때까지 기다린다.)

 

기다리기만 하면 설치가 완료되었습니다.

 

 

여기까지가 [Burp Suite] 설치 방법이었습니다. 이제는 [Burp Suite]를 사용하기 위해서 프록시(Proxy) 서버를 설정하는 방법에 대해서 설명드리겠습니다.

 

[Burp Suite] 설정 방법


[Burp Suite]를 설치가 완료가 되면, 파일을 실행시켜 해당 툴을 열어줍니다.

해당 툴을 열어주면 아래와 같은 화면이 보일 것인데, "Temporary project"를 클릭하고 "Next"로 다음 화면으로 넘겨줍니다.

([Burp Suite] 첫 화면)

 

 

그다음 화면에서는 "Use Burp defaults"를 클릭한 뒤 "Start Burp"를 눌러서 [Burp Suite]를 실행시켜줍니다.

 

 

아래 화면이 [Burp Suite]의 첫 화면입니다. 이제 Proxy를 설정해보러 가겠습니다.

 

 

이제 메뉴바에서 "Proxy" -> "Options"에 들어갑니다. 들어간 뒤 빨간색 네모 박스 친 부분에 체크 표시를 해줍니다.

([Burp Suite] 내 Proxy 설정)

 

 

[Burp Suite] 내에서 Proxy 설정이 끝이 났으면 이제 크롬에서 Porxy를 설정해주러 이동합니다.

(제가 크롬을 이용해서 크롬 위주로 설명을 드리겠습니다. 그 부분에 대해서 양해 부탁드립니다.)

 

 

크롬 오른쪽 상단에 설정창에 들어갑니다.

 

"설정" -> "고급" -> "접근성" -> "컴퓨터 프록시(Proxy) 설정 열기"

 

 

해당 방법으로 프록시(Proxy) 설정을 열게 되면 아래와 같은 창이 뜨게 됩니다. [Burp Suite]를 사용할 때, 프록시(Proxy) 서버 사용을 "켬"로 바꿔놓아서 진행하면 됩니다.

(프록시 서버 사용)

 

 

이제 마지막으로 다시 "Proxy" -> "Options"에 들어갑니다. 각각

 

"Intercept Cilent Requests"에 "Intercept requests basesd on the following rules" 체크 표시

"Intercept Server Responses"에 "Intercept responses basesd on the following rules" 체크 표시

(체크 표시)

 

 

이렇게 하면 [Burp Suite]를 사용할 준비가 끝난 것입니다. 그럼 어제 "Suninatas(써니나타스) 4번 문제"를 가지고 한번 실행해 보겠습니다.

 

 

[Burp Suite] 실행


아래 화면은 "Suninatas(써니나타스) 4번문제"입니다.

("Suninatas(써니나타스) 4번문제")

 

 

[Burp Suite] 사용 방법


 

1. 수동 프록시(Proxy) 서버에서 "끔" -> "켬"으로 바꿔줍니다.

 

 

2. [Burp Suite]에서 "Proxy" -> "Intercept"에 들어간다. 그 다음 "Intercept in off"를 클릭해 "Intercept in on"으로 바꿔줍니다.

(Intercept 설정 화면)

 

 

3. 문제 4번의 화면에서 새로고침을 누르면 아래의 화면처럼 패킷이 캡처되는 것을 볼 수 있습니다.

 

4. 이상으로 [Burp Suite]가 정상적으로 작동 되는 것을 볼 수 있었습니다.

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Tools' 카테고리의 다른 글

[dotPeek] 설치 방법  (0) 2020.03.24
[Wireshark(와이어샤크)] 설치방법  (4) 2020.03.22

[SuNiNaTaS(써니나타스)] 4번 문제

오늘은 'Suninatas(써니나타스)'에서 4번 문제를 풀기로 했다. 2번과 3번은 아직 공부가 부족해서 어떤식으로 접근을 해야하는 지 몰라서 나중에 풀기로 했다.

(문제 목록)

 

 

4번 문제를 들어가 보면 아래의 화면 처럼 'point', 'Plus' 버튼, 'User-Agent', 'Auth key' 이렇게 보였다. 일단 네모 박스에 있는 것들을 제외하고 'User-Agent'는 사용자의 환경을 말하는 것 같다. 그리고 '?????' 되어있는 것을 내가 알아내야 하는 문제인 것 같다.

(4번 문제)

 

 

'User-Agent'가 정말 내 환경인지 궁금해서 크롬 우측 상단에 설정 창에 들어가 보았다. 들어가서 보니 문제에서 보았던 'Chrome/80.0.3987.132'는 사용자의 환경을 뜻하는 것이었다. 즉 문제를 푸는 사용자들의 환경을 확인해보라는 뜻인 것 같았다.

(Chrome 정보)

 

 

그러면 'Point'와 'Plus'는 무엇일까?

 

나의 고민은 해당 페이지 소스코드의 힌트를 보고나서 무엇인지 알 수 있었다. 아래의 화면은 해당 페이지 소스코드로서 주석처리가 된 곳을 볼 수 있다. 힌트에서는 'Point'가 50으로 만들면 문제가 해결되는 것 같았다.

(4번 문제 소스코드)

 

 

그래서 나는 바로 'Plus'를 눌러서 'Point'를 50으로 만들려고 했다. 하지만 'Point'는 25까지밖에 올라가지 않았다.

('Plus'가 25이상으로 올라가지 않는다.)

 

(25이상일때 뜨는 팝업창)

 

 

아무래도 서버와 클라이언트 통신을 주고받을 때 전달되는 패킷을 조작해야 될 것 같다. 그래서 나는 'Burp Suite(버프 스위트)'라는 툴을 이용해서 패킷을 조작하기로 했다.

(버프 스위트를 사용할 때 악의적인 목적을 가지고 사용시에는 문제가 발생할 수 있으니, 문제풀이 등 합법적인 용도에만 사용하여야 한다.)

 

 

아래의 화면은 'Burp Suite'를 키고 나서 문제 화면에서 'Plus'를 누른 뒤 캡처한 화면이다. 그 다음 오른쪽 클릭 한 후 'Sned to Repeater'를 누른다.

('Plus'를 누른 뒤 'Burp Suite'가 캡처한 화면)

 

 

'Send to Repeater'를 클릭한 후 'Repeater' 화면으로 넘어가면 아래와 같다.

('Repeater' 화면)

 

 

여기서 'User-Agent'를 'SuNiNaTaS'로 변환한 뒤 'Send' 버튼을 25번을 누른다. 정확히 25번을 눌러야 'Point' 값이 50이 된다.

('User-Agent' 설정 화면)

 

 

그러면 문제 화면에서 'Point' 값이 25에서 50으로 바뀐것을 확인할 수 있다. 정확하게 50이 되면 문제가 풀렸다는 팝업창이 뜨게 된다.

(문제 해결 팝업창)

 

 

키값 또한 문제화면에서 '?????' 대신 나타나게 될 것이다. 키값을 그대로 제출하면 포인트가 올라가 있다.

(포인트 획득!)

 

 

 

[느낀점]

프록시 서버를 처음 만져본 오늘 어떤식으로 작동되는 지 혼란이 많이 왔다. 다음에는 좀 더 정확하게 이해해서 문제에 접근을 해야겠다. 그리고 프록시 서버 뿐만 아니라 값을 올릴 때에도 문제였다. 처음에 단순히 'Send'만 보내면 해결될 줄 알았지만, 아무런 변화가 이루어지지 않았다. 왜냐하면 'User-Agent'값을 바꾸지 않았기 때문이다. 값을 바꾸고 나니 문제가 금방 풀렸다.

 

이번 문제를 풀면서 'Burp Suite'의 사용법에 대해 조금이나마 익힐 수 있는 시간이어서 너무 감사했다. 사실 이런 툴을 직접 이용해서 실전에 사용하기에는 많은 위험과 문제들이 동반된다. 하지만 이번 문제를 통해서 조금이나마 툴에 대한 사용법을 익힐 수 있어서 좋았다. 또한 나에게 부족한 부분이 무엇인지 확실하게 알아가는 시간이었다.

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

+ Recent posts