Javascript - Obfuscation1 문제풀이 시작하도록 하겠습니다~

 

1. 문제

 

문제 접근 시 곧바로 패스워드를 입력하라고 한다...


2. 문제풀이

 

패스워드에 임의의 test글자를 입력해 보았다.

 

 

잘못된 패스워드라고 나온다..

 

힌트를 얻기 위해 요청 패킷을 분석해 보았다.

 

요청 값 내 If-None-Match 헤더와 If-Modified-Since 헤더는 삭제를 해주었다.(304 에러 방지)

 

응답 패킷에 pass 힌트가 보인다. URL 인코딩 되어있는 것 같아, (% 숫자를 보고 추측) burp의 Decode 기능을 이용해보았다.

 

URL 디코딩을 해보니 cpasbiendurpassword라는 값이 나왔다.

 

이 값을 패스워드에 입력해 보았다.

 

 

결과는...

 

해당 값을 검증해보라는 문구가 나왔다.

 

이를 검증해보니

 

파랑새가 나와 포인트를 주었다.

 

문제풀이 끄읏...

 


이번에는 304 에러를 제거할 수 있도록 요청 패킷에 If-None-Match 헤더와 If-Modified-Since 헤더가 잡혀있었다.

안 나올 경우엔 개발자 모드를 이용해야 할 것 같다.

 

Javascript - Authentication2 번째 문제 풀이 시작해보도록 하겠습니다.

 

1. 문제

 

문제에 접근하니 로그인하라는 문구가 보이네요

 


2. 문제풀이

 

요청 패킷을 잡아보았다.

 

페이지 내용만 보이게 되며 추가적인 정보를 얻을 수 없었다.

 

로그인 버튼을 눌러 패킷을 잡아 보아야겠다고 생각했다.

 

ID에 임의의 test를 입력해 보았다.

 

이후 패스워드를 입력하라는 공간이 나왔다.

 

똑같이 test를 입력해보았다.

 

나에게 버릇없는 해커라고 핍박을 주었다...

 

더욱 자세히 힌트를 얻기 위해 개발자 모드를 사용하였다.(크롬 기준 F12)

 

login.js 파일이 하나 더 있었으며, ID, PW 힌트가 보였다. GOD:HIDDEN 값이 , 를 두고 적용이 되는 것 같아 보였다.

 

username에 GOD password 값에 HIDDEN을 입력해 보았다.

 

Username : GOD

 

Password : HIDDEN

 

결과는...

 

패스워드를 검증하는 곳에 넣으라는 문구가 보인다.

 

파랑새가 마중 나와 점수를 주었다~

 


이번에도 login.js 파일은 패킷에 잡히지 않았다....

이게 왜 이렇게 적용이 될 수 있는지 의문이며 더 공부해서 알아봐야겠다.

개발자 모드를 통해 힌트를 자주 얻게 될 것 같다.

 

문제풀이 끄읏~

  • 문제를 보니 정답을 구하는 방법은 escape 함수와 연관되어 있어 보임

  • 전 문제와 비슷하게 check() 함수를 이용한다
  • moo라는 정답 변수에 해당하는 값이 url 인코딩 되어 있다
  • 간단하게 url 디코딩하여 값을 알아본 다음에 입력 하면 그게 정답일듯 싶다.

  • 디코딩한 결과 값을 입력하여 문제 풀이 성공

 

  • 소스코드 상에 var 변수와 관련하여 해결방안이 있을것 같음

  • check(x)함수는 사용자 입력값(x)을 받아와서 정답(RawrRawr)을 비교하는 함수 같다.
  • 결론은 정답에 해당하는 변수(RawrRawr)의 값을 알아내야 하는데...

  • 소스코드상에서 혹시 하드코딩되어 있는지 확인하기 위해 find 했더니...
  • 다음과 같이 창을 오른쪽으로 쭉 넘기면 저기에 선언이되어있다....일부러 안보이게 해놓으려고 지금 저렇게 해놓은건가? ㅋㅋㅋ

  • moo 입력 시, 문제 해결됨

보물 문제는 page 버튼 번호에 따라서 특정 값이 나오는 것을 확인할 수 있었다. 소스보기(F12)를 통해서 더 확인해 보자

 

별로 특별한 내용은 보이지 않고 button을 누르게 되면 action을 통해 각 번호에 해당하는 내용을 get 방식으로 불러오는듯 하다.

 

해서 해당 url의 page 파라미터에 4를 넣어보니 page=4에 대한 답이 나왔다. 9번까지 해보다가 파이썬 반복문을 활용해서 찾아보도록 하자.

