[HackThisSite] Basic Mission 1

2017. 1. 7. 18:13

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

<<< CHALLENGE 38 >>>

접속하면 위와 같은 창이 뜬다.


일단 어떻게 반응하는지 알아보기 위해 1을 넣고 Login을 해봤는데 반응이 없었다.

2를 넣어봐도 반응이 없네..?


admin으로 하고 Login을 해보았다.


이렇게 거절당한다 ㅠㅠ


admin 버튼을 눌러보았더니 아래와 같은 log를 볼 수 있었다.

(보안상 IP는 지움)



쉽게 말해서 내가 적은 IP가 나오고 뒤에 :와 함께 내가 칸에 적은 문자열이 출력된다.

그런데 빈칸이 login을 하기 위한 ID 이므로 해당 부분에 admin이 들어가게 하면 된다.


그래서 생각한 것이 개행이다.

로그인한 순서대로 로그가 쌓이기 때문에 개행을 하면 다음 줄에 생기지 않을까? 해서이다.


따라서 아무 문자열을 넣은 뒤 \n으로 개행하고 나의 IP를 적은 뒤 admin이라고 적어보았다.


ex) 나의 IP가 1.1.1.1이라고 했을 경우

kkk\n1.1.1.1:admin

이렇게 적으면

로그에는

1.1.1.1:kkk
1.1.1.1:admin

이렇게 들어가기 때문에 문제가 해결된다.



반응형

'Solve Problem' 카테고리의 다른 글

[HackThisSite] Basic Mission 2  (0) 2017.01.07
[HackThisSite] Basic Mission 1  (0) 2017.01.07
[webhacking.kr] 23번 문제  (0) 2015.07.06
[webhacking.kr] 20번 문제  (0) 2015.07.06
[webhacking.kr] 7번 문제  (0) 2015.07.06
블로그 이미지

rootable

,
반응형

<<< CHALLENGE 23 >>>

이번 문제는 XSS(크로스 사이트 스크립트) 문제이다.



XSS는 위와 같이 설명이 되어있는데 쉽게 말해서

게시판에 악성 스크립트가 담긴 글을 올려서 그 글을 읽는 사용자에게 악성코드가 심어지도록 하는 해킹기법이다.

따라서 글, 메일, 그림 등을 열람하기 위하여 사용자들의 흥미를 유발시키기 때문에 사회공학적 해킹기법으로 분류된다.


23번 문제는 이처럼 스크립트 문을 올릴 수 있는지를 테스트하는 문제이다.


최종적으로 <script>alert(1);</script>를 올리면 되므로

해당 문장을 넣고 제출을 해보았다.



위와 같이 뜨는 것으로 보아서 GET 방식으로 넘겨주고 있고

어떤 문자 혹은 문자열이 필터링된다는 것을 알 수 있다.


이것 저것 넣어본 결과 아래와 같이 필터링된다는 것을 알 수 있다.


또한 script와 alert의 부분 문자열인 sc나 al같은 경우도 필터링된다.

하지만 각 문자들은 필터링이 되지 않는다.


즉, 문자들을 연결시켜 해당 문자열을 만들어주면 되는 것이다!

이를 위해 URL 인코딩에 대해 알아보았다.


문자와 문자 사이에 아무것도 존재하면 안되므로 NULL이 URL로 어떻게 나타나지는지 알아보았다.



%00으로 나타내어 진다는 것을 Get!!


test로 alert의 al을 해보았는데 잘 된다.


<s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>


code 부분에 이렇게 적고 실행시켜보았다.



유후!!

반응형

'Solve Problem' 카테고리의 다른 글

[HackThisSite] Basic Mission 1  (0) 2017.01.07
[webhacking.kr] 38번 문제  (0) 2015.07.06
[webhacking.kr] 20번 문제  (0) 2015.07.06
[webhacking.kr] 7번 문제  (0) 2015.07.06
[webhacking.kr] 49번 문제  (0) 2015.06.29
블로그 이미지

rootable

,
반응형

<<< CHALLENGE 20 >>>

20번 문제에 접속하면 아래와 같은 창이 뜬다.


자바스크립트로 문제를 풀어야한다는 것과 time limit이 2초라는 것을 알 수 있다.

좀 더 자세한 힌트를 얻기 위해 소스코드를 보았다.



