일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- WebHacking
- 코드블락
- 웹해킹
- SQL블라인드인젝션
- 쿠키조작
- sql인젝션
- 코드블럭
- 레인보우테이블
- 수집성공
- 정보보안
- 블로그_시작
- 패킷조작프로그램
- webhacking.kr_4번
- HTTP_쿠키
- 웹해킹_1번
- SW블로그
- 수집오류
- 서치어드바이저
- 웹마스터
- 코드블럭_설치오류
- webhacking.kr
- 수집보류
- Hello_world!
- aaencode
- 패킷조작
- c언어
- 워게임
- webhacking.kr_3번
- webhacking.kr_1번
- Burp
- Today
- Total
호빵둥이 IT Blog
Webhacking.kr 5번 풀이 :: 호빵둥이 IT Blog 본문
안녕하세요!
오늘은 워게임, 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');>
<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의 경우 아래와 같이 굉장하게 난잡하게 코드를 설정해 둡니다.
이제 위 코드를 보기 좋게 정리를 해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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>');
}
|
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라는 쿠키값을 만들어 줍니다.
이후, 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계정을 알지 못하기 때문에 방법을 찾아야 합니다.
처음으로 생각한 방법이 PW를 SQL 인젝션을 통해 우회하는 것이었지만, 시도해보면 모든 SQL 인젝션을 막아둔 상태였습니다.
그렇다면 회원가입을 할 때 admin으로 속이면 되지 않을까요?라고 생각했습니다.
#문제 풀기
다시 https://webhacking.kr/challenge/web-05/mem/join.php?mode=1로 돌아가 회원가입을 시도합니다.
Challenge 5
webhacking.kr
혹시나 하는 마음에 id에 admin을 넣고 pw을 1234로 회원가입 시도하겠습니다.
그랬더니, 이미 존재하는 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
'프로그래밍 > [워게임]Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 7번 풀이 :: 호빵둥이 IT Blog (2) | 2020.05.17 |
---|---|
Webhacking.kr 6번 풀이 :: 호빵둥이 IT Blog (0) | 2020.05.16 |
Webhacking.kr 4번 풀이 :: 호빵둥이 IT Blog (1) | 2020.05.14 |
Webhacking.kr 3번 풀이 :: 호빵둥이 IT Blog (0) | 2020.05.13 |
Webhacking.kr 1번 풀이 :: 호빵둥이 IT Blog (0) | 2020.05.12 |