'Webhacking'에 해당되는 글 29건

  1. 2015.10.15 webhacking 25번 문제
  2. 2015.10.15 webhacking 19번 문제
  3. 2015.10.13 webhacking 16번 문제
  4. 2015.10.13 webhacking 14번 문제
  5. 2015.10.13 webhacking 4번 문제
  6. 2015.10.12 webhacking 6번 문제
  7. 2015.10.12 webhacking 15번 문제
  8. 2015.10.02 webhacking - 26번 문제
  9. 2015.10.02 webhacking - 18번 문제
  10. 2015.09.25 webhacking - 60번 문제

webhacking 25번 문제

Webhacking 2015. 10. 15. 16:54

안녕하세요. 오늘은 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 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
,

webhacking 19번 문제

Webhacking 2015. 10. 15. 16:36

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

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

흠 소스를 한 번 봅시다.

??? 소스가 없습니다. 아니 정확하게는 공개가 되있지 않네요. 일단 소스창을 닫읍시다.

문제를 보시면 제출칸에 admin이라고 미리 적혀있는 것을 볼 수 있습니다.

한번 제출 해 봅시다.

당신은 admin이 아니라는군요. 이번엔 다른 값을 넣어 봅시다.

1이란 값을 넣으니 hello 1이라는 값이 나오는군요. logout이란 버튼이 있는걸로 보아 1로 로그인이 된 것 같습니다. 다른 값을 넣어봅시다.

b도 되는군요. 아무래도 admin을 제외한 모든 값은 다 로그인이 되는 것 같습니다.

그런데 말입니다. 위의 사진을 보시면 1로 로그인이 되었음에도 불구하고 주소값은 바뀌지 않았습니다. 주소값이 바뀌지 않았는데 창이 바뀌었다?? 있을 수 없는 일이죠.

즉 주소값 외의 다른값이 바뀌어서 로그인 페이지로 이동되었다. 라는 사실이 나옵니다.

주소값 외의 다른 값이라고 하면 일단 쿠키값을 생각할 수 있겠네요. 쿠키값을 확인해 봅시다.

PHP에서 세션아이디를 발급하는 키값인 PHPSESSID와 userid쿠키가 있네요.

PHPSESSID는 기본으로 있으니 상관없습니다만 userid는 기본으로 있는 것이 아닌 함수나 소스에 의해 생성된 임의의 쿠키입니다.

값이 뭐라뭐라 나와있네요. 그런데 이 값의 끝부분을 보시면 %3D라고 되어 있습니다.

%3D는 =를 URL인코딩한 값이지요. 결국 이 값은 맨 마지막에 =가 있으므로 base64로 인코딩한 값이라고 볼 수 있습니다. 한번 확인해 봅시다.

YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI=를 base64로 디코딩을 하시면

c4ca4238a0b923820dcc509a6f75849b 라는 값이 나옵니다. 

더이상 base64로 디코딩이 되지 않는군요. 우리가 로그인한 값은 1인데 너무 다른 값이 나왔습니다. 아무래도 다른 프로그램으로 인코딩을 더 한 것 같군요.

그러면 어떤 프로그램을 써서 인코딩을 했을까요? 

base64로 디코딩한 값을 보시면 총 32글자가 나옵니다. sha1은 40글자이므로 sha1은 아닙니다. 그러면 무슨 프로그램을 써야 32글자가 나올까요? 바로 md5입니다. 

이 값은 md5로 인코딩한 값이라고 볼 수 있습니다. md5로 디코딩을 해 봅시다.

1이란 값을 찾았다는 군요. 호오. 소스는 파악했습니다. 그럼 정리해봅시다.

1. 우리는 admin으로 로그인을 해야 한다.

2. id에 admin이란 값이 들어오면 not admin으로 이동된다.

3. id에 넣은 값은  md5인코딩 - base64인코딩 후 userid라는 쿠키값에 저장된다.

즉 우리는 userid라는 쿠키값에 admin - md5인코딩 - base64인코딩 한 값을 넣어 굳이 id칸에 입력하지 않아도 admin의 로그인화면으로 이동할 수 있다는 것을 알 수 있습니다.

admin을 md5인코딩 합니다.

21232f297a57a5a743894a0e4a801fc3 

md5인코딩한 값을 base64로 인코딩 합니다.

MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM=

쿠키값에 넣어줍시다.

확인 후 F5를 누르면~

error가 뜨네요................

흠... 왜 error가 뜰까요. 혹시 단일문자가 아닌 문자열로 인코딩을 하는 과정에서 잘못 인코딩이 된 것일까요? 확인을 위해 12를 넣어보겠습니다.

뭐가 많이 뜨네요. %3D를 =로 바꾼 후 base64인코딩 해봅시다.

