29 건의
Security 검색결과
  1. 2015.08.06 rootnix
  2. 2015.08.05 rootnix
  3. 2015.05.29 rootnix
  4. 2014.10.07 rootnix
  5. 2014.10.07 rootnix
  6. 2014.07.10 rootnix
  7. 2014.07.10 rootnix
  8. 2014.06.19 rootnix
  9. 2014.06.17 rootnix
  10. 2014.06.13 rootnix


늘 바빠서 꾸준히 못하고,

생각날때 한두문제씩 풀어오다.

드디어 올클...


62~66번 문제는 언제 열릴려나 ~.~

'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] All Clear  (0) 2015.08.06
[Webhacking.kr] Challenge 9  (5) 2015.08.05
[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10

Webhacking.kr Challenge 9



Challenge 9 에 접속하면 다음과 같은 화면을 보게된다.

시작하자마자 Web-Server에서 Authentication을 요구하는데...

내가 어떻게 알아


종종 위의 인증창에서 SQL-Injection을 시도하는거라고 생각하는 입문자분들이 계신데,

여기서 하는거 아닙니다!

고생하지마세요!


처음엔 게싱으로 뭐 ..admin/admin 도 쳐보고 test/test도 쳐보고 에라이 아니네,

취소를 누르면 다음과 같은 화면을 보게됩니다.





인증에 실패했기때문에, 401 Unauthorized 에러를 만나게 되는데

당연한 결과다.


이 부분에서 어떻게 하면 저 인증을 우회할 수 있을까

하고 열심히 검색을 해볼거다.

웹 인증 우회, 웹 로그인 우회 등등

자세한 문서를 찾아보고 싶으면 'bypass apache authentication' 이런식으로 검색하면 많이 찾아볼 수 있다.


이 부분을 인증 우회하는 부분과, 우회가 되는 이유를 설명하자면 이렇다.

apache 에서는 mod_auth 와 mod_access 모듈을 통해 위와같은 인증을 설정 할 수 있다.



<Directory "/var/www/html">

      ServerName ...

      ....

      AllowOverride AuthConfig

      ....

</Directory>

이렇게 AllowOverride 지시어를 AuthConfig 로 설정함으로써 인증을 요구할 수 있고,

이에 대한 계정과 세부설정은 아파치에 포함된

htpasswd

도구를 통해서 설정할 수 있다.


그리고 설정된 인증 정보들을 가지고 누굴,어느상황에서 인증을 요구하고 통과시켜줄지

어떤 메세지를 보여줄지 등을 설정할 수 있는데,

이는 httpd.conf 같은 서버 설정파일이나, .htaccess 파일에 다음과 같은 지시어를 넣어 설정한다.




AuthType Basic
 AuthName "Login plz ^-^"
 AuthUserFile /usr/local/apache/passwd/passwords

 <Limit GET POST>

         Require valid-user

 </Limit>



자료를 보호하기 위해 인증을 거는것 좋다. 인증 자체가 취약하고 우회당하는것이 아니라,

위처럼 설정시의 실수, 오류로 인증이 우회 된다.


위의 설정 파일을 해석하면, 인증을 거는데 Limit 지시자를 통해 GET 과 POST 요청에 대해서만 인증을 요구한다.

Limit을 아예 걸지 않으면 모를까,

요즘은 이런 실수가 거의 없지만, 예전에는 GET과 POST에 대해서 인증을 거는 설정이 기본적이였다.

아마 검색등을 통해 들어올때나 브라우저를 이용하면 GET과 POST 메소드를 사용하기때문인지...


아무튼 우리가 해결하려는 WebHacking.kr 9번 문제는 위와같은 Limit가 걸려있는 문제일 것이다.

위와 같이 설정이 되어있다면, GET 과 POST메소드를 제외한 다른 메소드를 이용하면 정상적인 요청/응답이 '인증없이' 가능하다는 것.


한번 테스트 해보자.

HTTP Request에서 사용할 수 있는 Method는 GET이나 POST를 제외하고도,

OPTIONS, HEAD, PUT 등 여러가지가 더 있다.

body에 대해서도 reponse 를 받아야하니, OPTIONS 와 PUT으로 요청해보자.






사진처럼, OPTIONS와 PUT으로 요청했을때 인증없이 '200 OK'응답을 받았고, 응답에도 HTML 코드를 잘 받게된다.

즉 해당 페이지 내부로 접근하는데, 인증을 하지 않고 접근한것.

순전히 서버관리자의 실수로 인증이 필요한 페이지의 인증이 우회된다.


페이지 내부내용을 접근했는데, 이제 시작이지..

인증시에 메세지를 보았으면... 여긴 SQL Injeciton World.

이제 우리가 원하는 Key를 획득하기 위해선.. SQL Injection을 해야함. 흑


일단 페이지를 탐색해봅시다.



이런 간단한 화면만 존재할 뿐...

참 우리는 인증을 우회해서 들어왔기 때문에, 버튼을 누를때 다른 요청을 보낼때도

GET, POST가 아닌 OPTIONS나 PUT메소드를 이용해서 보내줘야한다.

파로스 등 프록시 툴을 사용하거나, 순전히 HTTP Request를 직접 보내 작업해야한다.





1,2,3 번을 들어가보면

1,2번엔 Apple 과 Banana

3번엔 Secret 이라며 Hint를 준다.

hint는 length가 11, column은 id와 no 라고 한다.

SQL Injection을 해야하는데 좋은 정보..인듯


아무튼 파라미터를 변조하여 SQL Injection을 시작해봅시다.

이 문제에서 어려웠던 점은

필터링이 정말 많은 부분이 필터링 되어 있어서

지금까지 해왔던 방식으로 SQL Injection을 시도하면 전부 Access Denied 를 만나게 된다.


먼저 Blind SQL Injection을 진행하려면 쿼리 결과에 따른 참과 거짓값을 구분할 부분이 있어야하고,

해당 문제에서 필터링 하고 있는 문자는 사용할 수 없다.


먼저 어떤 결과를 통해 참과 거짓을 구분할 지 생각해보면,

우리는 보통 참과 거짓값을 구분할때 뭔가, Success 또는 Fail 이란 문구나 0, 1이란 숫자를 보고 구분해왔다.


이 페이지는 위와 같은 결과를 확인하기는 어렵지만,

어떠한 바뀌는 값에 따라 결과가 달라지는 것이 있는데,

내가 이용할 부분은 no의 파라미터가 1, 2, 3에 따라 페이지 결과가 바뀌는 부분을 이용할 것이다.


즉 내가 원하는 쿼리문이 참일 경우 결과가 3이 되게하고, 거짓일 경우 0이나 1, 2.

순서는 상관없겠지만, 그런 방법으로 참거짓에 따라 보이는 결과물을 구분할 수 있으면

우리가 원하는 Blind SQL Injection 을 할 수 있다.



그럼 두번째로 우리가 원하는 쿼리문을 먼저 작성하고, 그에 따라 결과가 달라지게 해야한다.

그런데 쿼리문을 질의해보면 공백,=,select 등 우리가 원하는 결과를 내는데 큰 어려움이 있다.

필터링이..아주그냥... 내가 주로 사용하던 공백필터우회하는 0x0a 역시 필터링 된다....


그럼 일단 공백을 사용할 수 없고, select 나 = 를 사용할 수 없으니.

원하는 결과를 어떻게 낼지 생각해봐야한다.


MySQL 에는 많은 내장함수가 존재한다.

'a가 1일 때 를 만족하는 조건이면 b를 출력, 만족하지 못하면 c를 출력'

간단히 생각해보면 우리가 아주 흔히 볼 수 있는 로직이다.

'if(a=1) print(b) else (c)'

간단한 조건문의 로직이다.


MySQL 에도 내장함수로 IF 함수가 존재한다.


 mysql> SELECT IF(1>2,2,3);

            -> 3


위와 같은 함수이다.


첫번째 파라미터에 조건,

두번째 파라미터에 조건이 참일 경우 출력할 값

세번째 파라미터에 조건이 거짓일 경우 출력할 값

을 적어주면 조건에 따른 결과 값이 출력된다.


이 문제에서는 IF 함수는 필터링 되지 않고, 함수를 계속 이용하면 공백없이도 쿼리문 작성이 가능하다.


 SELECT ? FROM ? WHERE no=?


위와 같은 쿼리문을 가지고 있는 페이지 일 것이고,

no 에 우리가 입력하는 쿼리문이 작성될 것.


그리고 값을 비교할 수 있는 ' =, >, <' 가 막혀있으니 연산자로 비교할 순 없으나,

비교할 수 있는 다른 지시자들이 분명히 있다.

예를들어 'in' 이다. a가 bcdef 중 같은 값이 존재하는지 등을 비교할 때 사용하는 지시자이다.

이 문제에선 in 역시 필터링 되지 않는다.

그리고 다행히 Blind SQL Injection에 필요한 'substr' 또한 필터링 되지 않고있다.

다음과 같은 쿼리문을 작성할 수 있겠다.



SELECT ? FROM ? WHERE no=IF((substr(id,1,1)in('a')),3,1)


그런데 이 쿼리의 문제는 또 in 안에 들어가는 비교대상자들이다.

문자, 문자열, ascii, char, ascii 등등이 필터링 된다.

id의 1번째 자리가 a 라고 가정하면 in 안에는 'a', char(97) 등을 넣어주어야

조건을 만족시킬 수 있는데,

문자를 비교할 수 있는 다른 방법을 찾아야한다.


여러 방법 중 내가 사용한 방법은 hex값을 이용하는 것이다.

MySQL 에서 ASCII 코드의 헥스값 과 문자는 비교가 가능한 대상이다.

예를들어 다음과 같다.


SELECT ? FROM ? WHERE 'a'=0x61

위 쿼리의 WHERE 조건은 참이다.

헥스값 0x61 은 ASCII코드상으로 97, 'a'에 해당한다.

그리고 MySQL 에선 그 헥스값을 문자로 인식한다.


MySQL> SELECT 0x61;

             -> a


즉 우리는 쿼리의 IN 안에 비교할 문자에 해당하는 아스키코드의 헥스값을 넣으면 비교가 가능하다.

그리고 헥스값은 이 문제에서 필터링 하고 있지 않다.



  SELECT ? FROM ? WHERE no=IF((substr(id,1,1)in(0x61)),3,0)

이렇게 했을때,

id의 첫번째 자리가 a일 경우 no=3 이 되어

내용에 Secret 과 Hint를 보여줄 것이고,

거짓일 경우 no=0 이 되니,

내용에 Password:

를 보여줄 것 이다.


그럼 이 쿼리를 가지고,

11자리의 아이디를 알아내는 스크립트를 작성해보자.

필자는 Python 을 애용하므로, Python으로 스크립트를 제작한다.


내가 작성한 스크립트는 첨부파일에서 다운로드할 수 있다.



 

challege9.py





스크립트를 잘 돌려보면 다음과 같이 Flag 를 알아낼 수 있다.



해당 아이디를 pw에 입력하면 해당 문제를 Solved 한다.





'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] All Clear  (0) 2015.08.06
[Webhacking.kr] Challenge 9  (5) 2015.08.05
[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10

외국에선 먼저 일어났지만, 한국에서는 2015년5월28일부터 무분별하게 일어난 아이폰 아랍어 취약점.

해당 문제는 아이폰 iOS 7,8 모두에서 발생한다고 하며, 8.4 베타버전에서도 패치가 안된 상태.

빠른 시간내에 hotfix 가 나오길 기대하지만,

문자나 카톡을 사용하지 않으면서 기다릴 순 없기에 해결 방법을 제시해본다.


일단 문제점이 발생하는 문자열은 다음과 같다.


이와 같은 문제는 모든 화면에서 발생하는 것은 아닌 것으로 추정되고,

이 문제가 발생하는 이유로 가장 유력한 추측글 중 하나를 인용하자면


영문자,숫자 등을 제외한 문자

(위의 페이로드에서는 아랍어, 특수문자, 한자 정도가 되겠다)

는 Unicode(유니코드)로 처리되는데.

시스템이 유니코드를 처리할때는,

유니코드를 Hex값으로 변환한 뒤 Mapping하는 작업을 거친다고 한다.

이때 문제가 발생되고 Mapping 이 정상적으로 이루어지지 않아

무한루프에 빠지게 되고 여기서 메모리릭 등이 나는 이유로 추정된다고 한다.

- From Apple Reddit


각설하고 해결방법을 정리해보자


- SMS

SMS 같은 경우는 메세지 본문이 아닌,

메세지 앱 목록에 Display 되는 부분에서 크래시가 발생한다.

즉 메세지목록에서 해당 문자열이 보이지 않게 처리해주면 된다.

해당 문자열을 보낸 사람에게 답장을 보내거나, 보낸사람이 정상적인 메세지를 한번더 보내주면 해결이 된다고하는데

일단 상대방이 협조적이지 않다고 가정하고 혼자서 해결하는 방법을 제시해본다.




Method 1

공유기능을 통한 해결 방법이다.

1. 메모, 사진 등 아무거나 들어가 공유버튼을 누른다.


2. 메세지 로 공유하기를 누른다.

3. 받는 대상으로 해당 문자열을 보낸 사람으로 지정 하고 보낸다.





Method 2

[이 방법은 기존에 있던 메세지도 모두 삭제되는 방법입니다]

1. 설정 - 메시지 - 메세지 유지 메뉴에서 30일에 체크합니다.

2. 설정 - 일반 - 날짜와 시간 - 자동으로설정 해제 후 시간을 30일 이후의 시간으로 변경합니다.




여러명에게 받았으면 어떻게 하나요?

여러명에게 받으면 여러명 모두에게 답장을 보내주어야 해결됩니다.






안녕하세요.

이번엔 webhacking.kr 7번 문제의 풀이를 작성하겠습니다.


7번 문제에 접속하시면 다음과 같은 화면이 나옵니다.




auth를 눌러보면 Access_Denied! 라고 alert가 표시됩니다.

소스보기를 보면


admin mode: val=2

라고 주석처리가 되어있습니다.


주소창을 보면

val=1 로 접속이 되어있는데,

val=2 로 바꾸어 보면

Access Denied 를 표시해줍니다.


일단 소스를 보져

index.phps 에 들어가줍니다.






위와 같은 소스를 볼 수 있습니다.
보게되면

'db에는 val=2가 존재하지 않습니다. union을 이용하세요.'
라고 표시되어있습니다.

즉 Union Based SQL Injection을 통해 val 에 해당하는 부분에 2가 들어가게 하여
풀이해야합니다.

필터링 리스트를 보면
'/' '*' 를 지워서 공백처리를 막고,
--, 2, 50, +, substring, from, infor, mation, lv, %20, =, !, <>, sysM, and, or, table, column, ' '
를 막고 있습니다.

일단 공백을 모두 막고있고
and나 or.
그리고 우리가 삽입해야하는 정수 2
주석처리에 필요한 --
등을 막고있습니다.

그리고 우리가 삽입해야하는 SQL 구문 부분을 보면

select lv from lv1 where lv=$go
인데.
재밌는건, 1~5 까지 랜덤수를 생성하여
입력값을 () 로 감싸는걸 볼 수 있습니다.

그럼 일단
select lv from lv1 where lv=($go)
구문에서 SQL Injection을 완성하고
rand 가 1이 될때까지 새로고침하는 방법으로 해보도록 하겠습니다.

 select lv from lv1 where lv=(0)%0aunion%0aselect%0a3-1%23)

라는 구문을 작성하였습니다.

일단 0을 넣어서 빈 결과를 만든 후

괄호를 닫아줍니다.

그리고 공백처리가 필터링 되긴 하지만

%0a (개행)은 막히지 않았으므로 우회할 수 있습니다.


그 상태에서 union select 를 넣고 우리가 넣어야하는 2 라는 결과가 나오게 해야하는데.

정수 2 자체는 필터링 되고, + 도 필터링 되므로 3-1 을 넣어 2가 되게 만들어줍니다.

그리고 뒤에 ) 가 남으니 주석을 해주어야 하는데.

