맥북사용자들은 불편하고 헬조선스러운 국내 인터넷 환경에서 살아남기 위해서는

페러럴즈/VMWARE/VirtualBox 등 VM프로그램의 이용이 불가피하다.


왜 VM을 막는지 이해할 수 없는 보안방식이지만,

맥사용자 대응은 1도 안해주면서, 요구하는건 지X맞게 많은 우리나라 인터넷 환경에

다시 한번 박수를 보낸다.


맥사용자가 VM환경에서 게임이나, 은행/장학재단/자동차보험 등을 이용하려고 하면,

처음부터 알려주지도 않으면서 꼭 설치하라는 모든걸 설치하고 마지막에 VM환경에선 이용할 수 없다고 깐다. (시X)


이 헬조선스러운 방식을 우회하고 이용할 방법이 있으니,

대게 우리나라 보안프로그램들은 거의 비슷한 방식의 로직들로 보안체크를 하는것.


VM을 차단하는 대다수의 보안프로그램은 아래와 같은 방법으로 대부분 우회된다.


요약: Regedit 에서 HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\VideoBiosVerison의 값에서 VM 인줄 모르게 바꿔버리자.




이것도 들어가기 귀찮으면,

첨부된 레지스트리 파일을 다운받아 실행하면 끝!



  vm.reg


python(2.7) 으로 웹페이지 parsing 을 하다보면 계속 만나게 되는 문제.

매번 까먹어서 짜증나서 블로그에 포스팅해놔야지


euc-kr 로 제작된 웹페이지를 urllib 등으로 데이터를 읽어와서

작업을 하려하면 한글이 무참히 깨지거나, 폭풍 error



이렇게, unicode로 변환 후 utf-8로 encoding 해주면 대부분 잘 된다.


늘 바빠서 꾸준히 못하고,

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

드디어 올클...


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

티스토리 툴바