c4ca4238a0b923820dcc509a6f75849bc81e728d9d4c2f636f067f89cc14862c 가 뜨네요.

이중 c4ca4238a0b923820dcc509a6f75849b는 1의 md5인코딩 값이네요. 나누어 봅시다.

c4ca4238a0b923820dcc509a6f75849b

c81e728d9d4c2f636f067f89cc14862c    

둘다 32글자인것으로 보아 뒤쪽의 문구는 2의 인코딩 값이라는 것을 짐작하실 수 있습니다.

즉 1을 인코딩한 값과 2를 인코딩한 값을 합친 것을 base64로 인코딩 했네요.

그렇다면 우리는 a d m i n 각각 인코딩을 하여 합쳐야 합니다. 그런데.. 솔직히 이렇게 하면 귀찮잖아요. 꼼수를 써봅시다.

id에 admi를 쳐주고 제출을 합시다. admin이 아니므로 아마 로그인이 될 것입니다.

예상대로 로그인이 되었고 쿠키값을 확인할 수 있습니다.

여기에 n값만 추가로 넣어주면 되겠군요.

일단 이 값을 base64디코딩 합니다.

0cc175b9c0f1b6a831c399e2697726618277e0910d750195b448797616e091ad6f8f57715090da2632453988d9a1501b865c0c0b4ab0e063e5caa3387c1a8741 가 나오네요.

여기에 n을 md5인코딩한 값을 더해줍시다.

7b8b965ad4bca0e41ab51de7b31363a1 이네요. 더해줍시다.

0cc175b9c0f1b6a831c399e2697726618277e0910d750195b448797616e091ad6f8f57715090da2632453988d9a1501b865c0c0b4ab0e063e5caa3387c1a87417b8b965ad4bca0e41ab51de7b31363a1 

자 이제 이것을 base64인코딩을 합시다.

MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZDZmOGY1NzcxNTA5MGRhMjYzMjQ1Mzk4OGQ5YTE1MDFiODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE3YjhiOTY1YWQ0YmNhMGU0MWFiNTFkZTdiMzEzNjNhMSA=

이값을 쿠기값에 넣어줍시다.

설정 후 확인을 위해 F5를 눌러줍시다.

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




[출처] PHPSESSID|작성자 scBrain


'Webhacking' 카테고리의 다른 글

