'웹해킹 25'에 해당되는 글 1건

  1. 2015.10.15 webhacking 25번 문제

안녕하세요. 오늘은 webhacking 25번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 25번을 눌러주세요.

-rw-r--r-- 라고 적혀있네요. 이 기호는 리눅스에서 쓰이는 기호입니다.  해당 파일 또는 디렉토리에 관한 권한을 나타내는 기호이지요. 일단 소스를 봅시다.

소스에선 건질 것이 없군요. 문제화면에서 해결해야 할 것 같습니다.

문제의 주소창을 한 번 봅시다.

file값에 hello가 들어가 있네요. 그리고 화면엔 hello world가 출력되어 있습니다.

그렇다면 화면에 있는 세개의 파일 중 hello.txt를 열어본 것 이군요.

그런데 file에 있는 hello부분은 확장자가 없습니다. 왜 확장자가 없을까요?

문제에 보시면 아시다시피 세개의 파일형태가 리눅스 구조로 되어습니다. 리눅스의 특징 중 하나는 파일을 읽을 때 확장자는 상관이 없다는 것이지요. 즉 이름만 같으면 확장자랑은 상관없이 파일을 읽을 수 있습니다. 하지만 이런 웹에서 리눅스 소스가 쓰였을리는 만무하니 그냥 이번 문제해결이 확장자와 관련이 있다고 알려주는 것 같습니다.

확인을 위해 세번째 파일인 password를 읽어 봅시다. 두번째 파일인 index.php는 왠지 변화가 미미할것 같아 패스워드와 상관있는 세번째 파일을 불러봅시다. 확장자는 상관이 없는 것 같으니 그냥 password를 file에 대입시켜 봅시다.

변화가 없습니다. 그래서 이번엔 출력창의 글자를 전부 지우고 다시 입력해보겠습니다.

그러니 hello world가 출력되는군요. hello.txt를 불러왔네요. 이번엔 확장자를 넣어봅시다.

역시 변화가 없습니다. 그래서 이번엔 다른 값을 넣어보겠습니다.

1을 넣어도 a를 넣어도 admin, hello.txt, password.afsiji 등 을 전부 넣어봐도 hello.txt를 불러옵니다. hello.txt가 이렇게 많은 변수값에 대응해 출력하는 것은 아닐것이므로 아무래도 hello world는 2번째와 세번째 파일을 불러오는 것이 실패했을 때 출력시키도록 한 것 같습니다. 그럼 file값에 얼마를 넣어야 2번째 혹은 세번째 파일을 불러올 수 있을까요?

리눅스에서는 파일을 읽을때 확장자에 관계없이 이름만 맞으면 불러옵니다. 그런데 file값에 password를 넣어도 실패, 확장자를 붙여도 실패합니다.

그렇다면 추측할 수 있는게 하나 있습니다. 이름이 틀렸다는 것이지요. file에 이름을 정확히 입력해도 그 다음 소스에 의해 file변수값이 변조가 되었을 가능성이 있을 수 있습니다.

소스를 한번 예상해봅시다.

file을 입력받음

file=???

if(file==hello)

{

hello.txt 출력

}

else if(file==index)

{

index.php 출력

}

esle if(file==password)

{

password.php

}

esle

{

hello.txt 출력

}

대충 이렇게 예상할 수 있겠군요.

그런데 처음 문제를 보셨을 때 file에는 hello가 들어있었습니다. 만약 hello라는 값이 실패 hello.txt가 출력된 것이 아닌 성공 hello.txt가 출력되었다면 어떨까요?

성공 hello.txt가 출력되었다면 상당히 이상합니다. 예상소스대로라면 hello를 입력받고 그 뒤에 어떠한 소스로 인해 값이 바껴야 합니다. 하지만 값이 바뀌지 않고 그대로 성공 txt가 출력되었다는 것은 이상하죠. 만약 진짜 값이 바뀌지 않았다면 index와 password도 출력되어야합니다. 그렇다면 정리해봅시다.

1. file값을 입력받은 후 어떤 소스로 인해 file값이 변조된다.

2. hello를 입력하면 성공 hello.txt가 출력된다. (추측)

3. hello를 변조한 값은 성공하고 나머지 값 즉 index와 password를 변조한 값은 실패한다.

3번 문을 보시면 hello와 나머지 index, password 의 차이점이 있는 것을 볼 수 있습니다.

몇분 생각하다가 아 바로 답이 나왔죠.

확장자입니다. 그렇다면 예상소스가 바뀝니다.

file=file을 입력받음+.txt+(Null)

if(file==hello.txt)

{

hello.txt 출력

}

else if(file==index.php)

{

index.php 출력

}

esle if(file==password.php)

{

password.php

}

esle

{

hello.txt 출력

}

대략 이런 소스라면 file이 hello를 받으면 성공하고 index나 password를 받으면 실패하는 것이 딱 맞아 떨어집니다. 물론 hello값이 성공 hello.txt로 간다는 전제 하입니다.

file값에 .txt를 더하는 것은 입력받을 때 말고는 거의 방법이 없다고 봐야하지요. 이미 입력받아 문자열의 크기가 정해진 변수에 다시 문자를 더할 수는 없으니까요.

문자열의 끝을 알리는 것은 바로 NULL이죠. .txt뒤에 붙어있다고 가정했습니다.

그런데 우리는 .txt가 필요없습니다. 그래서 NULL을 입력받은 값 바로 뒤에 붙여서 file이 뒤쪽의 .txt를 버리도록 하겠습니다.

file에 password.php%00을 넣어주세요. %00은 NULL값을 인코딩한 값입니다. NULL값은 원래 \0인데 \0을 주소창에 입력하면 \만 인코딩이 되어버려 NULL값이 아니게 되버립니다.

그래서 \0을 같이 인코딩한 %00을 넣어주셔야 합니다.

 오오 바로 패스워드가 떳군요. 입력하러 가기전에 index.php도 확인해 봅시다.

흠... hello world가 index.php... 미미할 것 같아서 password먼저 입력했는데 index를 먼저 입력했으면 혼란스러웠을 것 같습니다.

 auth에 가서 인증해줍시다.

네 이것으로 문제풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

webhacking 25번 문제  (0) 2015.10.15
webhacking 19번 문제  (0) 2015.10.15
webhacking 16번 문제  (0) 2015.10.13
webhacking 14번 문제  (0) 2015.10.13
webhacking 4번 문제  (0) 2015.10.13
webhacking 6번 문제  (0) 2015.10.12
Posted by englishmath


티스토리 툴바