-- 주석은 막혀있으니 또 다른 주석인 #(%23)를 넣어 주석처리 해줍니다.


그러면

Query 결과로는 2가 나오고 해당 문제는 클리어 할 수 있습니다.


위의 페이로드를 넣었는데 'nice try' 라고 표시된다면

rand 값이 1이 아닌 값이 나온 것이니

새로고침하여 계속 시도해주시다 보면

rand 값이 1이 될때 해당 문제를 해결하게됩니다.









'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] All Clear  (0) 2015.08.06
[Webhacking.kr] Challenge 9  (5) 2015.08.05
[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10

안녕하세요.

오늘은 Webhacking.kr 의 6번 문제 풀이를 작성해보도록하겠습니다.


6번 문제에 접속하시면 다음과 같은 화면을 보게됩니다.




ID: guest

PW: 123qwe


라는 내용을 보게 되고,

Hint 는 base64 라고 주어졌습니다.


일단 소스를 한번 보도록 하죠


index.phps 로 들어갑니다.




위와 같은 소스를 보게 됩니다.

소스를 분석해 보도록하죠

쿠키값이 없을 경우
id는 guest
pw는 123qwe
로 선언 후
각 값을 가지고 base64 Encode를 20번 합니다.
그리고 나온 결과값에서
1 -> !
2 -> @
3 -> $
4 -> ^
5 -> &
6 -> *
7 -> (
8 -> )
로 치환을 하게 됩니다.

그리고 치환된 값을
user에 id를 password에 pw를 넣어주고 새로고침을 시킵니다.

그럼 문제를 클리어하려면 어떤 조건이 필요한지 마지막 쪽을 보시면

if($decode_id=='admin' && $decode_pw=='admin')
이고, 위에부터 보면 쿠키값을 읽어와
위에서 치환했던 것들을 반대로 치환후 base64 Decode 를 20번 해줍니다.
즉 원래 문자열로 원복하는거죠.
그래서 나온 원본문자열이 admin 이면 문제를 해결할 수 있습니다.

즉 우리가 이 문제를 해결하려면
위에서 처음 id,pw 를 인코딩/치환 한것처럼
admin 이라는 문자열을 20번 인코딩/치환 한 후
쿠키값을 변조해주시면 문제를 해결할 수 있는 겁니다.


해당 인코딩/치환, 치환/디코딩 을 구현한 파이썬 스크립트를 첨부합니다.






'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 9  (5) 2015.08.05
[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19





문제에 접속하면 위와같은 화면을 보게된다.

Join 은 접속할 수 없고


Login 을 누르면 다음과 같은 화면이 나온다.



아무렇게나 로그인을 해보자



이렇게 admin 으로 로그인을 해야한다고 말해준다.


join 에도 무언가가 있을것 같은데,

join 은 접속할 수가없다.


그런데 우리가 Login의 주소를 보면 알겠지만

/mem/login.php

정말 정직한 주소이다.

/mem/join.php

로 접속을 해보자


Not Found 가 뜨지 않고

접속이 된다. 그런데 검정 화면만이 자리잡고있다.


소스보기를 한번 해보자


소스를 보게되면 알아보기가 힘들게 난독화가 되어있다.

이 소스를 jsbeautifuler 와 같은 툴을 통해 살펴보면

어떠한 조건에 따라 조건이 맞을 경우 페이지 요소들을 보여주게 되어있다.


여기서 우리가 조건문을 통과하는 방법은 두가지가있다.

1. 조건을 맞춘다.

2. 조건을 무시하고 조건내에 있는 실행문을 실행시킨다.


클라이언트 기반 웹은 재밌게도 2번이 가능하다.

javascript 는 소스를 클라이언트 내에서 실행시키기 때문에, 소스를 조작할 수도 있고

위와 같이 소스를 볼 수 있기 때문에 조건문을 무시하고 조건문 내부에 있는 소스를 긁어다가 실행시킬수도있다.


필자는 2번을 사용하여 문제를 풀이하겠다.


join.php 페이지에서 개발자도구 를 켜서

난독화된 소스의 조건문 내 실행문만 긁어서 콘솔에서 실행시키면 된다.


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) {

    bye;

}

if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {

    alert('access_denied');

    history.go(-1);

} 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=5></td></tr>');

    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + ' maxlength=10></td></tr>');

    document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');

}

