보안 공부하는 꼬깔이

Webhacking.kr 4번 문제 풀이

 

 

4번문제 페이지를 보면 base64 인코딩된 값과 패스워드 입력폼, 제출 버튼을 확인 할 수 있다.

 

우선 base64를 디코딩 해보자.

 

base64 디코딩하는 방법은 여러가지가 있다. 코딩, 툴 사용, 여러 base64 디코딩 사이트 이용 등

 

그중 크롬의 Hasher 라는 확장 프로그램을 이용하여 디코딩 해보도록 하자

 

 

크롬의 확장프로그램 검색에서 Hasher를 검색하고 두번째것을 추가하면 된다. 

 

 

 

추가하게 되면 우측상단에 톱니바퀴 모양이 생기는데 그것을 클릭하고 encode탭을 누르고 base64 인코딩된 값을 input에 넣게 되면

base64 decode 탭에 디코드된 값이 있다.

 

디코드된 값을 password에 넣어 보았지만 정답이 아닌것 같다.

 

아무래도 이 디코드된 값인 c4033bff94b567a190e33faa551f411caef444f2 을 N번더 디코딩해야 될 것같다.

 

위의 해시값의 바이트 수를 확인해본 결과 40바이트인 것을 확인했다. 40바이트를 가지고 있는 해시로는 sha-1 이 있다.

 

해시값을 sha-1 디코딩 해보도록 하자.

 

 

 

SHA-1 디코딩 사이트 링크: https://hashkiller.co.uk/sha1-decrypter.aspx

 

위 사이트에서 디코딩한 결과 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 값이 나왔는데 아무래도 디코딩을 더 시도 해봐야 할 것 같다.

 

바이트수는 40바이트 같은 사이트에서 한번더 SHA-1 디코딩 해보자

 

 

 

드디어 알아 볼 수 있는 test 라는 문자가 나왔다. 아마 정답인것 같다 ㅎ

 

 

password에 test를 입력해보자.

 

 

Congratulation! 구문과 함께 문제 해결

 

150점 획득 :D

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

webhacking.kr 6번 문제 풀이  (0) 2017.06.29
webhacking.kr 5번 문제 풀이  (0) 2017.06.29
webhacking.kr 3번 문제 풀이  (1) 2017.06.29
webhacking.kr 1번 문제 풀이  (0) 2017.06.29
WebHacking.kr 회원가입 방법!  (0) 2017.06.10

Webhacking.kr 3번 문제 풀이

 

 

 

3번문제 페이지로 들어오게 되면 Puzzle 이라는 문구와 함께 실제로 퍼즐이 있다.

 

이 퍼즐을 푸는게 곧 3번 문제를 푸는걸까?.

 

우선 퍼즐을 풀어보도록 하자.

 

 

 

흰타일을 클릭하면 이런식으로 검은색 타일로 채워지게 된다.

 

그리고 검은색 타일을 막 채우고 gogo를 눌러보면 No 를 출력하는 페이지로 이동되며 잠시후 다시 퍼즐이 있는 페이지로 돌아온다.

이것은 퍼즐이 틀렸다는 것을 의미한다.

 

검은색 타일로 퍼즐의 정답을 채우고 gogo를 누르면 어떠한 결과가 주어지는 궁금해진다.

 

위쪽과 왼쪽의 숫자는 무엇을 의미하는 걸까? 고민 끝에 그 라인에 존재하는 검은색 타일의 개수를 의미하는 것이 아닐까 하고 생각하게 되었다.

 

 

 

실제로 이런식으로 검은색 타일을 놓게되면 위쪽의 조건과 왼쪽의 조건을 모두 충족하게 된다. 이상태로  gogo를 눌러보자

 

퍼즐을 성공적으로 푼거같다!!

 

이름을 입력하라는 폼이 나와서 철권같은 게임처럼 클리어하면 이름을 입력하는 그런것이 아닌가 하고 순간 생각했다.(정확히 아니였다 ㅎ)

 

 

 