webhacking 25번 문제  (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
,

webhacking 16번 문제

Webhacking 2015. 10. 13. 21:04

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

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

심플하네요. 소스를 한 번 봅시다.

document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";


function mv(cd)
{
kk(star.style.posLeft-50,star.style.posTop-50);
if(cd==100) star.style.posLeft=star.style.posLeft+50;
if(cd==97) star.style.posLeft=star.style.posLeft-50;
if(cd==119) star.style.posTop=star.style.posTop-50;
if(cd==115) star.style.posTop=star.style.posTop+50;
if(cd==124) location.href=String.fromCharCode(cd);
}
function kk(x,y)
{
rndc=Math.floor(Math.random()*9000000);
document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";
}

흠... 첫 document 쪽을 보시면 *을 출력하는 내용이네요. innerHTML이 쓰인것을 알 수 있습니다. innerHTML은 특정 요소의 내용을 가져오거나, 특정 요소의 내용을 변경하는 자바스크립트 함수입니다.

document.body.innerHTML+=이라고 되어있으므로 가져온 특정 요소 즉 +=오른쪽의 내용을 출력하려는 무언가의 body에 추가하겠다는 뜻입니다.

그런데 스타일 부분에 다음과 같이  position:relative;left:0;top:0 라고 적혀있습니다. 

position은 엘리먼트(요소)의 배치방식을 설정하는 속성입니다. relative는 상대위치를 지정하는 속성이지요. left와 top은 좌표라고 보시면 됩니다. 가로,세로 이지요. 여기선 (0,0)이네요.

정리하면 0,0위치에 aa라는 *을 출력한다라고 되어있네요.

두번째부턴 function 즉 사용자 정의 함수가 쓰였습니다. 자세한건 php함수설명 항목을 참고하세요.

mv와 kk라는 함수를 임의로 만든 것 같습니다.

일단 kk부터 살펴봅시다.

rndc라는 변수에 Math.floor(Math.random()*9000000)의 값을 집어넣는다는군요. Math.floor 는 소수값이 존재할 때 소수값을 버리는 역활을 하는 함수합니다. Math.random 함수는 난수를 생성시키는 함수이지요. 옆에 9000000은 최대값을 의미합니다. 즉 0에서 9000000 사이의 값을 랜덤으로 집어넣는다는 뜻입니다. 소수값은 버리니까 정수만 저장이 됩니다.

그다음은 document를 이용해 또 별을 출력시키는군요. 다만 left는 x값이고 top은 y값이네요.

kk(x,y)라고 했으므로 입력 받은 x,y값 위치에 출력시키겠다는 뜻입니다. 그리고 onmouseover속성이 쓰였네요. 이것은 해당 이벤트를 사용한 영역에 마우스 커서를 올렸을때 이벤트를 발생시키겠다는 소리입니다. 마우스 커서를 올리면 this.innerHTML이벤트를 발생시키네요ㅣ.

this 즉 이것의 특정요소의 내용을 "로 변경시킨다고 적혀있습니다. 한마디로 없앤다는군요.

자 이제 마지막으로 mk를 살펴봅시다.

첫줄에 kk함수를 호출합니다. 단 kk의 x값은 star.style.posLeft-50이네요. posLeft란 개체의 좌표값을 반환하는 속성입니다. star의 left좌표값을 반환한다는 뜻입니다. 이값에 -50을 한 값이 kk의 x값이 된다는 뜻입니다. y도 마찬가지입니다.

그다음은 if문을 사용해 cd값을 비교하네요. 각각 cd값에 따라 좌표값을 바꾸는군요.

그런데? 맨마지막 if문을 보시면 cd값이 124이면 location.href가 실행된다는군요. 이 함수는 페이지를 이동시키는 함수입니다. 이동할 주소를 보니까 

String.fromCharCode(cd)라고 되어있네요. String.fromCharCode는 받은 값을 각각 유니코드에 해당되는 문자 또는 문자열로 반환시키는 함수입니다. 그렇다면 cd가 조건에서 나왔듯이 124라고 치면 그에 해당되는 기호인 |로 반환되고 그러면 location.href에 의해 주소가 |인 페이지로 이동할 것 같습니다.

자 이제 소스 분석은 거의 끝났습니다. 그러면? 이제 의문점이 하나 생기지요.

이 사용자 정의 함수 mv는 언제 실행되는가 입니다.

소스를 처음부터 끝까지 살펴보면

이러한 소스가 보입니다. onload가 쓰였네요.

html에선 위에서 아래로 즉 차례대로 소스가 실행이 됩니다. 실제로 함수가 작동되는 부분은 script부분이지요. 그런데 body는 script보다 먼저 실행됩니다. 그래서 body부분에서 script관련 함수가 나오면 당연히 아직 script가 구현이 되지 않았기 때문에 오류가 나버립니다. 그런데 onload를 쓰면 body에 함수실행문을 적어도 모든 구현이 다 끝난 후 kk(1,1)이 실행되기 때문에 오류가 나지 않습니다.

onkeypress는 키보드에서 키를 눌렀을 때 이벤트를 발생시키는 속성입니다. 꾹 누르고 있는 동안에도 이벤트가 발생하지요. 단 shift나 enter키, 한/영 같은 키는 인식하지 못합니다.

event.keyCode는 사용자의 입력키 값을 반환합니다. 예를 들어 제가 a를 입력한다면 a값을 반환시키는 것이지요. 다만 따로 출력하라는 명령어를 주지 않으면 a를 입력했다도 해도 a값이 아닌 a에 해당되는 숫자를 저장시킵니다.

총 정리를 해보면 

1. 이 페이지로 들어오자마자 kk함수에 의해 (1,1)위치에 별이 생성된다.

2. mv의 cd값은 우리가 입력한 키보드의 값이다. 또한 키를 누를때 혹은 쭉 누르고 있을때마다 mv함수가 실행된다.

3. cd값이 124이면 주소가 |인 페이지로 이동한다.

지금 소스자체만 보시면 문제를 해결할 수 있는 방법이 없습니다. 그렇다면 3번을 참고하여 새 페이지로 이동할 필요가 있습니다.

cd값이 124여야 하므로 보통 124를 친다고 생각할 수 있지만 키 한번에 하나씩 인식하므로

124로 인식이 안되고 1과 2와 4로 인식이 됩니다.

받은 문자를 숫자로 저장시키므로 124에 해당되는 문자를 입력해봅시다.

124에 해당하는 유니코드 문자는 |입니다. 입력해봅시다.

shift는 onkeypress의 영향을 받지 않으므로 shift를 눌러도 mk가 실행되진 않습니다.

페이지로 이동이 되었습니다. 바로 패스워드가 나오는군요. 인증해 봅시다.

전송 해봅시다.

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




'Webhacking' 카테고리의 다른 글

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

webhacking 14번 문제

Webhacking 2015. 10. 13. 19:32

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

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

참 간단해보이는군요. 소스를 한 번 봅시다.


function은 사용자 정의 함수입니다. 자세한 건 php함수 설명 항목을 참고해 주세요.

ul이란 변수에 document.URL 값을 넣습니다.

var이 쓰인걸로 보아 이 언어는 php언어가 아닌 자바스크립트 언어인 것 같습니다.

그리고 ul에  ul.indexOF(".kr")의 값을 집어넣는다는군요..

자바스크립트 함수인 indexOf 는 문자열 안에 조건이 되는 문자열이 몇 번째 위치에 존재하는지를 확인하는 함수입니다. 사용법은

 "[문자열]".indexOf("[검색할 문자열]"[검색시작위치]);

입니다.

위의 소스 ul=ul.indexOf(".kr")를 해석해보자면

변수 ul에 들어있는 문자열 중 .kr이 시작되는 위치를 숫자로 표현하여 다시 ul에 저장시킨다는 군요. 검색시작위치는 생략되었습니다.

그다음은 ul*30의 값을 ul에 저장시키구요.

그 ul이랑 pw.input_pwd.value를 비교하여 값이 같으면 패스워드를 출력한다네요.

pw.input_pwd.value는 저 상자를 의미하겠군요. ul값을 저 상자에 넣으면 되는 것 같습니다.

일단 ul을 계산해 보겠습니다.

document.URL은 현주소를 의미합니다. 

즉 ul에 http://webhacking.kr/challenge/javascript/js1.html란 값을 넣는다는 것이지요.

그다음은 .kr의 위치를 숫자로 변환하여 저장시키지요?

18번째에 있네요. 단 indexOf는 첫위치를 0으로 인식하니까 실제로 저장되는 값은 17입니다.

17*30은 510입니다. 즉 최종으로 ul엔 510이 들어가 있습니다. 

510을 한 번 넣어 봅시다.

성공적으로 패스워드가 떴습니다. auth로 가서 인증해봅시다.

전송을 눌러줍시다.

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

'Webhacking' 카테고리의 다른 글

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

webhacking 4번 문제

Webhacking 2015. 10. 13. 19:27

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

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

암호문같아 보이는 문구가 적혀있습니다. 아무래도 어떤 문자를 인코딩 한 것 같군요.

그런데 뒤쪽에 보시면 ==가 있습니다. ==는 base64로 문자를 인코딩했을때 나타나는 문자입니다. base64의 특징이죠. 문자를 복사하여 base64로 디코딩을 해 봅시다.

한번 디코딩을 하니 다음과 같은 문자열이 나왔습니다. 다시 한번 디코딩을 해 봅시다.

그런데? 디코딩을 하니 더이상 아무것도 뜨지 않습니다. 그렇다면 이 값이 패스워드인걸까요? 한번 입력해봅시다.

......

정답이 아닌 것 같군요. 즉 여기서부턴 다른 프로그램으로 인코딩이 된 것 같습니다.

평문 - ??인코딩 - base64인코딩 - 암호문  딱 이런식이겠군요. 우리는 디코딩을 위해서 뭘로 인코딩을 했는지 알 필요가 있습니다.

그런데 말입니다. 저 base64로 디코딩을 한 문자열을 세어보니 40글자가 나오더군요.

평문을 ??로 인코딩을 했더니 40글자가 나온다. 이것은 sha1인코딩의 특징입니다.

http://www.hashkiller.co.uk/sha1-decrypter.aspx 사이트로 들어가 sha1으로 디코딩을 해봅시다.

또 암호문 같은 글자가 나오는군요. 그런데 디코딩한 글자가 또 40글자입니다. sha1의 특징이므로 한번 더 인코딩 해 줍시다.

test라는 문구가 나오는군요. 아무래도 정답인 것 같습니다. 입력해 봅시다.

test가 정답이었네요. 인코딩 순서가

test - sha1 인코딩 - sha1 인코딩 - base64인코딩 이런 순서였습니다.

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



'Webhacking' 카테고리의 다른 글

webhacking 16번 문제  (0) 2015.10.13
webhacking 14번 문제  (0) 2015.10.13
webhacking 6번 문제  (0) 2015.10.12
webhacking 15번 문제  (0) 2015.10.12
webhacking - 26번 문제  (0) 2015.10.02
Posted by englishmath
,

webhacking 6번 문제

Webhacking 2015. 10. 12. 21:54

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

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

phps라는 소스파일이 있습니다. 확인해 봅시다.


소스 한번 더럽게 기네요. 일단 solve부분을 보시면 decode_id의 값이 admin이고 pw 값이 admin이면 문제가 해결된다는군요. 

현재 화면에 출력된 부분을 보시면 ID는 guest이고 PW는 123qwe 라고 출력되 있는 것을 알 수 있습니다. 그리고 소스를 보시면 현재 출력된 ID와 PW는 decode_id와 decode_pw를 20번 디코딩한 값이라고 볼 수 있습니다. 그리고 decode_id와 pw는 쿠키값 user과 password에서 받아오는 것을 알 수 있습니다.

우리는 decode_id와 pw가 admin이 되도록 해줘야 하므로 거꾸로 올라가도록 해주면 됩니다.

$decode_id=$_COOKIE[user]; 
$decode_pw=$_COOKIE[password]; 

$decode_id=str_replace("!","1",$decode_id); 
$decode_id=str_replace("@","2",$decode_id); 
$decode_id=str_replace("$","3",$decode_id); 
$decode_id=str_replace("^","4",$decode_id); 
$decode_id=str_replace("&","5",$decode_id); 
$decode_id=str_replace("*","6",$decode_id); 
$decode_id=str_replace("(","7",$decode_id); 
$decode_id=str_replace(")","8",$decode_id); 

$decode_pw=str_replace("!","1",$decode_pw); 
$decode_pw=str_replace("@","2",$decode_pw); 
$decode_pw=str_replace("$","3",$decode_pw); 
$decode_pw=str_replace("^","4",$decode_pw); 
$decode_pw=str_replace("&","5",$decode_pw); 
$decode_pw=str_replace("*","6",$decode_pw); 
$decode_pw=str_replace("(","7",$decode_pw); 
$decode_pw=str_replace(")","8",$decode_pw); 


for(
$i=0;$i<20;$i++) 

    
$decode_id=base64_decode($decode_id); 
    
$decode_pw=base64_decode($decode_pw); 

최종으로 디코딩된 값이 admin이어야 하므로 디코딩하기전의 decode_id는 admin을 인코딩한 값이어야 합니다. for문을 이용해 20번 디코딩을 하므로 decode_id엔 admin을 20번 인코딩한 값이 들어가야 합니다. decode_id는 user pw는 password에서 입력받으므로 admin을 20번 인코딩하여 그값을 쿠키 user과 password에 넣어 봅시다.

hint에서 base64가 적혀있었으므로 base64로 인코딩 해 봅시다.

홈페이지에 보시면 base64 인/디코딩 하는 버튼이 있습니다. 체크 된 버튼이 인코딩이므로 20번 눌러서 20번 인코딩 해 줍시다.

인코딩이 완료되었습니다. 이걸 각각 쿠키값 user와 password에 넣어봅시다.

소스 도중에 str_replace라는 치환함수가 있어서 걱정하실텐데 인코딩된 문구를 보시면 !나 @같은 특수기호가 없기 때문에 있으나 마나합니다. 그냥 무시하고 합시다.



체크버튼을 누르시고 새로고침을 합시다.

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


'Webhacking' 카테고리의 다른 글

webhacking 14번 문제  (0) 2015.10.13
webhacking 4번 문제  (0) 2015.10.13
webhacking 15번 문제  (0) 2015.10.12
webhacking - 26번 문제  (0) 2015.10.02
webhacking - 18번 문제  (0) 2015.10.02
Posted by englishmath
,

webhacking 15번 문제

Webhacking 2015. 10. 12. 21:05

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

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


?????? 들어가니까 바로 접근 거부라면서 팅겨져 나갑니다. 

그런데 팅겨져 나갈때 얼핏 보니까 패스워드 어쩌구 저쩌구 적혀있는 것을 보실 수 있습니다.

이런건 그냥 간단하게 노가다식으로 봐서 풀어도 됩니다만 그래도 명색이 문제니까 조금 다른 방법으로 풀어봅시다.

인터넷 오른쪽 상단의 막대기 버튼을 눌러 크롬 설정 창으로 갑시다.

누르면 나오는 탭에서 하단쪽의 고급 설정 표시를 눌러 줍시다.

누르셨다면 뜨는 부분에서 콘텐츠 설정을 누릅시다.

누르면 나오는 창을 보시면 자바스크립트 쪽이 보입니다. 예외관리를 눌러줍시다.

예외관리를 누르면 뜨는 창에서 아까 접근거부됐던 15번 문제 주소를 추가하고 동작을 차단이라고 적어줍시다. 다됐으면 완료버튼을 누릅시다.

그리고 바로 15번 주소를 입력하고 엔터를 칩시다.

그다음 개발자 도구를 봐주시면 느긋하게 패스워드를 확인 할 수 있습니다.

off_script이군요. 입력하러 가 봅시다. 물론 패스워드를 확인했다면 크롬설정을 원래대로 해주셔야 합니다. challenges - Auth로 가서 인증합시다.

문제가 해결된 것을 볼 수 있습니다.

점수가 짠 이유가 있었습니다.

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

'Webhacking' 카테고리의 다른 글

webhacking 4번 문제  (0) 2015.10.13
webhacking 6번 문제  (0) 2015.10.12
webhacking - 26번 문제  (0) 2015.10.02
webhacking - 18번 문제  (0) 2015.10.02
webhacking - 60번 문제  (0) 2015.09.25
Posted by englishmath
,

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

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

심플하군요. 한 번 눌러봅시다.

굉장히 간단한 소스입니다. id의 값이 admin이면 문제가 해결된다는군요. 그런데

앞의 eregi함수를 보시면 get[id]에서 admin이란 문자열이 보이면 함수가 종료된다고 하는군요. 그러면 admin을 다른 형태의 값으로 넣어줄 필요가 있습니다.

그런데 if문 위쪽을 보시면 id에 urldecode(get[id])를 저장한다는군요. urldecode는 해당문자열을 url디코딩하는 함수입니다. 그러면 뭐.. admin을 url인코딩한 값을 id에 넣어주면 urldecode에 의해 admin으로 바뀔거고 그러면 문제가 해결됩니다.

url 인코딩 표를 이용해서 admin을 바꾸면 %61%64%6D%69%6E가 됩니다. 넣어줍시다.

이런 eregi에 의해 막혔습니다. 분명 eregi가 urldecode함수보다 앞에 있기 때문에 urldecode에 의해 admin이 된다 하더라도 eregi가 잡아낼 수는 없습니다. 그렇다면 가능성은 하나이죠.

자동으로 %61%64%6D%69%6E가 디코딩 됐다는 것입니다. urldecode에 의해서가 아닌 그냥 자동으로 디코딩이 되버렸기 때문에 eregi에 의해 막힌 것이지요. 

인터넷에서 알아보니 원래 웹 서버와 브라우저 사이에서 데이터 교환시 브라우저는 폼에서 입력받은 데이터를 자동으로 인코딩한 값을 PHP로 보내고 PHP는 받은 인코딩된 값을 자동으로 디코딩하게 된다는 군요.

그렇다면 답은 나왔습니다.

%61%64%6D%69%6E를 한번 더 인코딩 하는 것이지요. 그러면 자동으로 디코딩이 되어도 

%61%64%6D%69%6E가 될 것이고 eregi에 걸리지 않게 된 후 urldecode에 의해 디코딩이 되어 admin이 될 것입니다.

인코딩 하러 가 봅시다. 구글에서 사이트를 찾아 인코딩 해 봅시다.

%2561%2564%256D%2569%256E가 나왔군요. id에 넣어 봅시다.

엔터를 치시면

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


'Webhacking' 카테고리의 다른 글

webhacking 6번 문제  (0) 2015.10.12
webhacking 15번 문제  (0) 2015.10.12
webhacking - 18번 문제  (0) 2015.10.02
webhacking - 60번 문제  (0) 2015.09.25
webhacking - 20번 문제  (0) 2015.09.25
Posted by englishmath
,

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

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


sql injection 문제이군요. 밑에 보시면 index.phps가 있습니다. phps가 php source 의 약자인것은 전부 아시지요? 한번 눌러 봅시다.

소스를 차례대로 분석해 봅시다.

일단 첫줄을 보시면 no를 get형식으로 입력받아야 소스가 실행되는 것을 알 수 있습니다.

그리고 eregi를 사용해 no를 입력받았을 때 no값에 

공백,/,\(,\),\t,|,&,union,select,from,0x 이러한 값들이 있을 경우 exit에 의해 함수가 실행이 되지 않고 종료된다는 것을 알 수 잇습니다.

그다음은 mysql함수를 사용하여 id가 guest이고 입력받은 no값과 일치하는 id를 검색하여 q라는 변수에 저장하는 것을 알 수 있습니다.

그렇다면 no가 무엇일까요?


개발자 도구를 이용해 확인을 하시면 문제의 입력칸의 이름이 no인것을 확인할 수 있습니다. 그리고 from method가 get으로 설정되있는 것을 보아 get형식으로 입력받는 다는 것을 알 수 있습니다.

위에 나온 sql함수와 php함수는 블로그항목에 게시되어 있으므로 자세히 알고 싶으시면 참고하시기 바랍니다.

그다음 소스를 봅시다.

if($q[0]=="guest") echo ("hi guest"); 
if(
$q[0]=="admin"

@solve(); 
echo (
"hi admin!"); 

q[0]가 게스트이면 hi guest를 출력하고 admin이면 문제가 해결된다고 나와 있습니다.

일단 테이블을 예상해봅시다.

id                                 no

admin                            ?

guest                             ?

대충 이렇게 되겠군요. 

그런데 우리는 no값을 모릅니다. 그래서 일단 무차별대입으로 한번 숫자를 입력해보겠습니다.

1을 입력하니 hi guest가 나오는 것을 볼 수 있습니다. 즉 id가 guest이고 no값이 1인 id를 검색했는데 guest가 나왔다는 것이지요.

테이블을 고쳐봅시다.

id                                 no

guest                             1

admin                            ?

만약 id가 guest하고 admin밖에 없다면 admin의 no값은 2일 확률이 큽니다. admin을 뽑아내봅시다. 

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

여기 위의 소스를 보시면 조건에 id가 guest 이고.... 라고 되어 있습니다. 우리는 admin을 뽑아내야 하는데 id가 guest이면 no값이 얼마든 뽑아낼수가 없습니다.  그래서 이 조건을 무효화 시켜줄 필요가 있습니다. no값에 0 or no=2을 넣어 봅시다.

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=0 or no=2")); 

이렇게 되면 id가 guest이고 no값이 0인 id를 찾거나 no값이 2인 id를 찾으라는 뜻이됩니다. 왜 이렇게 되냐면 sql연산은 and>or순이기 때문에

(id='guest' and no=0) or no=2 이렇게 되기 때문이지요.

admin의 no값이 2라는 가정하에 정답은 0 or no=2가 될 수 있겠군요.

단 eregi에 의해 no값에 공백이 있으면 함수를 종료하기 때문에 공백을 우회해줄 필요가 있습니다. 공백을 우회하는 방법으로는 /를 이용한 주석이나 \t, \n 등이 있습니다.하지만 /와 \t는 eregi에 의해서 막힘으로 \n을 써봅시다.

그런데 \n을 직접 폼에 입력하여 전송하면 \따로 n따로 url 인코딩이 되어버립니다. 그래서 \n을 같이 인코딩한 %0a라는 값을 직접 주소창에 적어주셔야 합니다.

get방식으로 입력받기 때문에 주소창에서 적어주실 수 있습니다.

단 적기전에 ?를 붙여주시고 no값을 넣어주시면 됩니다.

즉 주소창에 no=0%0aor%0ano=2를 입력해봅시다. 

admin의 no값이 2가 맞은 모양입니다. 문제가 해결되었군요.

아 참고로 저는 no=2%0aor%0ano=2를 입력해서 문제를 해결했습니다.

앞의 no값은 어차피 거짓으로 만들기 위한거기 때문에 1을 제외한 그 어떤 값을 넣어줘도 문제가 해결됩니다. 

다만 1을 넣으면 앞의 조건도 참이 되버리기 때문에 guest와 admin이 둘다 불러오게 됩니다. q[0]이기 때문에 먼저 받아온 guest부터 저장이 되어버리기 때문에 문제를 해결 할 수 없습니다. 만약 소스에 q[1]이라고 되어있었다면 얘기는 달라졌겠군요.

암튼 이것으로 문제해결을 마치겠습니다.


'Webhacking' 카테고리의 다른 글

webhacking 15번 문제  (0) 2015.10.12
webhacking - 26번 문제  (0) 2015.10.02
webhacking - 60번 문제  (0) 2015.09.25
webhacking - 20번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
Posted by englishmath
,

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

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

 

들어가자마자 접근거부라고 나오는군요. 초대받지 못한 손님인 것 같습니다.

밑에 index.phps가 나와있네요. 눌러 봅시다.

첫문자를 보시면 sleep(1);가 적혀있습니다. sleep은 지연시키는 함수로 1이라고 적혀있으므로 1초를 지연시킨다는 소리입니다. 즉 1초가 지나고 다음 함수를 실행시킨다는 것이지요.

그 다음 첫 if문을 보시면 eregi가 나와있습니다. eregi는 문자를 찾는 함수이지요. COOKIE(PHPSESSID)에서 0~9까지의 숫자가 나올 경우 접근 거부를 출력한다는군요.

즉 COOKIE PHPSESSID에 숫자가 없어야 접근거부가 안뜬다는 것입니다.

그다음 if문을 보면  mode 값이 auth일 경우 Auth~ 란 문구를 출력하고 f에 readme/세션[id].txt를 저장시킨다는군요. 앞에 file()함수가 있으므로 파일을 배열로 읽어 들입니다.

그다음은 for문을 이용해 result에 .txt의 내용을 저장시키고 그 밑의 if문에서 세션[id]의 값이 result에 있으면 Done를 출력하고 unlink를 호출해 .txt파일을 삭제합니다. 그리고 문제가 해결된다는군요.

자 그러면 한번 해봅시다. PHPSESSID에 숫자가 없어야 하므로 숫자를 전부 지워봅시다.

 쿠키값에 있는 숫자를 다 지우고 새로고침을 하면 로그인을 하라고 합니다.

그래서 다시 로그인하고 60번 문제로 들어가면 아래와 같은 화면이 나옵니다.

자 이제 여기서 문제해결을 위해  mode에 auth를 넣어 봅시다.

Auth가 출력되었는데 Done가 출력되지 않았다는 것은 clear문의 if문이 참이 되지 못했다는 뜻입니다. 원래라면 당연히 참이 되야 하는 조건인데 참이 되지 못했다는 것은 .txt파일이 없어 result에 저장이 되지 않았다는 것으로 봐야 합니다.

소스문을 다시 봅시다.

클리어문의 if문을 제외하면 밑에 또 소스가 있는 것을 볼 수 있습니다.

위에 if문은 mode에 auth 값이 들어가 있을 때 실행하는 if문

밑의 문은 mode에 auth값이 없을 때 실행하는 문구인 것 같습니다.

보시면  fopen과 w를 이용해 .txt파일을 만들어서 f에 저장시키는 것이 보입니다.

그다음은 fwrite를 이용해 f에 저장된 내용을 세션[id]에 저장시킵니다.

그 다음을 보시면 if문이 있습니다.

ip주소가 다음과 다를 경우 1초의 지연시간을 주고 파일을 삭제시킨다는 군요.

그러면 이 파일이 삭제되기전에 클리어의 if문을 실행시킬 필요가 있습니다.

쿠키값을 수정시켜 들어오는 순간에 if문이 실행되므로 두 익스플로러를 띄워 하나는 파일 생성용 하나는 문제해결용으로 만들어줍시다.

서로의 쿠키값은 달라야 하므로 서로 다른 브라우저를 써 봅시다. 익스플로러와 크롬을 사용해봅시다.

크롬은 쿠기에디터를 사용해서 쿠키를 바꿀수 있고 익스플로러는 쿡시툴바를 이용해서 바꿀 수 있습니다. 일단 쿡시툴바를 다운받아 봅시다.

쿡시를 다운받으셨으면 익스플로러를 열어 오른쪽상단의 톱니바퀴를 눌러 추가 기능 관리로 들어갑니다.

그러면 아래와 같은 창이 뜹니다.

다운 받은 쿡시 툴바를 사용하기 위해 하단의 사용 함 버튼을 눌러주세요. 그리고 창을 닫아주시면 주소창 아래에 쿡시툴바가 보입니다. 자 이제 익스플로러 문제페이지를 들어가봅시다.

들어가셨으면 쿡시툴바의 맨 오른쪽의 edit 버튼을 눌러 쿠키값을 수정해 줍시다.

문자로만 들어가도록 바꿔줍시다.

다시 로그인을 하고 들어오시면 hi가 보이실 것입니다. 그리고 주소창에?mode=auth를 미리 써줍시다. 엔터는 아직 치지 마세요.

지금 접속됨으로써 text파일이 생성되고 지워졌을 겁니다.

여기까지 되셨으면 이번엔 크롬으로 들어갑시다.

쿠키값을 다르게 설정해줍시다.

설정 후 다시 로그인을 하셔서 들어오시면 hi가 뜹니다.

자 이제 익스플로러 hi와 크롬 hi가 있을 것입니다. 자 그리고 아까 익스플로러에 적어 놓은 ?mode=auth를 엔터친 후 바로 크롬 홈페이지를 새로고침 합니다. 이것을 반복합니다.

좀 하다 보시면 아래와 같이 뜹니다.

이번 문제는 레이스컨디션을 이용해서 푸는 문제였군요.

레이스 컨디션이란 쉽게 말하면 프로세스가 경쟁하는 것을 말합니다. 프로세스가 여러번 실행되는 과정에서 실행 순서가 뒤바뀌는 것을 말하지요.

즉 이번 문제를 보시면 

파일 생성 - sleep - 파일 삭제 순으로 코드가 작성되어있었지요? 이것도 하나의 프로세스작업입니다. 그런데 이러한 작업을 여러번 실행하다보면 원래라면

파일 생성 - sleep - 파일 삭제 - 파일 생성 -sleep - 파일 삭제 가 되어야 합니다.

하지만 레이스 컨디션에 의해 

파일 생성 - sleep  - 파일 생성 - sleep - 파일 삭제 가 될 수 있습니다. 물론 매번 시도할때마다 실행 순서는 다릅니다.

우리의 목표는 이러한 작업을 여러번 실행시켜서 파일 삭제를 늦추고 그 사이에 mode에 auth를 대입해 문제를 푸는 것이었습니다.

그렇다면 의문점이 하나 생기실겁니다. 쿠키값을 왜 바꾸고 했는지 말입니다.

동일한 쿠키값으로 두 행위를 하면 두 행위가 아닌 하나의 행위로 인식됩니다.

우리는 파일삭제를 늦추는 행위와 mode에 auth를 넣는 행위 즉 두 행위를 해야하는데 하나의 행위만 인식되면 문제를 풀 수가 없습니다.

브라우저를 다르게 한 것도 쿠키값을 서로 다르게 하기 위함이였습니다.

사설이 조금 길었네요. 이것으로 문제풀이를 마치겠습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 26번 문제  (0) 2015.10.02
webhacking - 18번 문제  (0) 2015.10.02
webhacking - 20번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
Posted by englishmath
,