난독화된 소스를 보기 편하게 정리하면 위와같이 정리되는데

필자가 빨간색으로 칠해놓은 부분이 실제 조건을 맞추면 실행되는 부분이다.

이부분들을 복사하여 개발자 도구의 콘솔에서 실행시켜보자



위와 같이 실행이 된다.

실행 후 띄어놓은 join.php 를 보면

화면이 바뀌어 있는걸 볼 수 있다.




가입 창이 생겼다.


우리는 admin 으로 로그인을 해야하기 때문에 admin으로 가입을 할 것이다.

그런데 admin으로 가입이 되지않는다.



admin 은 이미 아이디가 있다.

그럼 admin은 아닌데 admin으로 로그인이 될 수 있는 아이디가 되어야 하는데

필자는 admin 맨뒤에 space를 한번 주어서 해결했다.

(trim 을 사용하거나 하여 공백을 무시할것으로 추측)

admin%20

이 되겠다.

파로스로 중간에서 조작해 주어도 되고,

가입할때 'admin ' 으로 가입해도 된다.

그런데 가입할때 input의 max-length 가 5 라서 입력이 안되는데,

이부분은 개발자 도구로 제한을 풀어주면 쉽게 해결된다.



위처럼 maxlength 를 6보다 크게 지정한뒤

