호빵둥이 IT Blog

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

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

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

d2n0s4ur 2020. 5. 13. 20:00

 

 

 

 

안녕하세요!

 

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

 

이번 문제는 SQL 인젝션을 사용한 문제입니다. 먼저 시작하기 전에 아주 간단하게 SQL 인젝션이 무엇인지 알아보도록 하겠습니다.

 

#SQL 인젝션


SQL 인젝션은 이름이 가지고 있는 뜻 그대로, SQL 코드를 인젝션, 삽입하여 보안 오류를 일으키는 것을 말합니다.

 

대부분 DB의 경우 사용자로부터 데이터를 입력받고, 그 데이터를 SQL에 명령문 형태로 삽입합니다.

 

예를 들어, INSERT INTO{테이블} VALUES {값} 이런식으로 말이죠. 

 

하지만, 이를 악용하면 SQL문을 우회할 수 있습니다.

 

 

 


SELECT user FROM user_table WHERE id='아이디' AND password='비밀번호';


 

 

 

이런 문이 있다고 가정할 때, 아이디를 입력하고 비밀번호 부분에 1' or '1'='1 을 넣게 되면,

 

 

 


SELECT user FROM user_table WHERE id='아이디' AND password='1' or '1'='1';


 

 

 

이렇게 논리적으로 or를 통해 조건을 참으로 만들 수 있습니다. 즉, 아이디를 알고 비밀번호를 모르는 경우에도 로그인이 가능하게 됩니다.

 

이를 이용하여 1' or '1'='1 뒷 부분에 UNION 이나 JOIN, SET, DELETE등을 추가하면 해커가 원하는대로 데이터를 삭제하거나 생성, 모든 데이터 열람 등이 가능하게 됩니다.

 

실제로도 SQL 인젝션은 굉장히 오래된 해킹 기법 중 하나입니다. 그렇다면 SQL 인젝션으로 해킹이 불가능 할 것 같은데, 그렇지는 않습니다.

 

2017년 숙박어플 '여기어때'의 SQL 인젝션 해킹, 2015년 유명 커뮤니티 '뽐뿌'의 SQL 인젝션 해킹 등 우리 주변에서 생각보다 많이 일어나고 있습니다.

 

 

"SQL 인젝션은 무한히 발전 가능한 해킹 방법이고, 그만큼 보안 업체에서도

꼼꼼하게 해킹 시도를 차단하는 해킹방법이라고 할 수 있습니다."

 

 

 

#본론으로


자 이제 문제를 풀어보도록 합시다.

 

로그인을 한 후에 https://webhacking.kr/challenge/web-03/에 접속하도록 합시다.

 

 

https://webhacking.kr/challenge/web-03/에 접속한 모습

 

 

분명 워게임인데 노노그램이 나왔군요.  노노그램을 풀어봅시다.

 

 

 


노노그램은 숫자가 있는대로 칸을 칠하는 게임입니다. 우리나라에서는 네모네모로직으로 알려져있습니다.

 

유명한 네모네모로직 사이트를 첨부합니다.(심심할 때 해보시면 꽤 재미있어요:D)

 

http://nemonemologic.com/logic_board.php


 

 

 

노노그램을 푼 모습

 

 

자 이렇게 노노그램을 풀고, Solved 버튼을 눌러봅시다.

 

 

 

 

 

 

그랬더니 이렇게 로그를 남기기 위해 이름을 적으라고 합니다. 아무 이름이나 적고 submit을 해봅시다.

 

 

 

 

이렇게 본인의 IP, 답과 함께 기록이 된 모습을 볼 수 있습니다.

 

그러면 어떻게 풀어야할까요? 뒤로가기를 눌러 소스코드를 분석해봅시다.

 

 

 

 

#소스코드 분석하기


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>Challenge 3</title>
</head>
<body>
<center>Nonogram</center>
<p>
<hr>
 
<form name=kk method=get action=index.php></form>
<form method=post action=index.php>
<input type=hidden name=answer value=1010100000011100101011111>
Clear!<br>enter your name for log : <input type=text name=id maxlength=10 size=10>
<input type=submit value='submit'>
cs

 

10번째 줄에서 answer과 id 값을 index.php로 get 형식으로 보내는 것을 알 수 있고,

 

12번째 줄을 보면 answer 값은 '1010100000011100101011111'로 고정, hidden(숨김상태, 일반적으로 input 박스를 볼 수 없음) 되어있군요.

 

그러면 answer 값을 이용해서 SQL 인젝션을 시도하면 되겠다고 유추할 수 있습니다.

 

대부분 input에 hidden 을 넣는 경우 DB에 값을 넣을 때 사용자가 임의로 수정하는 것을 막기 위해서 쓰곤 합니다.

 

하지만 우리는 소스코드를 알고 있기 때문에, SQL 인젝션을 시도해보도록 하겠습니다!

 

 

 

 

 

#문제 해결하기


처음에 설명했던 것처럼 일단 answer 값을 1' or '1'='1 로 해볼까요?

 

크롬브라우저에서 F12를 눌러 개발자도구로 들어가 봅시다.

 

 

F12로 개발자 도구에 들어간 모습

 

 

 

여기서, answer input 값의 value부분을 더블클릭해서 1' or '1'='1 로 바꿔보죠.

 

이후 submit 을 누르면

 

 

한번만에 문제를 풀었습니다!

 

 

이렇게 문제를 풀 수 있습니다!

 

 

결과가 나온 모습

 

 

 

 

#연관된 활동


사실 한번만에 푼 경우에는 굉장히 운이 좋았다고 할 수 있습니다.

 

그 이유는, 우리는 index.php의 내용을 모르는 상태에서 SQL 인젝션을 시도했는데, 만약 index.php파일에 해당 구문을 쓸 수 없게 우회하는 기능을 넣어 놨을지도 모릅니다.

 

이럴 때를 대비하기 위해서 스페이스바를 대신할 수 있는 기능(공백을 탭으로 우회, 주석사용 등..)들을 잘 숙지하고 있는 것이 좋습니다.

 

또한, SQL에 데이터를 넣을 때 PHP를 사용하므로 PHP언어에서 사용되는 주석이나 여러 스킬들을 알아두고 있는 것이 문제를 푸는데 도움이 많이 되겠죠?

 

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

 

 

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

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

 

 

 

 

 

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

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

 

Comments