호빵둥이 IT Blog

Webhacking.kr 5번 풀이 :: 호빵둥이 IT Blog 본문

프로그래밍/[워게임]Webhacking.kr

Webhacking.kr 5번 풀이 :: 호빵둥이 IT Blog

d2n0s4ur 2020. 5. 15. 20:00

 

 

 

 

 

안녕하세요!

 

오늘은 워게임, Webhacking.kr Chellenge 5번 문제를 풀어보도록 하겠습니다.

 

이번 문제는 SQL 인젝션을 사용한 문제입니다.

 

 

#문제 보기


 

바로 한번 https://webhacking.kr/challenge/web-05/로 접속해보도록 하겠습니다.

 


 

Challenge 5

 

webhacking.kr


 

 

무엇을 의미하는 것일까

 

 

사이트에 접속하면 다음과 같이 Login, Join 버튼만 놓여있습니다.

 

무언가 회원가입을 하고 로그인해야 하는 것으로 유추해봅시다.

 

먼저 Join부터 눌러보도록 하겠습니다.

 

 

 

접속을 거부당하는 모습

 

 

바로 접속을 거부당했습니다.

 

이번에는 한번 소스코드를 볼까요?

 

마우스 우클릭을 한 다음에 [페이지 소스보기] 또는 [Ctrl + U]를 통해 소스코드를 볼 수 있습니다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<html>
<head>
<title>Challenge 5</title>
</head>
<body bgcolor=black>
<center>
<font color=black>
.<p>
.<p>
.<p>
.<p>
.<p>
.<p>
.<p>
</font>
<input type=button value='Login' style=border:0;width:100;background=black;color=green onmouseover=this.focus(); onclick=move('login');>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type=button value='Join' style=border:0;width:100;background=black;color=blue onmouseover=this.focus(); onclick=no();>
 
<script>
function no()
{
alert('Access_Denied');
}
 
function move(page)
{
if(page=='login') { location.href='mem/login.php'; }
 
}
 
</script>
</center>
</body>
</html>
cs

(스크롤바를 통해 오른쪽 끝까지 볼 수 있습니다)

 

 

login 버튼을 누르면 login.php로 가는데 join을 누르면 Access_Denied가 뜨는군요.

 

그러면 login.php와 같이, join.php로 한번 접속을 시도합니다.

 

 

 


 

https://webhacking.kr/challenge/web-05/mem/join.php

 

Challenge 5

 

webhacking.kr

 


 

 

 

접속하자 마자 보이는 알림. 하지만 당황하지 말자

 

 

접속하자마자 바로 bye라고 하네요. 당황하지 않고 소스코드를 보도록 하겠습니다.

 

 

 

 

 

#소스코드 분석하


 

1
2
3
4
5
6
7
8
9
<html>
<title>Challenge 5</title></head><body bgcolor=black><center>
<script>
l='a';ll='b';lll='c';llll='d';lllll='e';llllll='f';lllllll='g';llllllll='h';lllllllll='i';llllllllll='j';lllllllllll='k';llllllllllll='l';lllllllllllll='m';llllllllllllll='n';lllllllllllllll='o';llllllllllllllll='p';lllllllllllllllll='q';llllllllllllllllll='r';lllllllllllllllllll='s';llllllllllllllllllll='t';lllllllllllllllllllll='u';llllllllllllllllllllll='v';lllllllllllllllllllllll='w';llllllllllllllllllllllll='x';lllllllllllllllllllllllll='y';llllllllllllllllllllllllll='z';I='1';II='2';III='3';IIII='4';IIIII='5';IIIIII='6';IIIIIII='7';IIIIIIII='8';IIIIIIIII='9';IIIIIIIIII='0';li='.';ii='<';iii='>';lIllIllIllIllIllIllIllIllIllIl=lllllllllllllll+llllllllllll+llll+llllllllllllllllllllllllll+lllllllllllllll+lllllllllllll+ll+lllllllll+lllll;
lIIIIIIIIIIIIIIIIIIl=llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+lll+lllllllllllllll+lllllllllllllll+lllllllllll+lllllllll+lllll;if(eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl)==-1) {alert('bye');throw "stop";}if(eval(llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+'U'+'R'+'L').indexOf(lllllllllllll+lllllllllllllll+llll+lllll+'='+I)==-1){alert('access_denied');throw "stop";}else{document.write('<font size=2 color=white>Join</font><p>');document.write('.<p>.<p>.<p>.<p>.<p>');document.write('<form method=post action='+llllllllll+lllllllllllllll+lllllllll+llllllllllllll+li+llllllllllllllll+llllllll+llllllllllllllll
+'>');document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name='+lllllllll+llll+' maxlength=20></td></tr>');document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+llllllllllllllll+lllllllllllllllllllllll+'></td></tr>');document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');}
</script>
</body>
</html>
cs

 

 