'admin ' 아이디로 가입을 해보자





이제 가입한대로

로그인을 해보자

/mem/login.php



이렇게 로그인을 하면

문제를 해결하게된다.


'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17



4번문제에 접속하게 되면 위와 같은 화면을 보게된다.

이상한 문자열...과 패스워드를 입력하란다.


이상한 문자열을 잘 보면

왠지 이놈이 딱봐도 Base64 인코딩 된것같은 느낌이 팍팍 든다.


Base 64 디코딩을 한번 해보자




Base 64로 디코딩 하니 40바이트의 해쉬값이 나왔다.

혹시나 해서 이 값을 인증해봐도 안된다 ㅋ



아마 이 해쉬값을 풀으라는 것 같은데...!


일단 어떤 해쉬값인지를 먼저 알아야 할 필요가 있다.


일단 40바이트를 가지는 해쉬는 다음과 같다.


우리가 흔히 들었던 sha1 이란 해쉬값이 40바이트이고,

나머지는 이름도 못들어본(?) 해쉬들이다.


위의 값은 아마 대중적으로 쓰는 sha1 해쉬값일거같다.

확실히 sha1 이 맞는지 identify 해보자


hash-identifier 로 해쉬값을 검증해보아도,

sha-1 해쉬임을 알려준다.