소스코드에 이렇게 자바스크립트 문이 있다.

ck() 함수를 호출했을 때 위의 세 빈칸 중 하나라도  비어 있다면 포커스 맞춰주며 리턴한다.

만약 모두 차있다면 code에 적은 것과 옆에 있는 문자열이 같은지를 확인해서 다르다면 포커스 맞추며 리턴한다.


즉, code에 오른쪽의 문자열과 같아야 한다는 점이다.

그래서 같게 적어보고 submit해보았다.


그랬더니 아무 아래와 같이 떴다.


틀렸다고 하며 다른 문자열을 주는 것이다.

음? 맞게 했는데 왜 틀렸다고 하는 것일까?


code 부분이 어떻게 되어있는지 자세히 보았다.

보니 value는 랜덤으로 만들어지는 것 같다.

스크립트 문에서 우리가 적은 것과 attackme 부분의 문자열이 같으면

lv5frm을 submit() 해주는데 이것이 2초 안에 이루어져야 하는 것이다!!


하지만 새로고침한 뒤 2초만에 이걸 할 수 있을까?

여기서 아까 문제에서 주어진 힌트!!

자바스크립트를 써라!


그래서 나는 크롬의 콘솔로 갔다.

이 부분에 아까 스크립트 코드에서 원하는 조건들을 모두 적어주었다.




2초 안에 넣으라고 했으므로 Console에서 ↑ 를 통해 빨리 실행시키면

문제 해결!!



반응형

'Solve Problem' 카테고리의 다른 글

[webhacking.kr] 38번 문제  (0) 2015.07.06
[webhacking.kr] 23번 문제  (0) 2015.07.06
[webhacking.kr] 7번 문제  (0) 2015.07.06
[webhacking.kr] 49번 문제  (0) 2015.06.29
[webhacking.kr] 27번 문제  (0) 2015.06.29
블로그 이미지

rootable

,
반응형

<<<Challenge 7>>>


7번문제를 들어가면

이런 창이 뜬다.


뭘 어쩌라는걸까… 일단 최대한 힌트를 얻어보면 auth 버튼을 눌러서 뭔가를 해야할것 같고

주소창을 보면 val변수에 1이라는 값이 들어가있다는 것을 알 수 있다.


일단 이 상태로 auth 버튼을 눌러보면


이렇게 Access_Denied!가 뜬다.


음...또 다른 힌트가 없을까?

F12를 눌러서 소스코드를 보자



phps!! php의 소스코드를 볼 수가 있다!

뿐만 아니라 admin mode는 val 변수에 2가 들어가야 한다는 힌트도 주어졌다.


phps를 통해 소스코드를 보자.


굉장히 길기 때문에 잘라서 설명하겠다.

answer변수는 현재 모르는 상태인데 답을 구할때도 필요없다.. 저 변수는 어디에 쓰는 것일까?


우리가 필요로 하는 것은 val 변수이다.

우리가 URL에 적어준 val 변수의 값을 받아서 go 변수에 넣어준다.

그리고 만약 go 변수에 아무것도 들어있지 않다면 val의 값을 1로 해서 url을 새로고침한다.


go 변수가 비어있지 않다면 ck 변수에 넣어준다.

그리고 해당 ck 변수의 값이 * 나 /일 경우에는 없애준다는 것을 알 수 있다.