뭔가 알아보기 힘든 글자들이 많이 있습니다.

 

이처럼 사용자(공격자)가 알아보기 힘들게 소스코드를 작성하는 것을 '난독화'라고 합니다.

 

자바스크립트는 프론트엔드 언어로 사용자(공격자)가 소스코드 전체를 볼 수 있다는 특징이 있습니다.

 

그렇기 때문에 해커들은 쉽게 내용을 파악할 수 있고, 여기서 찾은 취약점을 이용해 해킹을 시도할 수 있습니다.

 

그래서 '난독화'라는 과정을 통해 해커가 알아보기 힘들게 소스코드를 변경합니다.

 

예를 들어 Google.com의 경우 아래와 같이 굉장하게 난잡하게 코드를 설정해 둡니다.

 

 

크롬 개발자도구를 이용해 google.com의 스크립트 일부를 캡쳐한 모습

 

 

이제 위 코드를 보기 좋게 정리를 해보겠습니다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
= 'a'; ll = 'b'; lll = 'c'; llll = 'd'; lllll = 'e'; llllll = 'f'; lllllll = 'g'; llllllll = 'h'; lllllllll = 'i'; llllllllll = 'j'; lllllllllll = 'k'; llllllllllll = 'l'; lllllllllllll = 'm'; llllllllllllll = 'n'; lllllllllllllll = 'o'; llllllllllllllll = 'p'; lllllllllllllllll = 'q'; llllllllllllllllll = 'r'; lllllllllllllllllll = 's'; llllllllllllllllllll = 't'; lllllllllllllllllllll = 'u'; llllllllllllllllllllll = 'v'; lllllllllllllllllllllll = 'w'; llllllllllllllllllllllll = 'x'; lllllllllllllllllllllllll = 'y'; llllllllllllllllllllllllll = 'z'; I = '1'; II = '2'; III = '3'; IIII = '4'; IIIII = '5'; IIIIII = '6'; IIIIIII = '7'; IIIIIIII = '8'; IIIIIIIII = '9'; IIIIIIIIII = '0'; li = '.'; ii = '<'; iii = '>'; lIllIllIllIllIllIllIllIllIllIl = lllllllllllllll + llllllllllll + llll + llllllllllllllllllllllllll + lllllllllllllll + lllllllllllll + ll + lllllllll + lllll;
lIIIIIIIIIIIIIIIIIIl = llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + lll + lllllllllllllll + lllllllllllllll + lllllllllll + lllllllll + lllll;
 
