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

홈페이지로 들어가 33번 문제를 눌러주세요.


음? 주소가 떠있군요. 한번 눌러봅시다.

음 ... solve가 없군요. 일단 if문을 하나 봅시다. $_GET[get]의 값이 "hehe"이면 a href =어딘가로 이동된다는군요. get이 따로 없기 때문에 주소창에 입력해줍시다. 앞서 한것처럼 변수를 주소창에 적을때에는 ?를 붙여줘야 합니다.

Next가 새로 생겼습니다. Next를 눌러주세요.

?? 원래대로 돌아왔다? 아 근데 자세히 보니 아까는 33-1이었는데 지금은 33-2입니다. 그리고 링크 주소도 바꼇네요. 바뀐 링크주소를 눌러봅시다.

이번에도 post에 hehe를 넣어야 되나 봅니다.

그런데 여기서 주의할점은 post변수의 형식이 $_POST입니다. 그럼$_POST가 뭘까요? 

원래 데이터를 HTML에서 다른 페이지로 전송할때 두가지 방식이 있습니다.

POST방식과 GET방식이죠. GET일 경우 편하게 주소창에 입력하면 되지만 POST는 조금 까다롭습니다. 일단 문제페이지에서 개발자 도구를 실행해 주세요. 그리고 아래그림처럼 Edit as HTML을 눌러주세요.


그리곤 다음과 같이 입력해 주세요.

이렇게 적어주시면


다음과 같은 칸과 버튼이 생깁니다. 해석을 하자면

1. <form method="post" action="lv2.php">

일단 <form>은 HTML 문서에서 사용자의 입력을 서버로 전달하는 기능을 합니다. 우리는 저런 칸을 만들어야 하므로 당연히 이 내용이 서버로 전달되어야 하는거지요. 그리고 method는 용자 데이터를 넘겨주는 방식을 정하는 겁니다. 아까 말씀하다시피 GET과 POST가 있는데 우리는 POST를 해야하므로 post로 정했습니다. action은 이 입력한 데이터를 처리할 URL주소입니다. 현 문서가 lv2.php 이므로 적어줬습니다.

2. POST<input type="text" name="post">

앞의 POST는 말그대로 화면에 출력될 POST 글자 그 자체구요. 그다음에 쓰인 <input>은 웹브라우저 화면에 사용자 정보 입력 형식을 표시할때 쓰입니다. type=text 즉 종류는 텍스트 입력이며 name(이름)은 변수를 뜻하며 앞서 문제에 적힌 변수 post를 입력합니다.

3. POST2<input type="text" name="post2">

2번이랑 똑같습니다.

4. <input type="submit" value="Submit">

type=submit 는 종류가 submit라는 것으로 submit는 입력한 데이터를 전송하는 버튼을 만든다라는 뜻입니다. value(값)는 말 그대로 버튼의 값이라는 것으로 화면상에 표시할 버튼이름이라 보시면 됩니다.

5. </form>

다 끝났으면 슬래시를 붙여 끝냈음을 알립니다.


자 이제 칸이 생겼으니 거기에 그대로 적어주시면 됩니다. post값은 hehe 그리고 post2의 값은 hehe2입니다. 넣어주시고 submit를 눌러주세요. next가 나오셨으면 눌러서 다음문제로 갑시다.


후 눌러봅시다.


변수이름이 myip이군요. 마이 아이피... 주소창에 자신의 ip 주소를 넣으면 될 것 같습니다.


엔터~

음? 일단 hint가 있네요. 상당히 어려운 문제 인것 같습니다. 일단 눌러봅시다.


소스를 보니 password에 md5(time())란 값을 넣어야 되네요. md5란 base64와 같은 디인코딩 도구입니다. 그리고 안에 time이 적혀있는 걸로 보아 time을 md5로 인코딩하라는 뜻 같습니다. 그리고 밑에 힌트는 time이라고 적혀있습니다. time은 시간인데 .. 일단 뒤로가기를 눌러 힌트를 다시 봅시다.