그럼 이 sha1 해쉬값을 크랙해서 원래 문자를 알아와야하는데..

구글에 sha1 crack 이런식으로 검색을 해본다


필자는 hashkiller 라는 사이트를 찾아서 사용하였다.

아무튼 위에서 얻은 해쉬값을 크랙하면

하나의 해쉬값이 또 나오게 된다.


그리고 나온 해쉬값을 또 크랙하면 원래의 문자가 나오게 된다.

(원래문자) -> sha1 -> sh1 -> base64

단계로 3번에 거쳐 포장해놓은 문자라고 보면 되겠다.

그래서 원래 낳온 문자를 로그인하게 되면 문제를 클리어할수있다.



'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17
[Webhacking.kr] Challenge 1  (0) 2014.06.13

Webhaking.kr 3번 문제




문제를 들어가보자




이런 퍼즐판을 보게되는데

소스보기를 해봐도 딱히 넘어가는방법은 찾지못했다.

근데 퍼즐판이 옛날에 해본 퍼즐과 유사해서 직접 풀어봤다.

무튼 비슷한 퍼즐을 학교다닐때 해봤고

숫자가 그 줄의 체크되어야 하는 갯수이다.



체크된곳과 숫자들을 보면 대충 어떤 느낌인지 알 것이다.