if (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl) == -1) {
    alert('bye'); throw "stop";
if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {
    alert('access_denied'); throw "stop";
else {
    document.write('<font size=2 color=white>Join</font><p>');
    document.write('.<p>.<p>.<p>.<p>.<p>');
    document.write('<form method=post action=' + llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll+ '>'); document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + lllllllll + llll + ' maxlength=20></td></tr>');
    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + '></td></tr>'); document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
cs

 

 

그래도 굉장히 복잡한 모습입니다. 하지만 우리에게는 크롬 개발자 도구가 있습니다.

 

알고 싶은 변숫값을 복사해서, 크롬 개발자 도구의 콘솔 창에 붙여 넣기 하면,

 

 

 

손쉽게 난독화를 해결할 수 있다

 

 

이렇게, 어떤 뜻인지를 알 수 있게 됩니다. 이를 이용해서 위 코드를 이해하기 쉽게 만들어 주면,

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...생략...
 
if (eval('document.cookie').indexOf('oldzombie'== -1) {
    alert('bye'); throw "stop";
if (eval('document').URL.indexOf('mode=1'== -1) {
    alert('access_denied'); throw "stop";
else {
    document.write('<font size=2 color=white>Join</font><p>');
    document.write('.<p>.<p>.<p>.<p>.<p>');
    document.write('<form method=post action=' + 'join.php' + '>');
    document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + 'id' + ' maxlength=20></td></tr>');
    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + 'pw' + '></td></tr>');
    document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
 
cs

 

 

해석할 수 있는 형태로 바꿀 수 있습니다.

 

 

 


여기서 eval() 함수는 괄호 안의 값을 실제로 코드에 적어 넣은 효과를 낼 수 있습니다.

 

즉, eval('document.cookie').indexOf('oldzombie') 는 실제로 document.cookie.indexOf('oldzombie')의 효과를 발휘합니다.


 

 

 

 

이제 소스코드를 분석해보도록 하겠습니다.

 

3번째 줄에서 쿠키값에 oldzombie가 없으면 'bye'를 alert 하고,

 

URL에 mode=1이라는 문자가 없으면 access_denied가 뜨게 되어있습니다.

 

즉 URL에 mode=1을 넣고 쿠키값이 oldzombie를 넣으면 될 것 같습니다.

 

크롬 개발자 도구를 이용해 oldzombie 쿠키값을 넣고,  URL은 파라미터 형식으로 mode=1을 넣어주겠습니다.

 

크롬 개발자 도구 > [Application] > [Storage] > [Cookies] > https://webhacking.kr을 통해 oldzombie라는 쿠키값을 만들어 줍니다.

 

 

 

oldzombie라는 이름을 가진 쿠키의 값을 1로 지정했다

 

 

 

이후, URL을 https://webhacking.kr/challenge/web-05/mem/join.php?mode=1로 바꿔 들어가면,

 

Challenge 5

 

webhacking.kr

 

 

 

회원가입 창을 볼 수 있다

 

 

회원가입 창을 확인할 수 있습니다.

 

일단은 임의의 ID와 PW로 회원 가입해보도록 하겠습니다.

 

 

 

이후 https://webhacking.kr/challenge/web-05/mem/login.php에 접속해서 로그인을 시도하면,

 

Challenge 5

 

webhacking.kr

 

 

admin으로 로그인 하라고 친절하게 알려준다

 

 

Admin 계정으로 로그인을 하라고 알려줍니다.

 

하지만 우리는 admin계정을 알지 못하기 때문에 방법을 찾아야 합니다.

 

처음으로 생각한 방법이 PW를 SQL 인젝션을 통해 우회하는 것이었지만, 시도해보면 모든 SQL 인젝션을 막아둔 상태였습니다.

 

그렇다면 회원가입을 할 때 admin으로 속이면 되지 않을까요?라고 생각했습니다.

 

 

 

 

 

 

 

#문제 풀기


다시 https://webhacking.kr/challenge/web-05/mem/join.php?mode=1로 돌아가 회원가입을 시도합니다.

 

Challenge 5

 

webhacking.kr

 

 

혹시나 하는 마음에 id에 admin을 넣고 pw을 1234로 회원가입 시도하겠습니다.

 

 

 

이미 id가 존재한다고 한다

 

 

그랬더니, 이미 존재하는 ID라고 합니다.

 

SQL에서 값을 저장할 때 SET id = 값 또는 INSERT id = 값 형식으로 저장하기 때문에

 

admin이라는 문자를 공백으로 우회하면 되지 않을까요?

 

그래서 admin을 '      admin         '으로 넣고 회원가입을 해봤습니다.

 

 

 

정상적으로 회원가입이 된 모습

 

 

그랬더니, 회원가입이 완료되었습니다!

 

이제 다시 이 ID와 PW를 가지고 https://webhacking.kr/challenge/web-05/mem/login.php에서 로그인을 시도하면,

 

Challenge 5

 

webhacking.kr

 

 

문제가 풀린 모습을 볼 수 있다

 

문제를 성공적으로 풀었습니다!

 

 

 

 

#연관된 활동


 

이렇듯 SQL 인젝션은 공백을 우회하는 방법을 많이 사용합니다.

 

공백을 우회하는 방법에는 여러 가지가 있는데

 

잘 정리된 블로그가 있어서 링크로 남겨두겠습니다.

 

 

 


 

https://binaryu.tistory.com/31

 

SQL Injection 공백 우회방법

SQL Injection 공격시 공백 문자 필터링시 우회 방법 1. Tab : %09 - no=1%09or%09id='admin' 2. Line Feed (\n): %0a - no=1%0aor%0aid='admin' 3. Carrage Return(\r) : %0d - no=1%0dor%0did='admin' 4. 주석 :..

binaryu.tistory.com

 

 


 

또, 이와 유사하게 공백을 사용해서 우회하는 방법도 있습니다.

 

해당 링크도 하단에 첨부하도록 하겠습니다.

 

 


 

https://araikuma.tistory.com/489

 

[SQL] Comments : 주석

주석(comment)은 로직에 대한 설명이나 코드를 비활성화 할 때 사용한다. 주석은 코드에 영향을 미치지 않는다. SQL에서 사용할 수 있는 주석문은 2가지 종류가 있다. 단일 라인 주석 (Single-line comment

araikuma.tistory.com

 

 


 

 

SQL 인젝션의 다양한 스킬들을 익혀두시는 것을 추천드립니다.

 

이상, Webhacking 5번 문제 풀이를 마치겠습니다.

 

감사합니다!

 

 

 

 

 

포스트 잘 보셨다면 하단에 ♡ 꼭 눌러주시길 부탁드립니다!

(♡ 는 블로거에게 큰 힘이 됩니다)

 

 

 

 

[이전글] : 2020/05/14 - [SW/[워게임]Webhacking.kr] - Webhacking.kr Challenge 4번 :: 호빵둥이 IT Blog

[다음글] : 2020/05/16 - [SW/[워게임]Webhacking.kr] - Webhacking.kr Challenge 6번 :: 호빵둥이 IT Blog

Comments