??? 뭔가 달라졌습니다. hint값이 달라졌네요. 아무래도 여기 hint는 시간을 나타내는 걸 수도 있습니다. 새로고침을 연타로 해봅시다. 아무래도 점점 증가하는 걸로 보아 시간이 확실한것 같습니다. 그러면 이 값을 md5로 인코딩을 해줄 필요가 있겠습니다. 그런데 문제는 시간은 멈추지 않고 계속 흘러간다는 것입니다. 만약 현재시간에 딱 맞추어서 값을 보낼려면 미리 힌트의 값을 몇십초 더해서 값을 찾은다음 그 값이 나올때까지 계속 엔터를 연타해야 합니다. .... 암튼 현재시간을 잽시다. 그리고 잰 시간에 100정도 더해줘서 md5인코딩을 해주시면 됩니다.

md5는 저는 http://www.mimul.com/examples/dencoder/에서 했습니다.


엔터를 눌러줍시다.

성공하셨나요? 그런데 전 연타를 너무 많이해서 실수로 1초 지났는데 값을 넣어버리고 말았습니다. ..... 타이밍에 맞춰 한번만 엔터칩시다..


결국 다시 해서 성공했습니다.

아아아아 왤케 많죠 대체... 누릅시다..


ㄷㄷ 가장 무서운 소스가 보이는 군요.. 여러분은 아시겠나요?

echo("<a href=###>Next</a>"); 아직 끝이 아니라는 거지요.. 어우 싫다.

암튼 변수가 3개 나오는군요. GET, POST, COOKIE 크 정말 다양하게 나왓습


니다.

값이 없는 걸로 보아.. 아무래도 아무값이나 넣어도 될것 같군요. 간단하게 1로 합시다.

일단 쿠키값부터 새로 만들어봅시다 쿠키모양그림을 눌러 관리자로 들어갑시다. 들어간후 +버튼을 눌러 새쿠키 만들기로 들어갑니다. 이름은 imcookie로 하고 값은 1로 줍시다. 그리고 체크버튼을 눌러주세요.

네 만들어졌습니다.

이제 GET변수와 POST변수를 만들어야 합니다. 그런데 둘다 방식이 다르니 따로 만들수 밖에 없습니다. 그런데 따로 따로 보내면 초기화가 되버리기 때문에 한꺼번에 같이 보내야 합니다. 간단합니다 GET변수가 그냥 주소창에 치기만 하면 되는 것이므로 POST를 보내기 위한 칸을 만들때 이렇게 만들시면 됩니다.

차이점이 뭔지 아시겠습니까? action의 값이 md555.php?imget=1입니다. 원래라면 md555.php만 보내야 하지만 우린 GET이랑 같이 보내져야 하므로 보낼 주소를 imget이 정해진 주소로 적으면 post를 보낼때 동시에 get이 정해진 곳으로 데이터가 날라가는 겁니다.

이제 값을 넣으시고 서브미트를 눌러봅시다.

아아아 제발..  일단 눌러봅시다.


$_SERVER[REMOTE_ADDR]의 값을 md5로 인코딩을 시켜 test에 넣고

$_SERVER[HTTP_USER_AGENT]의 값을 md5로 인코딩을 시켜 kk에 넣어라는 군요.

일단 $_SERVER[REMOTE_ADDR]은 자신의 컴퓨터의 ip주소를 가져오는 함수입니다. 그러면 한번 해봅시다.

먼저 자기 ip주소를 md5 인코딩을 합니다. 그리고 인코딩된 글자를 쿠키값에 넣어줍시다.

없기 때문에 새로 만들어주시면 됩니다.

마지막으로 체크 버튼을 눌러주세요.

자 이제 만들어졌으면 Hint쪽을 봐주세요.

$_SERVER[HTTP_USER_AGENT]의 값을 md5로 인코딩을 시켜 kk에 넣어야 하는 데

$_SERVER[HTTP_USER_AGENT]의 값이 hint이므로 저 hint를 인코딩 시키면 될 것 같군요.

인코딩을 완료하였으면 또...post상자를 만들어 값을 넣어줍시다...(개발자도구)


클 to the 릭 합시다.


끝이란 무엇인가.... 하하하하하하하  암튼 눌러주세요.


앞서 한 $_SERVER[REMOTE_ADDR]가 나오네요. 또 자기 ip주소를 받는 것 같습니다.

그런데!!! str_replace 함수가 있습니다. 이 함수는 어떤 문자를 대신 바꿔준다는 함수입니다.