그 줄에 표시된 숫자만큼 색이 채워질 수 있다.

숫자들이 겹치는 부분에 체크를 하다보면

이렇게 퍼즐을 풀 수 있다.

gogo 해보자




이런 화면을 만나게 되고,

느낌이 SQL Injection 이다.


아무거나 입력을 해보면



이런식으로 입력한 데이터들을 보여준다.


실제로 name 과 answer 값을 POST로 넘기고있는걸 확인할 수 있다.

즉 name 또는 answer 값을 조작하여 SQL Injection 을 시도하면 되는데,

여러 SQL Injection 구문을 사용해 보면 no hack 이라는 단어를 만나기 쉽다.

우리가 평소에 쓰는 or 등도 필터링 되어있어서 시도할 수 없다.


그래서 나는 answer 부분 맨 뒤에 or 대신 or와 같은 역할을 가지고있는 || 를 넣고 true 를 리턴하게 했더니

문제를 해결하게되었다.



 = 도 필터링이 되어있어서

||1 을 보내주고 이름은 위와 같이 zxcv 를 주었다.




여기에서 보여주는 answer 에 authKey를 출력해준다.

이 authKey로 인증하면 3번을 클리어하게된다.

'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17
[Webhacking.kr] Challenge 1  (0) 2014.06.13
[Webhacking.kr] Challenge 8  (0) 2014.06.10

Webhacking.kr 의 2번 문제.

예전에 대회에서도 나왔던 문제였던걸로 기억하는데..

꽤 어려웠던 문제

이번에 풀면서도 한참 헤매게된 문제이다.

차근차근 한번 풀어보자








해킹대회/워게임을 열심히 하는 사람들에게 "홍길동문제"라고 물어보면 다들 이 문제를 떠오르게 될만한 메인화면