폼에 내 별명을 넣어 write를 눌러보았더니 name에는 내가 입력한 값, answer 에는 의미를 모르는 숫자 , ip 에는 나의 ip 이런식으로 출력되었다.

 

 

 

sql injection 문제가 아닌가 해서 name 폼에 sql injection 페이로드를 작성하다가 name input 태그의 maxlength 값이 10으로 되어있어 10글자 이상 적지 못하게 되어있는 것을 알게 되었다. 하지만 html은 클라이언트 단에서 변조가 가능하므로 maxlenth를 100으로 변경하고 페이로드를 전달해 보았다.

 

 

SQL injection 페이로드가 name에 그대로 출력되는 것을 보아 name 폼에 입력한 값은 문자열로 처리되어 출력되므로 sql injection 공격이 힘들것 같다.

 

 

 

폼을 다시 한번 확인하니 hidden 필드로 answer 값이 전달되는 것을 확인했고 value는 무조건 1010100000011100101011111 으로 고정된다.

 

 

 _1=1&_2=0&_3=1&_4=0&_5=1&_6=0&_7=0&_8=0&_9=0&_10=0&_11=0&_12=1&_13=1&_14=1&_15=0&_16=0&_17=1&_18=0&_19=1&_20=0&_21=1&_22=1&_23=1&_24=1&_25=1&_answer=1010100000011100101011111

 

1010100000011100101011111 이 숫자가 의미하는것은 무엇일까 생각하다가 퍼즐을 풀고나서 name의 폼이 있는 페이지의 URL을 확인하게되면 GET 방식으로 넘어가는 _1 ~ _25 인자 각각의 값들을 쭉 연결한 값과 _answer 인자의 값이 같다는 것을 확인했다.

 

그래서 URL의 _answer 인자의 값을 바꿔보았더니 퍼즐이 틀렸을때와 같이 no 라는 문장과 함께 퍼즐이 있는 페이지로 돌아갔다. 이것으로 _answer의 값이

퍼즐의 정답이며 _1~_25 인자들은 퍼즐의 25칸을 의미하며, 인자들 각각의 값이 _1 부터 _25까지 순서대로 _answer의 값의 1번째 자리 부터 25번째 자리 까지를 의미한다는 것을 알 수 있었다.

 

 

퍼즐의 정답인 answer의 value 값에 sql injection 으로 항상 참이 되는 페이로드를 전달하게 되면 어떻게 되는지 확인해보자

 

no hack 이라는 구문이 나왔다. 

 

아무래도 or 연산자가 필터링 당하는것 같다. 그렇다면 or 연산자와 동일한 역할을 하는 || 를 사용해서 전달해보자

 

 

전달!

 

 

 

name에 admin이 출력되고 answer에는 퍼즐의 정답 대신 어떤값이 출력되며, ip는 localhost로 출력된다.

 

 

answer의 값을 auth에 넣어보자

 

3번 문제 clear :D

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

webhacking.kr 6번 문제 풀이  (0) 2017.06.29
webhacking.kr 5번 문제 풀이  (0) 2017.06.29
webhacking.kr 4번 문제 풀이  (0) 2017.06.29
webhacking.kr 1번 문제 풀이  (0) 2017.06.29
WebHacking.kr 회원가입 방법!  (0) 2017.06.10

Webhacking.kr 1번 문제

 

 

Webhacking.kr 1번 문제를 풀어보도록 하자.

 

 

 

1번 문제로 들어오면 위와 같은 문구가 보일것이다.

 

level1 문제라는 문구와 index.phps 가 보이는데 index.phps를 크롬의 검사 기능으로 확인해 보면 a태그로 index.phps 페이지로 로케이션 한다는 걸 알 수 있다.  index.phps는 힌트페이지 라고 생각하면 된다.

 

index.phps 를 클릭해 힌트 페이지로 이동해보자

 

 