저기서는 .이 나왔네요. 그런데 그 .을 그다음껏으로 대신한다. 즉 .을 공백으로 바꾼다라는 소리입니다. 


즉 해석하면 $_SERVER[REMOTE_ADDR]에는

str_replace 한 $_SERVER[REMOTE_ADDR]값을 저장시켜라. 그리고 저장시킨 $_SERVER[REMOTE_ADDR]값이 입력받은 $_SERVER[REMOTE_ADDR]값이랑 같을 때 next를 출력한다. 다 좋은데 왜 next를 보내는지...

str_replace로 인해 .이 없어진 값이 저장이 되므로 자기 주소에서 .을 뺀 값을 넣어주시면 됩니다. 형식은 이렇게 적으셔야 합니다.


123456789123은 자신의 ip주소입니다.

자 그럼 엔터를 쳐주십시오.

껄껄껄껄껄 진짜 드럽네요. 눌러주세요.

어우 굉장히 간단한 문제네요. addr이 127.0.0.1이 되어야 한답니다. GET로 받았으니 얼릉 치고 넘어갑시다.



후.. 10문제 채울 삘이군요.. 눌러주세요.

딱봐도 answer의 값을 알아야 됩니다. for문부터 해석해봅시다.

i의 값을 97로 주고 i<=122 가 거짓이 될때까지 반복한다.(즉 참이면 실행한다) 한 반복이 끝나면 i값에 2를 더한다. 자 그리고 그다음은 ch=chr(i)가 있군요. ch란 변수에 chr(i)를 넣어라

그런데 여기서 chr이란 아스키코드값을 문자로 변환시켜준다는 함수입니다. 즉 처음 for문을 실행할때 i의 값 97에 해당되는 문자로 변환시켜 저장한다는 말입니다. 그리고 answer=ch , 이 저장된 문자 ch를 answer에 넣어라. 이것을 i<=122가 거짓이 될때까지 반복한다는 것입니다. 그러면 i가 97부터 시작해 97,99,101,103,105,107,109,111,113,115,117,119,121까지 반복하고 이러한 값들을 문자로 변환시켜 answer값에 저장시켰으니 위의 숫자값을 문자로 바꾸어 그대로 대입하면 끝나겠네요.

아스키코드 표는 인터넷에 널려있습니다.

다 변환시키면 acegikmoqsuwy란 값이 나옵니다.

엔터누릅시다.

아니? 늘 보이던 wrong이 없습니다. 크 드디어 마지막 문제인것 같네요. 기쁜 마음으로 눌러봅시다.


아아아아 마지막 문제 답게 가장 어렵고 가장 치사한 소스입니다. 일단 solve가 없으니 곱게는 못해결하겠구요. 처음부터 차근 차근 해석해 봅시다.

1.  $ip=$_SERVER[REMOTE_ADDR]

자신의 ip주소값을 ip란 변수에 넣습니다. 여기까진 쉽네요.

2.  for($i=0;$i<=strlen($ip);$i++)
   {
   $ip=str_replace($i,ord($i),$ip);
   }

for문이군요. 해석하면 i란 변수를 선언하고 0의 값을 넣었습니다. 그리고 i의 값이 strlen($ip)보다 작거나 같을 경우 밑의 내용을 실행합니다. 물론 반대로 i값이 strlen($ip)보다 커지면 이 함수는 실행되지 않습니다.

즉 i값이 strlen($ip)보다 커질때까지 함수를 반복해서 실행한다는 뜻입니다.

그리고 여기서 strlen($ip) ip값의 길이를 의미합니다. 만약 ip값에 123이 들어가 있다면 strlen($ip)의 값은 3인것이지요. 그리고 그뒤의 i++은 이 함수가 한번 실행되고 난후 매번  i값을 1 더해줘라는 것입니다. 그럼 i의 값이 strlen($ip)보다 작거나 같을 때 뭘 실행하라는 걸까요? 밑에 보시면 $ip=str_replace($i,ord($i),$ip); 라고 되어있군요. replace는 앞서 많이 봐왔듯이 대신하는 함수입니다. 그럼 뭘 대신하냐? ip변수의 값에서 i의 값을 ord(i)로 대신하라고 되어있네요. ord는 문자열의 첫번째 문자에 해당하는 아스키코드값을 리턴해주는 함수입니다.

 즉 해석하면 i의 값의 문자열을 아스키코드값으로 대신해서 그걸 다시 ip에 저장시켜라 라는 뜻이네요.