홍길동이 명상을 잘 하고 있는 그림이 나온다.


홈페이지 환경으로 문제를 구축해두었는데.

각 메뉴마다 들어가보면서 와.. 무슨말인지모르겠다 라고 한번씩 느껴주자.


그리고 메인화면으로 돌아와 소스보기를 한번 해보자.





이 소스에서 눈여겨 봐야할 몇가지가 있다.



 <area shape="rect" coords="851,7,890,65" href="admin/" target="" alt="" />

1. admin 페이지가 노출되어있다는 것.



 <!--2014-06-16 02:23:52--></td>

2. 알수없지만, 시간정보가 주석처리 되어 있다는 것.


그리고 메뉴들을 돌아다니다 보면

board 메뉴에서 다음과 같은 화면을 볼 수 있다.





매우.. 넌 이 비밀번호를 알아야 이 문제를 풀 수 있어. 같은 느낌을 주는 화면이다.


또 아까 html 소스에서 본 admin 페이지에 접속을 해보자.


admin페이지도 마찬가지로..

여길 뚫어야만해 라는 느낌을 팍팍 준다.


종합해보면.

1. admin 페이지 암호를 알아내야 한다.

2. board 게시판의 oldzombie의 게시글 암호를 알아내야한다.

3. main 페이지에 알수없는 시간정보 주석문이 있다.

이다.


또 한가지, 이 문제에 접속하게되면서

쿠키값이 새로 구워진것이 있다.



 time=1402896232

이러한 값이다.

이 time값을 date형식으로 변환하게 되면,

3번의 시간정보 주석문의 시간이 나온다.


즉 3번의 시간정보 주석문은 time 쿠키값으로 정해진다.

또 한가지 테스트를 통해 알아낼 수 있는 것은

이 쿠키값으로 SQL쿼리가 동작한다는것을 알 수 있다.



Cookie: time=1402896232 and 1=1

=> <!--2070-01-01 09:00:01--></td>


Cookie: time=1402896232 and 1=0

=> <!--2070-01-01 09:00:00--></td>

이와 같은 쿼리를 보냈을때, 쿼리 결과가 true 일 경우 맨뒤의 초가 1

false 일 경우 0 인 것을 확인할 수 있다.


즉 우리는 이 부분을 통해서 Blind SQL Injection 을 행할수 있고,

결과적으로 board 의 비밀번호나 admin의 비밀번호를 DB로 부터 찾아낼 수 있는것이다.


예전에 해당 문제에 힌트가 있었는데, 검색해보니 다음과 같다.


 board table name: FreeB0aRd

 admin table name: admin


이 힌트를 통해서 Board 의 암호는 FreeB0aRd 테이블에서,

admin 페이지의 암호는 admin 테이블에서 Blind SQL Injection 을 통해

알아오면 되겠다.



 Cookie: time=123141232 and (select ascii(substr(password,1,1))from admin)=32

와 같은 방법으로 Blind SQL Injection 을 통해

admin 페이지의 암호를 알아내고



 Cookie time=123123123 and (select ascii(substr(password,1,1))from FreeB0aRd)=32

와 같이 Board의 암호를 알아내면 되겠다.

이 암호를 알아내는 Python 코드는 아래에 첨부된 파일을 참고하면 되겠다.



challege2.py



암호를 모두 알아내면,

게시판에 접근하여 글을 읽으면 다음과 같은 글이 있다.



admin manual 을 클릭하면 파일을 다운로드 받을 수 있다.

zip 파일을 받게되는데.. 암호로 묶여있어서 암호를 풀 수 없다.


또 우리가 알아낸 admin 페이지 암호로 admin페이지에 접속해보자.




다음과 같은 화면을 볼 수 있고,

여기서 알려주는 메뉴얼 패스워드로 압축을 해제하면

manual.html

파일을 얻을 수 있다.

브라우저나 에디터로 열어보면 인증암호를 획득할 수 있다.






'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17
[Webhacking.kr] Challenge 1  (0) 2014.06.13
[Webhacking.kr] Challenge 8  (0) 2014.06.10
[ftz.hackerschool.org] Level 1  (0) 2012.09.20

WebHacking.kr 을 1번부터 풀이해볼까 한다. [끝까지 다할 수 있을지는...]


1번 문제를 보자




위의 문제를 접속해보자