고로 /*를 통한 주석처리를 막았다는 것을 알 수 있다.



/* 주석을 다 막은 뒤 기본 베이스 HTML 코드를 적어준다.

그리고 나서 ck의 변수의 값을 확인하는데 여러 것들을 막아주고 해당 값이 있으면

Access Denied! 문자열을 띄우며 종료시킨다.


빈칸이 있으면 cannot use spcae 문자열을 띄우며 종료시키고

만약 필터를 모두 피했다면

rand 함수를 통해 랜덤 값을 뽑은 뒤

랜덤 값에 따라 빈칸의 수들이 달라진다.


여기서 어차피 랜덤으로 돌아가기 때문에 새로고침 하다보면 결국 어떤 것 하나는 오게 되므로 답을 적을 때도 하나만 생각해서 풀면 된다.



우리가 적은 값을쿼리문으로 만든 result 변수를 통한 DB의 결과를 data 변수에 넣고  data 변수의 값이 query error이거나 1또는 2가 아닐경우 종료시킨다.


만약 1 또는 2일 경우

1이면 2를 출력하라고 나타내주고

2일 경우에는 Congratulation 문자열을 띄우는 auth 버튼을 생성한다.


따라서 우리는 val에 2를 넣어주면 되는 것이다.


phps의 처음에 보면 DB에는 2가 없다며 union을 사용하라고 되어있다.

필터링을 보아도 union이 없다는 것을 알 수 있다.


따라서 union을 통해 풀어보겠다.


val=-1을 통해 false를 만들어주고 union으로 두번째 쿼리문을 연결시켜준 뒤

select 2를 만들어주면 끝이다!


-1) union select (2


이것이 우리가 적어야하는 최종 문장이다.

여기서 -1 뒤에 )를 해주고 2 앞에 (를 해준 이유는

rand 함수의 결과가 1일 경우를 생각한 것인데 go변수의 앞 뒤가 ()로 막혀있기 때문이다.


하지만 위에 적어준 대로 적어주면 당연히 풀리지 않는다.

필터링에 여러가지가 걸리기 때문이다.


  1. 빈칸

  • 빈칸은 %0a나 %0d 등등을 사용하면 피할 수 있다.

  1. 숫자 2

  • 사칙 연산을 통해 피할 수 있다.


사칙연산 중에서도 +와 *는 막혀있으므로 -를 통해 해결하였다.

따라서 최종 쿼리문은


-1)%0aunion%0aselect%0a(3-1

이렇게 적어주면 해결된다!!


반응형

'Solve Problem' 카테고리의 다른 글

[webhacking.kr] 23번 문제  (0) 2015.07.06
[webhacking.kr] 20번 문제  (0) 2015.07.06
[webhacking.kr] 49번 문제  (0) 2015.06.29
[webhacking.kr] 27번 문제  (0) 2015.06.29
[webhacking.kr] 21번 문제  (0) 2015.06.29
블로그 이미지

rootable

,
반응형

<<< 49번 문제 >>>

문제에 들어가면 이런 화면이 뜬다.

1이 써져있으니 일단 제출을 눌러보았다.

GET방식을 사용하고 있다는 것과 제출 결과가 lv에 들어간다는 것을 알 수 있다.

저기 zzibong은 무엇일까… 소스코드를 한번 보자

index.phps가 있다!! 들어가보자.

HTML 코드는 제외하고 쿼리 부분만 가져왔다.

맨 윗 줄의 time()함수는1970년 1월 1일 0시 0분 0초부터 지금까지 지나온 초를 정수 형태로 리턴해주는 함수이다. 따라서 저 문장은 항상 true이다.

(1258110000은 Friday 13th November 2009 11:00:00 AM 이다)

쿼리문을 보면 members 테이블에서 lv 조건에 맞는 id를 가져온다,

해당 id가 admin이면 문제가 풀린다!!


그럼 lv부분을 sql injection으로 하여 없애버리고 id를 admin인 것을 가져오면 되는 것 아닐까?


-1 or id=’admin’를 생각해보았다.

그런데 or가 막혀있다. 이를 ||로 우회해서 시도해보았다.

-1||id=’admin’

?? 반응이 없다… 여기서 굉장히 멘붕이 왔다..

오랜시간동안 무엇 때문일까 알아보았더니

PHP에는 magic_quotes_gpc라는 기능이 있다.

이 기능이 설정되어 있으면 ‘, “, \가 자동적으로 \로 변환된다.

혹시 이것 때문일까 생각하여 이를 우회하는 방법을 찾아보았다.

즉, 문자열을 바로 입력하는 것 대신 우회해서 입력하는 것이다.

여기에는 두가지 방법이 존재한다.

  1. 아스키코드 이용

  2. hex 값 이용.

먼저, 아스키코드 표를 이용하는 것을 생각해보았지만 ()가 필터링되어있기 때문에 불가능하다.

(만약 아스키코드를 이용한다면 id=char(97,100,109,105,110)으로 우회가 가능하다.)


따라서 다른 방법으로 hex를 이용하였다.

따라서 해당 값 앞에 0x를 붙여서

방식으로 적어주니 해결!!



반응형

'Solve Problem' 카테고리의 다른 글

[webhacking.kr] 20번 문제  (0) 2015.07.06
[webhacking.kr] 7번 문제  (0) 2015.07.06
[webhacking.kr] 27번 문제  (0) 2015.06.29
[webhacking.kr] 21번 문제  (0) 2015.06.29
[webhacking.kr] 18번 문제  (0) 2015.06.29
블로그 이미지

rootable

,
반응형

<<< 27번 문제 >>>

27번 문제에 들어가면 아래와 같은 화면이 뜬다.

음...아무런 힌트가 없다. 그렇다면? 바로 소스보기!!

phps 파일이 있다고 주석으로 친절히 알려주고 있다. 해당 파일로 들어가보자.

위에서 풀었던 18번 문제와 굉장히 흡사하다는 것을 알 수 있다. 여기서 특이한 것은 limit이 막혀있다는 것이다. limit을 이용하면 전체 테이블을 출력하게 한 뒤 하나씩 시도해서 admin이 나오게 할 수 있는데 이 기법을 막아버린 것이다. 우리는 18번에서 풀었던 방식(논리적 에러 sql injection)으로 풀어보자.


일단 칸에 무엇을 넣었을 때 어떤 반응을 보이는지 알아보기 위해 1을 넣어보았다.

그 결과 no에 1이 들어가며 guest라고 뜬다.

그럼 위의 가정과 같이 2가 admin이라 가정하고 풀어보겠다.

2를 넣었을 때 query error 뜨니 2를 이용해 false를 만들겠다

따라서 우리가 제출할 것은

2 or no=2

이다. 좋은 점은 빈칸이 막혀있지 않다. 하지만 =가 막혀있다 ㅠㅠ

=를 무엇으로 대체할지 알아본 결과 like로 대체할 수 있다.

따라서 2 or no like 2라고 하면

응?? 왜 guest가 뜰까?? 다시 코드를 보자.

쿼리문을 자세히 보면 no가 ( )로 막혀있는 것을 알 수 있다. 따라서 2를 통해 false로 만들어버려도 no like 2를 통해 true를 하면 guest의 no가 true가 되어 guest가 출력되는 것이다.

이를 확인해보기 위해 no에 true를 넣어보았다.

예상대로 no에 ture가 들어가면 guest가 출력된다.

그렇다면 문제를 해결하기 위해서는 어떻게 해야할까?

guest에 관련된 no를 닫아버리면 된다.

때마침 (는 막혀있지만 )는 막혀있지 않다.

2) or no like 2 --

이렇게 적어주면

select id from challenge27_table where id=’guest’ and no=(2) or no like 2 -- )”)) or…

이렇게 된다.

그러면 guest에 관련된 no는 막혀버렸기 때문에 or 이후의 문장이 ture가 되어 no가 2인 admin이 뜬다.

이후의 쿼리문은 --를 통해 주석처리 하였다.

(여기서 주의해야 할 것은 --의 앞과 뒤에 빈칸이 있어야 한다는 점!!)

이렇게 해결하였다.



반응형

'Solve Problem' 카테고리의 다른 글

[webhacking.kr] 7번 문제  (0) 2015.07.06
[webhacking.kr] 49번 문제  (0) 2015.06.29
[webhacking.kr] 21번 문제  (0) 2015.06.29
[webhacking.kr] 18번 문제  (0) 2015.06.29
프로젝트 오일로 문제풀이  (0) 2014.11.15
블로그 이미지

rootable

,
반응형

<<< 21번 문제 >>>

이번 문제는 아래 사진에서 보다시피 우리가 위에서 알아본 Blind SQL Injection 문제이다.


어떤 오류가 뜰지 확인해보기 위해 ‘ 를 넣어 제출해보았지만 결과는 아래에서 보다시피 Ture냐 False만 나타내주고 오류는 나타내주지 않는다.

해당 제출하는 문자가 어디에 어떻게 들어갈지 확인해보기 위해 여러 시도를 해본 결과 아래의 사진과 같이 no에 숫자형으로 들어간다는 것을 알 수 있다.(‘가 없으므로)

또한 자세히 보면 id와 pw가 있는데 해당 값들을 우리가 찾아야 하는 것이다.

또한 1과 2를 넣었을 때만 Ture가 되고 다른 값들은 모두 False로 나오는 것으로 보아 테이블의 no에는 1과 2만 존재한다는 것을 알 수 있다.

no

id

pw

1

??

??

2

??

??


이제 1과 2에 해당하는 id와 pw를 알아야한다. 그러려면 substr와 ascii함수를 이용해야하는데 id와 pw가 몇글자로 이루어진 문자열인지를 먼저 알아야한다.

문자열의 길이를 리턴해주는 length()함수를 이용하자.

1부터 넣어본 결과 5일 때 True가 나타나다.


위와 같은 방식으로 no가 1일 때 id와 pw , no가 2일 때 id와 pw의 길이를 알아본 결과

아래와 같은 표를 얻을 수 있었다. ( 괄호 안의 숫자가 문자열 길이)

no

id

pw

1

?????(5)

?????(5)

2

?????(5)

???...?(19)


그럼 이제부터 substr함수와 ascii함수를 이용하여 예측해보자.

가장 먼저 1의 id는 guest, 2의 id는 admin이라고 가정하고 진행해보았다.

2번의 id의 첫번째를 admin의 첫번째 문자인 a의 아스키코드 값인 97과 비교해보았더니 그 결과 True가 나왔다. 두번째 문자가 d인지 확인해보자

역시 True가 나온다!! 고로 no가 2인 것은 admin이라고 생각하자

그럼 자연스럽게 1은 할 필요가 없겠다.


이제 pw를 찾아야하는데…..이건 일일이 할 수가 없다. 고로 파이썬을 이용하자.

간단하게 설명하면 현재 웹해킹 사이트에 연결되어있는 PHPSESSID값을 넣어서 나의 계정으로 로그인되어있는 상태로 접속을 한다.

(PHPSESSID는 크롬에서 F12를 누른 뒤 Resources의 Cookies를 누르면 얻을 수 있다.)

r=requests.post("http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=2%26%26ascii(substr(pw,"+str(j)+",1))="+str(i),cookies=session)


그리고 no가 2인 pw를 얻기 위해 위와 같은 주소로 접속을 한다.

여기서 %26은 and를 대신 나타내주기 위해 &&를 사용하는데 그냥 &를 써주게 되면 GET 방식에서 매개변수를 구분하는 &로 생각하기 때문에 URL ENCODING 해준 값을 써준 것이다.

j는 몇 번째 자리인지 나타내주기 위한 수이고 i는 문자의 아스키코드를 나타내주는 수이다. str()함수로 해준 이유는 하나의 주소로 만들어주기 위해 문자로 변환 해준 것이다.

str() = 매개변수를 문자열로 리턴

chr() = 아스키코드를 문자로 리턴

(참고. ord() = 문자를 아스키코드로 리턴)


두 번의 for 문을 돌다가 i가 126이란 것은 아스키코드 표를 다 돌았지만 없었다는 것이다. 혹시 몰라서 count에 +1해주고 한번 더 돌려본 뒤 그래도 아스키코드가 끝나면 문자열이 종료된 것이라 생각하고 exit()로 프로그램을 종료시킨다.


마지막에 time.sleep 해준 이유는 그냥 돌렸을 때 오히려 멈췄다가 다시 돌고 해서 더 느리다. 그래서 실행마다 약간 시간을 주어서 더 잘 돌도록 해준 것이다.


비밀번호가 총 19자리인 것을 strlen 함수로 확인했으므로 1부터 20까지(파이썬은 마지막 조건의 전 숫자까지 돌린다) 돌리면 비밀번호가 무엇인지 확인 가능하다.

해당 프로그램을 돌리면 위와 같이 비밀번호가 blindsqlinjectionkk 인 것을 알 수 있다.

해당 비밀번호를 인증해주면~?

이렇게 해결이 된다 ㅎㅎ



반응형

'Solve Problem' 카테고리의 다른 글

[webhacking.kr] 7번 문제  (0) 2015.07.06
[webhacking.kr] 49번 문제  (0) 2015.06.29
[webhacking.kr] 27번 문제  (0) 2015.06.29
[webhacking.kr] 18번 문제  (0) 2015.06.29
프로젝트 오일로 문제풀이  (0) 2014.11.15
블로그 이미지

rootable

,