index.phps 페이지를 보면 위와 같은 php 코드가 나오는데 이 코드를 해석해보도록 하자

 

<소스코드 해석>

 

if(!$_COOKIE[user_lv])   #user_lv cookie에 값이 없다면 if문 수행
{
SetCookie("user_lv","1"
);   #setcookie 함수를 사용해 user_lv 쿠키를 1로 셋팅한다.
echo(
"<meta http-equiv=refresh content=0>"
); 
}


$password="????"
;  #플래그 값이 저장되는 변수 문제 풀이에 상관없기 때문에 패스

if(
eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1
;  #eregi 함수를 이용하여 user_lv cookie 값이 0~9의 정수중 하나로 시작한다면 if문이 수행되고 cookie 값이 1로 셋팅된다.  

if(
$_COOKIE[user_lv]>=6$_COOKIE[user_lv]=1
; user_lv cookie값이 6보다 크거나 같으면 if문이 수행되고 cookie 값이 1로 셋팅된다.

if(
$_COOKIE[user_lv]>5) @solve
(); user_lv cookie 값이 5보다 크면 문제가 풀리게된다.

echo(
"<br>level : $_COOKIE[user_lv]"
); #user_lv 쿠키값 출력

 

코드해석을 확인해보면 우선 문제를 풀기 위해서는 cookie값을 변조하는 방법을 알아야 될것이다.

 

 

<크롬 cookie 변조 툴 설치법>

 

 

크롬에서는 크롬의 확장 프로그램에서 EditThisCookie 를 설치 하면 된다.

 

 

설치가 끝나면 위와 같이 우측 상단에 쿠키 모양의 아이콘이 생기게 되며 아이콘을 클릭하면 현재 페이지에 셋팅된 쿠키의 이름과 값을 확인 할 수 있고 변조도 가능하다.

 

<익스플로러 cookie 변조 툴 설치법>

 

 

익스플로러는 cooxie 툴바를 설치하면 위와 같이 url 창 밑에 현재 페이지에 셋팅된 쿠키이름 , 값을 볼 수 있고 변조도 가능하다.

 

cooxie 툴바 다운링크 : http://download.cnet.com/Cooxie-Toolbar-for-Microsoft-Internet-Explorer/3000-2144_4-10268044.html 

 

 

 

쿠키를 변조하는 방법도 알았으니 본격적으로 문제를 풀어보자.

 

user_lv 쿠키 값이 5보다 크면 문제가 풀린다고 되어있는데 eregi 함수로 인해 0~9의 숫자를 사용하면 강제로 user_lv 쿠키 값이 1로 셋팅 되버리게 된다. 또한 쿠키값이 6과 같거나 크면 강제로 1로 셋팅된다.

 

user_lv 쿠키를 강제로 1로 셋팅 해버리는 두개의 if문을 우회할 수 있는 방법을 생각해보자.

 

만약 5.1 과 같이 5보다 크면서도 6보다 크거나 같지않고 0~9 와 같은 정수가 아닌 실수를 넣는다면 어떻게 될까?

 

 

1번문제 메인 페이지에서 크롬의 우측상단 쿠키 아이콘을 클릭하고 위와 같이 user_lv 쿠키에 5.1 값을 넣고 밑에 초록색 체크를 클릭하고 새로고침하게 되면 user_lv 쿠키가 5.1로 셋팅된 상태로 서버로 넘어가게 된다.

 

 

 

 

새로고침을 하게되면 congratulation! 문구와 함께 문제가 풀리게 된다.

 

 

200 포인트 획득 :D

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

webhacking.kr 6번 문제 풀이  (0) 2017.06.29
webhacking.kr 5번 문제 풀이  (0) 2017.06.29
webhacking.kr 4번 문제 풀이  (0) 2017.06.29
webhacking.kr 3번 문제 풀이  (1) 2017.06.29
WebHacking.kr 회원가입 방법!  (0) 2017.06.10