별거 없는 화면이다.


index.phps 라는 문구가 있는데,

현재 이 화면을 보여주는 url 주소를 보게되면


http://host/challenge/web/web-01/

라는 주소이다.


web-01/ 뒤에는 기본으로 보여줄 index 페이지 주소가 생략되어있는 것.

index.html, index.htm, index.php, index.jsp, index.asp, defaul.html

등 현재 Directory 의 메인페이지를 보여줄것이다.


화면에서 보여주는 문구를 보아

현재 페이지는 index.php

일 것이고, index.phps 를 열어보라는 의미일 것이다.



.phps 확장자는 PHP Source 파일의 약자로

해당 php 의 소스를 저장하는 파일로 쓰여지고 있다.


즉 문구에서 보여주는 index.phps 는 페이지의 소스를 보고 문제를 풀라는 뜻이 되겠다.

(일종의 힌트...? 문제를 보여주는것)


index.php 파일을 열어보자



http://host/challenge/web/web-01/index.phps





다음과 같은 화면을 보게될 것이다.

방금 우리가 보았던 페이지의 소스이다.


이 페이지는 php 와 html로 구성된 것을 알 수 있다.


문자를 해결하기 위해선 소스를 분석해서 문제점을 찾아내고, 문제점을 통해 공격해가면 되겠다.


html 소스는 우리가 볼 필요가 없고,

php 소스를 보고 문제점을 찾아보자



이 소스부분과

이 소스부분으로 나누어져 있다.


보게되면 페이지를 로드할때 Cookie값에 user_lv 라는 값이 없으면 user_lv=1 값으로 쿠키를 구워준다

그럼 처음접속한 사용자는 user_lv 의 쿠키값은 기본으로 1을 가지고 있게된다.


그리고 아래의 소스를 보게되면 3개의 if문으로 조건을 저리하는데


첫번째 if문은 정규식을 이용하여  패턴에 해당되는 쿠키값을 쓰게되면 값을 1로 설정해버린다.

두번째는 쿠키값이 6이상이면 1로 설정해버린다.

세번째는 쿠키값이 5보다 크면 문제를 클리어한다.


위의 조건을 만족해야 문제를 클리어하게되는데

5보다 커야하고 6보다는 작아야한다.

5 다음은 6인데 어떻게......?

5 도 안되고 6도 안된다.

그럼 5와 6사이엔 어떤 숫자가 있지?


소수점을 이용하면 이 문제는 해결할 수 있다.

정수로는 5와 6사이의 값이 존재하지않지만.

실수로는 존재하기 때문에, 5.1~5.9 의 값을 이용하여 문제를 해결할 수 있겠다.


쿠키값을 변조하는 방법은 javascript 를 이용하여 직접 변경할 수 도있고,

Cooxie Toolbar 를 이용하거나, EditThisCookie와 같은 인터넷확장프로그램을 이용해도 간단하게 해결할 수 있다.



필자는 javascript 를 이용하여 해결하는 방법을 게시하겠다.


브라우저는 기본적으로 주소창에서 javascript 를 지원한다.

즉 이 문제에선 브라우저 주소창을 통해서 javascript 로 쿠키값을 보거나, 변조할 수 있다.


주소창에 javascript:alert(document.cookie); 라고  적고 엔터를 눌러보자




위와 같은 메세지창을 확인 할 수 있을것이다.

(박스가 큰 이유는 다른 쿠키값들도 있는데, 필자가 보이지않도록 블러처리하였다)


그럼 user_lv=1 이란 값을 볼 수 있는데, 이 쿠키는 페이지에 처음 접속했을때

php 소스에 의해 구워진 쿠키이다.


그럼 이 쿠키값을 5.1~5.9의 값으로 설정시켜주면 된다.



 javascript:alert(document.cookie="user_lv=5.5");

브라우저 주소창에 위와 같이 입력해보자




다음과 같은 메세지를 볼 수 있는데, 위의 값으로 쿠키값을 변조한 것이다.


확인을 누른 후 새로고침을 해보면




위와 같은 메세지박스가 뜨고 문제를 클리어했다.



'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17
[Webhacking.kr] Challenge 1  (0) 2014.06.13
[Webhacking.kr] Challenge 8  (0) 2014.06.10
[ftz.hackerschool.org] Level 1  (0) 2012.09.20
[Wargame.kr] Login Fillttering  (0) 2012.08.09

티스토리 툴바