이제 for문을 끝냈으면 ip의 값에는 아스키코드값이 저장되어 있습니다. 다음걸 보죠.

3.$ip=str_replace(".","",$ip)

ip의 값에서 .을 없앱니다.

4.$ip=substr($ip,0,10);

substr은 문자를 추출합니다. 즉 ip변수에서 0번째부터 10개를 추출해서 ip에 저장하라는 소리입니다.

그런데 이제 여기까지 보니까 완전히 계산입니다. 즉 이러한것은 우리가 직접 계산해서 알아보는 것보단 컴퓨터한테서 계산시켜 우린 답만 알아내는 것이 더 좋은 것 같습니다. 저거 일일이 다할려 해보세요. 죽습니다...

그럼 우린 계산을 하지말고 어디서 패스워드를 보여주는지만 알아냅시다.

오 맨밑의 저런 문구가 보이는군요. 

fwrite($f,"Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR]")

write는 출력하다.... f는 파일의 약자... 즉 fwrite는 파일에 출력하다란 뜻이 되겠군요 그렇다면. Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR 이 값을 f란 파일에 출력시킨다네요 password를 f에 출력시킨다... 우림 그럼 f를 찾아야 합니다. 그위의 변수를 봐주시죠. 

$f=fopen("answerip/$ip/$answer.$ip","w")

open 열어라 f 파일을 어디서? answerip/$ip/$answer.$ip경로에서...라는 뜻입니다.

그런데 여기서 w가 거슬리는군요. w는 fopen에서 열 파일이 존재한다면 새로쓰기 전용으로 파일을 연다라는 뜻이고 열 파일이 존재하지 않다면 새로 만들라는 소리입니다. 그럼 경로값이 뭘까요?

@mkdir("answerip/$ip");

mkdir은 디렉토리를 만드는 함수입니다. 즉 answerip의 폴더안에 ip변수의 값을 가진 디렉토리를 만든다는 것이지요. 여기서 디렉토리란 워낙 뜻이 광범위하지만 그냥 간단하게 폴더라고 생각하시면 됩니다. @는 함수의 오류를 표시하지 않는다라는 뜻이구요. 자 그럼 이제 정리해 봅시다.


1. 우리는 지금 패스워드를 알아야 한다.


2. 패스워드는 f란 파일에 출력되어있다.


3. f파일의 경로는 answerip/$ip/$answer.$ip이다.


경로를 알기 위해서는 answerip/$ip/$answer.$ip의 값을 알아야 합니다. 그런데 우리는 멍청하니까 컴퓨터보고 계산하라 합시다.

http://webhacking.kr/pds/phppad/index.php 주소로 들어갑시다.

패드가 하나 보이지요?


이 좌쪽 편에 다음과 같이 입력해 주세요.

그대로 옮겨서 몇개만 변조해주었습니다. 일단 ip주소의 값을 자신의 ip주소로 바꾸고 이제 맨 마지막 부분을 다 짜르고 answer값을 출력하라는 명령어를 넣었습니다. 이로써 answer의 값은 구해졌구요.

ip도 구해졌습니다. 자 그럼 이제 어떡하냐구요? 다 끝났지요. 

아까 구할려는 경로 answerip/$ip/$answer.$ip에 대입만 해주시면 됩니다.

대입하면 answerip/5515510755/27577553775.5515510755가 되네요. 그대로 주소에 넣어줍시다.

엔터 눌러주시구요


이런 이런 그지 같은 패스워드가 나왔네요. 근데 이제 또 하나의 문제가 남죠. 이 값을 어디에 대입해야 하느냐? 여기선 변수가 안나왔습니다. 이런 경우가 앞의 문제에서도 있었죠? 

인증(auth)칸에 가서 입력해줍시다.


휴. 참 그지같은 문제였습니다. 암튼 문제풀이를 마치겠습니다. 감사합니다.

'Webhacking' 카테고리의 다른 글

webhacking - 56번문제  (1) 2015.07.19
webhacking - 47번 문제  (0) 2015.07.17
Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
Posted by englishmath
,