목록WebHacking (65)
Iriton's log
문제는 이러하다. 우선 문제 파일을 다운로드 받고 링크에 접속해 보았다. 초기 화면이다. Upload My Memo에 들어가면 이런 식으로 파일 이름과 내용을 저장하여 업로드 할 수 있다. 혹시나 해서 flag.py의 이름으로 업로드 해보았지만 될 리가 없다. 어떻게 flag.py를 다운 받지 싶어서 문제 파일에 있는 코드를 살펴 보았다. upload 하면 /upload 파일에 저장하고 read 하면 upload 파일에서 불러 오나보다. 근데 해당 조건문에서는 수상하게 파일명에서 ..이 사용되는 걸 막는다. ..은 상위폴더를 뜻하는데 그럼 flag.py가 upload파일이 아닌 상위 폴더에 있어서 막나? 싶은 생각이 든다. 파일명에 ../flag.py를 입력하고 업로드 하면 코드 내용대로 bad... 가..
문제에서 힌트를 다 주고 있다. 우선 파일을 다운 받자. 압축을 풀면 이렇게 파일이 많은데 이 중에서 최종 결과물으로 보이는 project만 열어 봤다. 평범한 웹 페이지다. 문제에서 개발자 툴을 사용하라 했으니 f12를 누른다. 개발자 모드로 진입하자마자 보이는 Search flag 형식을 검색해 보면 되지 않을까? 너무 쉽게 정답...
문제 파일을 다운로드 하면 html 파일이 있다. vscode로 열어도 되고 메모장으로 열어도 되는데 난 그냥 메모장으로 열었다. 문제를 풀다 보니 두 가지의 풀이법이 있어서 두 가지 다 작성하려고 한다. 1. 코드 변환 (While문) 메모장을 열면 엄청 긴 코드가 보이지만, 이 중에서 필요한 건 클릭할 때마다 카운트 되게 하는 함수이다. 10,000번 클릭할 수 없으니 코드를 수정해 줘야 하기 때문이다. 해당 코드는 아래와 같다. 코드를 대충 읽고 '어 그럼 카운트를 1씩 증가하지 말고 9999번씩 증가 시키면 되겠네' 라는 생각을 했다. counter += 9999로 바꾼 뒤 실행하면 flag가 암호화 되어서 출력된다. 그럼 반복문을 통해서 내부적으로 매크로를 돌려야 할 것이라 생각했다. 원래 코드..
첫 화면이다. nickname, comment, captcha가 있다. captcha 옆에는 정체불명의 문자열이 있다. 잘 모르겠으니 소스코드를 살펴 보자. ck() 함수를 보면 조건문이 여러개 있다. 조건문을 분석해 보면 id, cmt, capcha의 value가 공백이라면 focus 함수가 실행되고 리턴된다. focus 함수가 뭔지는 몰라도, 공백을 입력하면 안 되는 거 같다. captcha와 captcha_의 value가 달라도 focus 함수가 실행된다. 즉, nickname과 comment에는 공백이 아닌 값을 입력하고 captcha에는 captcha_.value와 동일한 값을 입력해야 한다. 해당 코드를 보면 captcha 라는 box에 입력한 값은 captcha이고 정체불명의 문자열이라 했던..
첫 화면은 이번에도 input box만 보인다. 페이지 소스 코드를 살펴 보아야 한다. unlock이라는 변수에 무수히 긴 연산이 있다. 그리고 login.pw의 값이 unlock의 값고 같다면 해결이 된다고 한다. 따라서 연산 값을 찾기만 하면 문제는 풀린다. 우선 unlock 변수에 저장되는 저 연산식을 모두 복사한다. f12를 누르고 Console 창에 복사해둔 연산식을 붙여넣으면 알아서 계산을 해 줘서 박스에 입력했다.
input box와 button만 보인다. 올바른 값을 입력하고 check를 클릭하면 해결될 문제같다. flag값을 구하기 위해 페이지 소스 코드를 확인해야 한다. form tag를 분석해 보면 input 값은 input_pwd에 저장된다. 조건문을 살펴 보면 ul의 값과 input 값과 일치하면 해결된다. 그 외 경우에는 Wrong 팝업을 띄운다. 해당 코드를 보면 ul은 URL에서 .kr의 인덱스 값에 30을 곱한 수를 저장하는 변수이다. 인덱스의 시작은 0이기에 .kr의 인덱스 값은 18부터 시작이므로 여기에 30을 곱한 값은 540이 된다.
소스코드를 볼 수 있는 하이퍼 링크가 첨부되어 있다. 당연히 들어가 준다. solve(26)에 해당하는 조건문을 보니 id가 admin이 되어야 한다. 바로 위의 두 줄을 보면 id에 들어가는 값은 urldecode함수를 거친다. 그리고 admin이면 안 된다. (직접적으로 ?id=admin을 쓰면 안 된다는 뜻이다.) 디코딩한 값이 admin이어야 하는 것 같다. 즉, admin을 인코딩한 값을 알면 된다. 하지만 순순히 문제가 풀리지 않았다. 찾아 보니, 브라우저와 php는 서로 데이터를 교환할 때 자동으로 인코딩과 디코딩을 한다고 한다. 이 점을 고려해서 admin을 두 번 인코딩해야 한다. 인코딩은 사이트를 통해 간단하게 할 수 있으므로 패스.
초기화면은 위와 같이 검은 화면에 별이 떠 있다. 힌트를 얻을 게 없으니 바로 소스코드를 확인해 봤다. 먼저, do it! 이라는 주석을 발견했다. 주석과 같은 줄에 해당하는 조건문은 cd라는 매개변수가 124가 되어야 한다고 명시되어 있다. mv함수는 onkeypress 즉, 키보드의 키가 눌렸을 때 호출된다. 따라서, 키보드의 아스키 코드가 매개변수 cd로 전달됨을 알 수 있다. 아스키 코드를 참고하면, wasd키로 별이 이동하고 |(파이프)키를 통해 문제가 해결된다. * 참고로 별 이동 후 파이프 키를 입력하면 문제가 풀리지 않아서, 새로고침이 필요하다.