간단한 반복문을 활용해서 HackCTF{라는 문자열이 나오면 그 해당 번호를 출력하게 작성하였다. 

flag 값이 1225번에 있다고 나온다. 그렇다면 실제로 들어있는지 확인보도록 하자.

이렇게 flag 값으로 HackCTF{0hhhhh_5o_g0od_try!}를  찾을 수 있었다.

'워게임 > HackCTF' 카테고리의 다른 글

[HackCTF] Web - 보물 풀이  (0) 2021.07.24
[HackCTF] Web - / 풀이  (0) 2021.07.20
los

이번 문제는 id와 pw를 입력받는 문제인데 where절에 id='{$_GET[id]}' and pw='{$_GET[pw]}'으로 들어간다.
문제는 두 파라미터가 '을 필터링을 하고 있는 것이 문제이다.

 

인터넷에 검색해본 결과 \를 사용하면 된다는 것을 알 수 있었다.만약 id 값이 것을 찾고 싶어서 쿼리문을 SELECT id FROM test WHERE id = '''로 작성하면 에러가 난다.
그 이유는 '를 문자로 인식하지 않기 때문이다.

 

이러한 문제 때문에 특수문자 예외처리를 해줘야하는데, 이것이 \이다.
SELECT id FROM test WHERE id = '\''로 처리하게 되면 id가 '인 것을 찾는 쿼리문으로 된다.

이것을 이용하면, SELECT id FROM prob_succubus WHERE id='\' and pw='#'으로 처리하면 WHERE 절의 id 값은 ' and pw=로 인식이 된다.

 

저 상태에 pw 파라미터에 값을 넣으면 '' 묶음에서 자유로워지는 것이다.

 

이와 같이 간단하게 풀이하였다.

los

해당 문제의 입력 파라미터는 pw 뿐이며, '를 필터링하고 있다.
또한 쿼리문을 보니, '' 안에 입력값이 들어가서 문제 해결에 어려움이 있을 것 같다.

 

결국 몇시간을 시도한 끝에 다른 사람의 문제풀이를 살펴보니 쿼리문에서 =를 대신 LIKE를 사용한 이유가 있었다.
LIKE에선 약간의 정규식을 사용할 수 있다.

  • 특정 문자% : 특정 문자로 시작
  • %특정 문자 : 특정 문자로 끝남
  • %특정 문자% : 특정 문자을 포함

위를 이용하여 pw를 찾으면 된다.

 

import requests, string, itertools

url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
headers = {'Cookie': 'PHPSESSID=mm982osuke85at52o0625bnkud'}

def pwParser():
    for s in string.ascii_lowercase + string.digits + string.punctuation:
        parameter = f"?pw={s}%"
        res = requests.get(url + parameter, headers=headers)

        if 'Hello admin' in res.text:
            print('parsing!!! >', s)
            break

pwParser()

파이썬으로 돌려보니 걸리는 것이 없었다.

 

그래서 혹시 admin과 guest의 pw 값의 앞부분이 같아서 Hello guest로 떠서 그런거 아닌가 하여, 조건문을 Hello guest로 변경하니 값이 나왔다.
이를 이용하여 admin의 pw를 구하려고 했지만, 파이썬으로 구현하는건 시간 소모가 크다고 생각하여 손으로 순수 값을 매칭시켰다.

 

몇 번 반복하니, admin의 pw 앞부분을 찾을 수 있었다.

los

그동안 익숙했던 문제 스타일이 아닌 새로운 문제 스타일이 나왔다.

 

사이트에서 입력 받는 파라미터는 shit 하나이며, 이 파라미터는 from prob_giant의 사이에 들어가게 된다.
shit의 필터링은 공백, \n, \r, \t이며, 입력 길이가 1보다 커서는 안된다.

 

나는 필터링 목록 대신에 사용할 만한 것을 생각하다가, addslashes 함수의 우회 방법이 생각이 났다.
addslashes 함수의 우회 방법은 특정 인코딩 기법을 적용한 함수에 %01와 같이 의미가 없는 URL 인코딩 값을 넣어줌으로써 우회를 하는 방법이다.

 

이처럼 의미가 없는 URL 인코딩 값을 보내주면 될 것 같아서 %01를 서버에 보내봤다.
공백처리는 되었지만, 결과값을 반환하지 않고 있다.

 

인터넷에 검색하니, %01 ~ %06까지 먹히지 않으면 %0b, %0c, %a0를 넣으면 된다고 한다.

 

값을 넣어보니 쿼리문의 결과값을 잘 반환하여 문제를 풀 수 있었다.

+ Recent posts