안녕하세요. 오늘은 웹해킹 56문제를 풀어보겠습니다.

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

음 보드가 하나 나오네요.일단 소스를 봅시다.

빨간색 부분을 보시면 HellSonic을 눌렀을때 어딘가로 이동된다는 군요. 그럼 한번 눌러 봅시다.

???? HellSonic이 아이디였나 봅니다. 순위는 2위이고.. 밑에 금액은 20이라 되있네요.

밑의 challenges를 눌러 봅시다.

HellSonic이 여태까지 푼 문제가 나오는군요. 진짜 많이 푸셨네요. 일단 얻을게 없으니 

뒤로 가봅시다. 이 challenges 말고 다른 버튼은 동작을 안합니다. 텍스트 칸처럼 보인 것도 눌러보니 입력이 안되더군요. 흠... 문제로 다시 돌아갑니다.

이 HellSonic 앞엔 Thanks to 가 나와있습니다. 즉 HellSonic한테 고맙다라는 인사를 한 것이지요. 제 생각엔 HellSonic이 문제출자자인것 같습니다. 문제를 내줘서 고맙다라는 소리지요. 즉 실제문제와는 아무런 관계가 없다고 볼 수 있습니다.

다시 문제를 살펴봅시다.

subject쪽에 하이퍼링크로 되있는 글자가 두개 있습니다. 한 번 눌러 봅시다.

readme를 눌렀을때

hi~를 눌렀을 때..

guest 쪽은 hi라고 나왔지만 admin쪽은 접근 거부 라고 나오네요. 아무래도 이번 문제는 admin으로 접속하는 것 같습니다.

그 밑에 보시면 검색버튼이 있습니다. 음 뭘 검색하라는 걸까요? 그래서 보드에 있는 내용 전부를 닥치는 대로 입력해보았습니다. 그랬더니 3가지 경우를 찾을 수 있었습니다.

1. 검색한 값이 hi~일때

2. 검색한 값이 0일때


3. 그외의 나머지값일때

음 일단 주목할 점은 1번인것 같습니다. hi~를 검색했더니 guest가 나왔습니다. 대문자로 입력을 해도 똑같이 나오더군요. 대소문자 구별을 안하는 것 같습니다. 보통은 subject의 값으로 로그인 할 수 있을거라고 생각하겠지만 readme를 검색했더니 3번의 결과가 나왔습니다. 즉 이 검색창에 무언가를 입력해서 admin으로 접속 할 수 있도록 하는 것이 이번 문제인것 같습니다.

일단 guest의 hi~를 하나씩 나누어 검색해보았습니다. 그러자 i와 ~은 guest를 출력했는데 h하나만은 admin과 guest를 둘다 검색하였습니다. ?? 뭔가 이상해서 알파벳 전부를 하나씩 넣어보기로 했습니다. 하나씩 다 해보니 다음과 같은 결과가 나왔습니다.

k와 p를 넣었을때 admin이 출력되었습니다.

정리를 해보면 

admin : 0 h k p

guest : 0 h i ~ 

입니다. 그런데 곰곰히 생각해보니 hi는 특수문자가 들어갑니다. 혹시 admin도 들어가는지 시험하기 위해 모든 특수문자 ~!@#$%^&*()_+|-=\`<>?,./:";'{}[]를 다 넣어 보았습니다. 그러자 몇개를 더 알게 되었습니다.

admin : 0 h k p . % _ 이 하나라도 들어갈 경우 출력된다.

guest : 0 h i ~ % _ 이 하나라도 들어갈 경우 출력된다.

여기서 %는 어느 문자열에나 올 수 있기 때문에 제외시킵시다. 그리고 _는 임의의 숫자나 문자입니다. 다른 말로 어떠한 수나 문자가 될 수도 있다는 뜻입니다. 그렇기 때문에 _을 클릭하면 둘다 출력되는 것입니다. 

예를 들어 guest의 값이 hi~ 이면 검색창에 ___이 세개를 넣어도 guest가 검색이 됩니다.

그런데? ____이렇게 4개를 넣으면 guest의 값은 나오지 않습니다. 왜냐하면 guest의 글자수는 3개이기때문에 4자리가 오면 당연히 검색되지 않는 것이지요. 다들 여기서 눈치채셨겟지요? _를 이용하면 우리가 구하고자 하는 admin의 글자수를 알수 있습니다. ____부터 하나씩 늘려가며 검색을 해봐서 admin의 글자수를 봅시다.

_______부턴 admin이 검색되지 않습니다. 즉 admin은 6글자다 라는 추측이 나옵니다.

그러면  admin의 값은 ?????? 이군요. 지금부터 한자리씩 맞춰봅시다.

간단합니다. 여기서 0_란 말은 0으로 시작하는 임의의 수입니다. 만약 값이 00, 01 02 03 04 등, 자릿수가 맞고 0으로 시작하면 0_으로 다 검색시킬 수 있습니다. 그렇기 때문에 우리는 첫수를 알기 위해 0_____부터 ._____까지를 다 검색해봅시다. 딱 하나가 admin으로 뜨는군요.

그렇습니다. 첫자리는 k입니다. 첫자리수를 구하셧으면 반복해줍시다.

k0____ 부터 k.____까지 입니다. 참고로 반복된 문자가 있을 수 있습니다. 마찬가지로 하나가 뜨는군요. 두자리 수도 k입니다.

다시 kk0___ 부터 kk.___까지 검색합시다. 이것도 노가다네요.... 세번째 자리수는 .입니다. 

kk.0__부터 kk..__까지 검색합시다. 네번째 자리수는 p입니다.

kk.p0_부터 kk.p._까지 검색합시다. 다섯번째 자리수는 h입니다.

kk.ph0부터 kk.ph.까지 검색합시다. 마지막 자리수는 p입니다.

그렇다면 admin의 값은 kk.php입니다. 딱 봐도 주소군요. 문제 뒷자리에 적어줍시다.

엔터를 눌러주시면

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




'Webhacking' 카테고리의 다른 글

webhacking - 35번 문제  (0) 2015.07.29
webhacking - 32번 문제  (0) 2015.07.29
webhacking - 47번 문제  (0) 2015.07.17
Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 27번문제  (2) 2015.07.10
Posted by englishmath
,

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

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

음 무슨 뜻일까요? 일단 소스를 봅시다.

밑부분에 주석처리 되있는 부분이 보입니다. 문제인것 같으니 한번 확인해봅시다. 

음. 일단 if문부터 봅시다.

email의 값이 포스트 방식으로 전송되면 mail함수를 실행한다고 되어있네요.

mail은 말 그대로 email을 보내는 함수입니다. 형식은 다음과 같습니다.

mail("받는사람주소","제목","내용", 추가로 지정한 헤더정보);

즉 이 함수를 해석해보면 제목이 readme이고 내용이"password is $pass"인 메일을 admin@webhacking.kr이 받는답니다.

그런데 마지막에 있는 헤더정보가 신경쓰이는군요. 헤더란 여기서 추가옵션이라는 뜻입ㄴ;디. 여기선 header변수가 쓰였군요. header를 살펴봅시다.

$header="From: $_POST[email]\r\n"

From은 ~로부터 란 뜻이군요. 즉 보내는 사람인 것 같습니다. 보내는 사람의 주소는 $_POST[email]의 값이구요. 뒤쪽의 \r\n는 줄바꿈입니다.

음 정리하면 email의 값을 POST 방식으로 넣으면 패스워드가 admin@webhacking.kr로 보내진답니다. 그런데 우리의 메일주소는 admin@webhacking.kr이 아닙니다. 즉 email값에 어떤걸 넣어도 패스워드메일은 admin@webhacking.kr로 가기 때문에 패스워드를 볼 수 없습니다. 그러면 어떻게 해야 할까요?

지금 여기서 우리가 보낼 수 있는 값은 $_POST[email]의 값입니다. 그리고 $_POST[email]의 값은 header로 들어가고 header값은 mail로 들어가기 때문에 결국은 mail함수의 내용을 바꿀수 있다는 소리입니다. 하지만 위치로 봤을때 받는 사람의 주소를 바꿀 순 없습니다.받는 사람의 주소를 바꿀 수 없는데 우린 패스워드를 알아야 합니다.

그러면? 우리도 메일을 받을 수 있도록 해야 하지요. 그런데 그냥 $_POST[email]값을 주면 보내는 사람이 되버립니다. 우리는 받아야 하는데 보내는 사람이 되버리면 곤란하지요. 이때 문제를 다시 보시면 취약점을 공략할 수 있는 구문이라고 힌트를 주는군요. 취약점이라...

따로 검색을 해보니 메일을 보낼때 주의할 점으로 cc라는 말이 나오더군요. cc란 참조란 뜻입니다. 메일에서 참조는 뭔지 다들 아실겁니다. 받는 사람외에 참조로 또 다른 이메일주소를 적어주면 그 사람도 메일을 받는 것이지요. 호오.. 그런데 이것이 왜 취약점이냐구요?

메일을 보낼 때 받는 사람은 보낸 사람이 지정한 참조 주소도 같이 보게 됩니다. 예를 들어 설명하면 

A가 B에게 메일을 보내는데 C를 cc로 지정했습니다. 그래서 정리를 하면

1.B는 메일을 받습니다. 왜냐하면 A가 보냈으니까요.

2. C도 메일을 받습니다. 왜냐하면 A가 cc로 지정했기 때문입니다.

3.B는 A로부터의 메일을 받을때 A가 cc로 지정한 C주소도 함께 보게 됩니다.

4.B와 C는 서로 아는 사이가 아니인데도 불구하고 B는 C의 이메일 주소를 알게 됩니다.

이런 문제가 있습죠. 이런.. 너무 길어졌네요.

자 그러면 우리는 참조를 이용해서 꼽사리식으로 메일을 받아먹어 봅시다. 헤더를 수정하여 cc를 추가해야 합니다. 그렇게 되면 이렇게 되야겠지요. 

$header="From: abcde@naver.com\r\ncc: 자기id"; 이렇게 바꾸면 되겠네요.

우리는 $_POST[email]값만 바꿀 수 있으므로 $header="From: 뒤쪽부분만 써주시면 됩니다. 그러면 보냅시다.

문제에 있는 칸에 아까 형식을 입합시다. 참고로 줄바꿈 \r\c는 아스키로 변환하여 %0d%0a로 입력하셔야 합니다. 그리고 cc뒤에 입력하실 때 띄어쓰기를 해줘야 합니다. 그러면 입력합시다.

abcde@naver.com%5Cr%5Cncc: 회원가입때 입력한 자신의 이메일

보내는 주소와 cc를 같이 입력하실땐 줄바꿈을 해야 하는데 엔터가 안되므로 %0d%0a로 대체하였습니다.

앞의 주소는 아무주소나 써도 상관없습니다.

제출합시다.

?? 안됩니다. 틀린게 아니었는데 말입니다.

한참 삽질하다가 문제를 다시 보았습니다.

서버문제로 메일함수가 주석처리 되었답니다.

.......................................................

한마디로 밑의 메일칸은 낚시라는 소리입니다.

..............

mail함수가 맛이 갔으므로 다른 방법으로 email 값을 제출할 필요가 있습니다.

이번엔 파로스라는 프로그램을 사용해봅시다. 파로스란 http패킷을 수정할 수 있도록 도와주는 프로그램입니다. 우리는 $_POST[email]의 값을 줘야하는데 문제내에선 보낼 수 없도록 해놨으므로 프로그램을 이용하여 보냅시다. 파로스를 다운받아 실행시킵시다.

파로스의 기본화면입니다.

앞서 말씀했다사시피 http패킷을 수정하는 것이므로 http패킷을 잡아 줄 필요가 있습니다.

먼저 크롬이 아닌 익스플로러로 들어가 도구 - 인터넷 옵션을 눌러줍시다.

연결 - lan설정 - 프록시서버를 다음과 같이 설정해줍니다.

왜 프록시 서버를 설정할까요?

프록시란 데이터를 가져올 때 해당 사이트에서 바로 자신의 PC로 가져오는 것이 아니라 임시 저장소를 거쳐서 가져오는 것을 말합니다. 프록시 서버는 그 임시저장소를 의미하지요. 즉 데이터를 임시저장소에서 수정하여 수정한 것을 자기 PC로 가져올 수 있다는 것입니다. 프록시서버를 설정하였으면 아래와 같이 무언가가 잡힌 것을 알 수 있습니다.

아무래도 현재 활동한 사이트 같네요. 아 그리고 표시한 박스에 둘다 체크해주세요. 패킷을 강제로 잡기 위해서입니다. 요청과 응답을 둘다 하겠다는 뜻입니다.

자 이것이 끝났으면 웹해킹 문제 index.php쪽으로 가봅시다.

왼쪽부분은 여태까지 갔던 사이트 들입니다. 맨마지막에 웹해킹문제로 들어왔습니다. 조금 오래 걸릴 수 있습니다. 그런데 맨위쪽 보시면 GET방식이 보입니다. 우리는 POST방식으로 보내야 하는데 말입니다. 그래서 문제에서 아무거나 쓰시고 제출을 눌러서 다시 잡으세요. 그러면 아래그림처럼 POST가 뜰것입니다. 그리고 문구를 써주세요.

email=abcde@naver.com%0d%0acc: 자기id@naver.com 를 쳐주시고

하단의 continue를 눌러주시면 아래와 같이 뜹니다.

패스워드가 나왔군요. 그럼 이제 이 패스워드를 인증하러 갑시다.

auth에 입력해주시면


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

P.S 하드코딩으로 해놨기 때문에 실제로 메일이 오지않고 그냥 패스워드만 출력될 것입니다.

여기서 하드코딩이란 메모장 같은 간단한 프로그램으로 직접 하나하나의 코딩작업을 의미합니다.




'Webhacking' 카테고리의 다른 글

webhacking - 32번 문제  (0) 2015.07.29
webhacking - 56번문제  (1) 2015.07.19
Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
Posted by englishmath
,

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

안녕하세요. 이번엔 webhacking의 27번문제를 풀어보겠습니다.

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

SQL INJECTION란 문구와 밑의 제출칸이 나오는군요. 여기서 SQL INJECTION는 해킹기법중 하나입니다. 흠.. 일단 소스를 한번 봅시다.

24번 문제와 마찬가지로 주석처리 되있는 부분이 있습니다. 출처인것 같군요. 주소창에 index.phps를 적고 들어가 봅시다.

역시 이런 문제는 solve부터 봐야 합니다. 역시 앞에 조건문이 있군요. id의 변수값이 admin일 경우 문제가 해결된다고 하네요. 그런데 이 소스를 아무리 봐도 id는 보이지 않습니다. id가 어디있을까요? 일단 id의 앞푸분에 $q가 붙어있습니다. $q는 바로 위에 보이네요. 

$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");

딱 봐도 머리가 아파요. 꼭 영어문장 보는 것 같습니다. 일단 @는 수 실행시 발생하는 오류를 표시하지 않겠다는 뜻입니다. 참 너무하죠. 암튼 그다음 문장이 중요합니다. 

mysql_fetch_array 이 함수는 정말 간단하게 말하면 mysql_query()함수의 호출을 통한 결과값을 반환한다는 것입니다. 그럼 mysql_query()의 함수를 알아야겠죠? 

mysql_query()는 연결된 객체를 이용하여 MySQL 쿼리를 실행시키는 함수입니다. 즉 위문구는  mysql_query의 가로안의 문구를 쿼리형태로 실행시키라는 것입니다. 다음 문구를 보시면 select id from challenge27_table 라고 적혀있습니다. select는 mysql에서 찾아서 보여달라라는 명령어입니다. 뭐를? id를 어디서? from challenge27_table, 27번문제 테이블에서 id를 찾아 보여달라라는 의미입니다. 그 다음은 where이 나오는데 이는 조건이라고 보시면 됩니다. 즉 id='guest'인 and(그리고) no가 $_GET[no](입력받은 no값)인 id값을 27번문제 테이블에서 찾아서 보여달라는 소리입니다. 그리고 mysql_fetch_array에 의해 찾아서 보여준 id값을 반환하라 뭐 대충 이런 뜻이겠군요. 맨 뒤쪽 문구는 or(또는) die(실패했을경우) query error를 찾아서 보여준다. 라는 뜻입니다.

자 이제 정리하면 

1. 테이블의 이름은 문제27번 테이블이며 테이블의 칼럼(열)은 id와 no로 나뉘어져있습니다.

2. 아래 그림처럼 no는 ()가 있으므로 정수형을 담는 칼럼입니다.

no는 문제에 나와있는 박스의 이름이고 테이블의 시작은 0부터 시작하므로 0부터 차례대로 입력해봅시다. 

다른건 전부 쿼리 에러가 뜨는데 no값이 1일 경우에만 quest가 뜹니다. 위의 $q의 조건으로 봤을때 id가 guest인 no의 값은 1인것 같습니다. 하지만 우리의 목표는 id가 admin인 no의 값을 찾아내는 것입니다. 일단 소스를 다시 봅시다. no값은 정수형이고 테이블은 순서대로 존재하므로 no=0 admin no=1 guest 이거나 no=1 guest no=2 admin . 아마 테이블은 이 둘중 하나일 듯 싶습니다. 일단 첫번째 테이블이 맞다는 가정하에 no값을 조금 특수하게 적어보겠습니다. 

$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");

앞서 문제에 있는 SQL INJECTION은 ID 와 비밀번호를 넣는 공간에 ' 등의 특수문자를 집어넣어 sql문을 변조시키는 해킹기법중 하나입니다.위의 문구를 보시면 where id='?' and no=(?) or die() 형식으로 되어있습니다. 그런데 여기서 no값에 특수문자를 주면 어떻게 될까요? 예를 들어 no값에 0) 라고 값을 준다면 no=($_GET[no])"))의 값이 no=(0))"))라는 값이 되어 에러가 납니다. 닫는 가로가 하나 늘었기 때문이지요. 그런데? 만약 뒤가로를 주석처리 해준다면? no값에 0) -- 라고 값을 주면 no=($_GET[no])"))의 값이 no=(0) -- )")) 이렇게 되버립니다. 참고로 --는 주석처리하라는 명령어로 -- 뒤쪽의 문구는 주석처리가 되어 실제로 아무런 효과도 없어집니다. 즉 no=(0) 가 되버려 에러가 뜨지 않고 작동하는 것이지요.

자 그러면 이제 쿼리문을 변조해 봅시다.

where 다음의 조건은 id가 guest이고 no값이 (입력된 값)인 데이터를 찾아달라 라는 뜻인데 우리는 id가 admin인 no값을 찾아야 하므로 첫번째 조건 id='guest' and no=($_GET[no])는 절대 참이 될 수 없습니다. 그러면 이 첫번째 조건문을 건드려야 하는데 지금 우리 권한으론 건드릴수 있는 부분이 없습니다. 그러면 이제 두번째 조건을 볼까요?

or die("query error"); 만약 첫번째 조건에 맞지 않을 경우(실패) query error를 출력해라 . 이것을 건드려야 합니다. 근데 어떻게 건드리냐구요? 음 문구를 조금 뗴어오겠습니다.

no=($_GET[no])")) or die("query error"); 우리는 저 진한 부분만 건드릴 수 있습니다. 그런데 무슨 값을 넣어야 될까요? 우리는 첫번째 조건에 맞지 않기 때문에 두번째 조건을 바꿔줘야 합니다. 근데 두번째 조건 까진 손이 안닿습니다. 그러면? 당연히 직접 써야죠.

no값에 0) or no=0 라고 값을 줘봅시다. 그러면 no=($_GET[no])")) or die("query error")에서 no=(0) or no=0)")) or die("query error")가 됩니다. 그런데 or문은 두개가 올 수 없으므로 뒤쪽에 or문은 주석처리를 해줘 무효를 시켜줘야 합니다. 그러면 0) or no=0 -- 를 넣어서 뒤쪽의 문장을 무효화시키면 no=(0) or no=0 가 되버립니다. 그러면 이제 이 값을 입력해 봅시다. 참고로 --의 앞과 뒷부분은 뛰어쓰기를 해줘야 합니다.


??? 넣으니까 no hack 이란 문구가 나옵니다? 이상하군요. 소스를 확인해봅시다.

이 문구를 깜빡했군요. eregi함수의 형식은 (찾는문자열, 제시하는 변수) 이며 제시한 변수에 찾는 문자열이 있을 경우 다음과 같이 수행하라 라는 뜻입니다. 뒤쪽엔 exit no hack이라 있는걸로 보아 no hack을 반환한다는 군요. 그리고 찾는 문구에 =가 포함되어있습니다. 즉 아까 적었던 문구 0) or no=0 -- 에 =가 포함되어 있어 노핵을 출력한것 같습니다. 그러면 = 을 대신할 것을 적어줍시다. 여기선 like를 사용해봅시다. like는 조건이란 뜻으로 ~와 같은 이란 뜻을 가집니다. 예시로 no like 0이라고 한다면 0과 같은 no값 이란 뜻이지요. 결국 0이란 소리입니다. 자 이제 =을 뺴고 like를 넣어 적어봅시다.

제출 버튼을 눌러주세요.

아무래도 no=0 admin no=1 guest 은 아닌것 같군요. 그럼 두번째 예시 no=1 guest no=2 admin로 가봅시다. 2값이 admin이므로 2로 바꿔주시면 됩니다.

어차피 우리가 신경써야 할 부분은 or다음의 조건이기 때문에 or 앞에 0)은 사실 아무숫자나 와도 됩니다. 1) or no like 2 도 되고 2) or no like 2 도 되고 324) or no like 2 도 됩니다. 자 제출버튼을 눌러봅시다.

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

'Webhacking' 카테고리의 다른 글

webhacking - 47번 문제  (0) 2015.07.17
Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
Posted by englishmath
,

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

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

음 클라이언트 ip주소가 나오고 에이전트가 나오네요. 에이전트란 어떤 운영체제나 네트워크의 일부이며 그안에서 동작하는 시스템이란 뜻입니다. 그리고 그 밑에 틀린 IP주소라고 나오네요. 일단 소스를 봅시다. 모든 기본은 소스를 보는것부터 시작합니다.

해당 소스를 보시면 회원가입을 할때 봤던 초록색 주석부분이 있습니다.

source : index.phps라고 되어있군요. 소스는 우리말로 출처라는 뜻이므로 index.phps가 출처라는 뜻이군요. 출처를 확인하기 위해 아래 그림처럼 본 주소에 index.phps를 붙여주세요.

저는 바보라서 뭔소리인지 모르겠습니다. 이럴때는 solve()를 제일 먼저 찾는 것이 중요합니다. solve를 찾으니 앞에 조건이 하나 붙어있군요. ip주소가 127.0.0.1이면 문제를 해결한다 라고 되어있군요. 근데 문제에 나온 IP주소랑 값이 다릅니다. 이는 즉 IP주소값을 변환시켜야 할듯 하군요.

좀더 위를 보시면 if문이 하나 더 나옵니다. COOKIE에 REMOTE_ADDR의 값이 들어오면 ip의 값에 변환을 준다는군요. str_replace 함수가 쓰였습니다. replace는 대신하다 라는 뜻으로 첫번째 값이 있으면 그 첫번째 값을 두번째 값으로 대신한다 라는 함수입니다. 즉 해석하면 REMOTE_ADDR의 값에 12가 있으면 12를 " "로 대신하고 7.이 있으면 7.을 " "로 대신하고 0.이 있으면 " "로 대신하라. 라는 뜻이네요. 여기서 " "는 공백을 의미합니다. 그리고 ip주소는 REMOTE_ADDR의 값이 들어있으므로 REMOTE_ADDR의 값에 12, 7., 0.이 들어가있으면 전부 없애서 IP주소 값에 반환된다는군요.

자 이제 해석은 끝났고 문제를 해결해 보겠습니다. 

1. 우리는 127.0.0.1이란 값을 ip주소값에 넣어야 한다.

2. ip주소값은 곧 REMOTE_ADDR이다.

3. REMOTE_ADDR값의 12, 7., 0.이 들어가면 무효가 된다.

여기서 3번을 잘 보시면 12 , 7., 0.이 들어가면 무효가 된다 했는데 이것은 한번만 유효하는 겁니다. 즉 12127.0.0.1을 넣는다면 처음에 12는 없어지지만 두번째 12는 없어지지 않습니다. 즉 121이 반환되는 것이지요. 그렇다면 답은 나왔습니다. 총 두번씩 적어주면 됩니다.

121277..00..00..1 이렇게 적으면 하나씩 다 없애서 127.0.0.1이 나오겠군요. 자 이제 답은 구했습니다. 그러면 이제 이값을 REMOTE_ADDR에 넣어야 합니다. 그런데 어디에 있을까요? 앞에 COOKIE가 적혀있어 COOKIE Editor을 눌러보았습니다만 REMOTE_ADDR이름의 쿠키는 없었습니다. 이럴때에는 주소창에 직접 적어주셔야 합니다.

쿠키값을 변조시켜야 하므로 그냥 변수만 적으셔는 안되고 홈페이지에서의 함수 javascript양식에 맞추어 적어봅시다.

javascript:alert(document.cookie="REMOTE_ADDR=112277..00..00..1");

해석하면 javascript: = 자바스크립트 양식 , alert = 경로 , documnet.cookie = 쿠키를 기록하다, "REMOTE_ADDR=112277..00..00..1" = 쿠키를 이값으로 기록하겠다. 라는 뜻입니다.

주소창에 입력하셨으면 엔터를 쳐주시면 됩니다.

값이 넣어졌다는 군요. 창을 닫고 새로고침을 해주세요.

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

'Webhacking' 카테고리의 다른 글

Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 문제1번  (0) 2015.07.04
Posted by englishmath
,

안녕하세요. 이번엔 웹해킹 문제 11번을 풀어겠습니다.

http://webhacking.kr/ 에서 문제 11번에 들어가 봅시다.

음. 소스처럼 보이는 문구가 적혀있습니다. 일단 소스를 분석해봅시다. 그림은 삽입하지 못했습니다. 죄송합니다.

이번엔 소스에도 별 내용이 없습니다. solve 소스도 안보이는걸로 보아 평범하게 풀기는 힘든 문제인것 같군요. 일단 문제 11번에 적혀있는 소스를 해석해봅시다. 일단 if문부터 봅시다. preg_match함수가 쓰였군요. preg_match란 PHP에서 패턴이 일치하는 문자 혹은 숫자를 판단하기 위해서 사용되는 함수이며 preg_match(패턴, 비교할 변수) 형태로 사용됩니다. 음 그렇다면 저기서는 &pat가 패턴이고 &_GET[val]가 비교할 변수이겠군요.그리고 $_GET는 method = "get" 이란 의미로 설정된 폼으로부터 값을 수집하는데 사용하는 함수입니다. 저기에선 &_GET[val]라고 쓰였으므로 폼으로부터 val 값을 수집하라 라고 해석할 수도 있겠군요. 그럼 val값을 폼에 적어야 되겠군요. 폼으로부터 가져온 val값이 pat패턴과 일치하면 패스워드를 출력하라고 되있으니까요. 폼은 형식이란 뜻으로 여기에서는 주소형식이라는 뜻으로 해석합니다.

if문이 쓰인걸로 보아 만약 패턴이 일치한다면 패스워드를 출력하라 뭐 이런 소리군요. 그리고 if문 앞에 &pat가 있는 걸로 보아 패턴이 주어진 것 같습니다. 참고로 패턴을 만든다 이 소리는 정규식을 이용했다는 것입니다. 패턴을 만들기 위해서는 정규식에 맞춰 짜야하기 때문입니다.그럼 정규식에 맞추어 해석해 보겠습니다.

" " : 패턴을 만들때 들어가는 기본 형식입니다.

/ : 처음과 끝을 나타냅니다.

[] : 안에 존재하는 문자나 숫자 중 하나만을 나타내라는 뜻이며 []안의 -는 범위를 나타냅니다. 예를 들면 [a-z]는 a에서 z중 하나를 나타내라는 뜻이고 [1-50]은 1부터 50에서 하나를 나타내라는 뜻입니다.

{}= 앞에 있는 문자를 {}안의 개수만큼 출력하라 라는 뜻입니다. 즉 [3]{5}는 3을 5번 출력하라는 뜻입니다.

* = *앞의 문자를 0개 이상으로 포함한다 라는 뜻이므로 a*b는 b,ab,aab,aaab를 포함한다고 볼 수 잇습니다.

\t = tap이라는 의미를 가지며 url로 쓰기 위해서는 인코딩을 해야합니다. url인코딩을 했을 경우 %09라는 값이 나온다.

이에 맞춰서 $pat="/[1-3][a-f]{5}_.*IP주소.*\tp\ta\ts\ts/"; 를 해석하면 1aaaaa_.IP주소.%09p%09a%09s%09s 가 나옵니다. 이것이 pat의 패턴입니다. 그리고 이 패턴이 &_GET[val]과 일치해야 하고 &_GET은 폼에서 값을 가져오라는 뜻이므로 주소형식에 입력을 해야합니다. 변수가 val 이므로 그대로 주소에 val = 식으로 적어주시면 되겠습니다. 아 그리고 php에서 주소창에 변수를 입력하실 때에는 주소 맨 끝자리에 ?를 붙이고 변수를 입력하셔야 합니다.

다적으셨으면 엔터를 쳐주세요.

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

'Webhacking' 카테고리의 다른 글

Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 문제1번  (0) 2015.07.04
webhacking시작 - 회원가입  (0) 2015.07.04
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 17번을 풀어보겠습니다. http://webhacking.kr - 로그인 - challenge - 17번으로 들어가 주세요.

빈칸과 체크버튼이 있습니다. 흠 무슨 뜻일까요. 일단 문제를 알아내기 위해 오른쪽 마우스 - 소스보기를 눌러줍시다.

script부분에 무슨 복잡한 계산식이 있네요. 그리고 그 밑에는 if(login.pw.value==unlock){ alert("Password is "+unlock/10); }else { alert("Wrong"); } 라고 되어있네요. 해석해보면 unlock에 저 계산식의 값을 저장하라. 그리고 만약 login.pw.value의 값이 unlcok의 값과 같으면 Password is +(unlock/10)을 출력하고 아닌경우엔 Wrong를 출력하라. 라고 되어있습니다. 일단 딱봐도 unlock을 계산해야 문제가 풀릴 것 같습니다. 그런데 또 저걸 일일이 계산하는 분은 없을거라고 봅니다. 그럼 계산기를 이용하느냐? 그것도 귀찮지 않습니까? 그래서 정말 간단하게 풀어봅시다. 아래그림처럼 자바스크립트 콘솔로 들어갑니다.

창이 열리면 unlock=부터 9999999999; 까지 복사하여 붙어주세요. 그리고 엔터를 눌러시면 아래그림과 같이 답이 나옵니다.

음 unlock의 값은 구했습니다. 그런데 아까 소스에서는 unlock의 값이 login.pw.value와 같을경우 패스워드를 출력한다 했으니 즉 login.pw.value의 값이 9997809307이 되어야 합니다.그럼 대체 login.pw.value은 뭘까요? 알아내기위해 오른쪽 상단메뉴 - 도구 더보기 - 개발자도구를 눌러주세요. 

login.pw.value 란 해석하면 form name이 login이고 이름이 pw인 것의 값이라는 소리입니다. 조건에 맞는 소스를 찾아 눌러보니 왼쪽화면에 블록이 딱 잡히는군요. 즉 저 블록잡힌 것이 login.pw라는 뜻입니다. 값이라는 것은 저기에 입력한 값을 말하겠지요. 자 그러면 이제 패스워드를 알아내기 위해 login.pw에 unlock값을 넣어봅시다.

소스에 나온대로 패스워드가 나오는군요. 자 이제 패스워드를 입력해봅시다.

??? 패스워드를 그대로 입력했더니 틀렸다라는 문구가 나왔습니다. 다시한번 소스를 봅시다. 보시면 아시겠지만 login.pw의 값이 unlock값이랑 같을때에는 패스워드를 출력하지만 틀렸을 경우에는 wrong을 출력합니다. 즉 login.pw의 값에는 9997809307의 값 외에는 무조건 Wrong을 출력한다는 소리입니다. 다른 말로 패스워드를 알았지만 login.pw에 넣어선 안된다. 라는 뜻이 되겠네요. 그리고 무엇보다 소스에 solve()가 없습니다. 해결하라라는 함수자체가 존재하지 않기 때문에 이 페이지내에선 문제를 해결할 수 없다는 것입니다. 일단 문제를 해결하기 위해 뒤로가기를 눌러 메인메뉴로 나와봅시다. 답을 어디다 적어야 될까요? 적을만한 곳을 찾기 위해 메뉴를 전부 뒤져봅시다.

forum은 토론회, msg은 message(메세지)의 약자, challenges는 도전과제, auth는 authentication(인증의 약자), rank는 순위 , service는 말그대로 서비스, friendly는 관련사이트 인것 같습니다. 메뉴를 살펴보니까 도전과제 옆에 적혀있는 인증이 맘에 걸리는군요. Auth를 눌러봅시다.

Flag라는 칸이 나오는군요. Flag는 원래 깃발이란 뜻이지만 컴퓨터계에서의 Flag는 프로그램 실행중에 특정 상태가 성립했는지의 여부를 식별하기 위하여 조사되는 데이터의 항목입니다.즉 여기가 인증하는 곳 인것 같으니 여기에 아까 패스워드라고 나왔던 999780930.7을 입력해봅시다. 다 입력한 후 submit(제출)를 눌러주세요

짝짝 참 힘들게 풀었습니다.

감사합니다.



'Webhacking' 카테고리의 다른 글

Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제1번  (0) 2015.07.04
webhacking시작 - 회원가입  (0) 2015.07.04
Posted by englishmath
,

안녕하세요. 오늘은 webhacking의 문제1번을 풀어보겠습니다. www.webhacking.kr에 들어가서 로그인을 합시다. 

로그인을 하셨으면 위와 같은 화면이 나옵니다. 그리고 상단의 Challenges 를누르고 문제 1번을 누릅니다.

level : 1이라고 적혀있는 사이트가 나오고 밑에 index.phps가 있습니다. 흠 뭘 어떻게 해야 풀 수 있을까요? 문제도 안나와있습니다. 일단 이 사이트 정체를 파악하기 위해 오른쪽 마우스 - 소스보기를 클릭합니다.

여기서 주목할 부분은 12번줄에 있는 명령어입니다. 해석하면 a onclick = 누르면 , location.href 'index.phps' = index.phps란 페이지로 이동한다. 라는 뜻인데 그럼 무얼 클릭해야 이동할까요? 뒤쪽에 보시면 글자가 있죠. index.phps 즉 화면에 나와있는 글자입니다. 즉 index.phps를 누르면 index.phps 페이지로 이동한다. 라는 뜻이 됩니다. 그러면 한번 눌러 봅시다.

아까보다 알아보기 힘든 소스가 나옵니다. 마치 영어문제 푸는 것 같습니다. 다른건 머리아프니까 보지말고 solve() 함수쪽을 봅시다. solve()함수는 해결한다. 라는 뜻으로 앞으로도 이런문제를 풀때에는 solve()를 유심히 봐야합니다. solve() 함수 앞에 if문이 있네요. 다들 아시다시피 if문은 조건식으로 if 가로 안의 조건이 맞다면 그 다음걸 실행하라 라는 뜻입니다.

즉 이문제는 COOKIE[user_lv)이 5보다 크면 해결된다 라고 적혀있습니다. 그런데 바로 위의 조건을 보시면 COOKIE[user_lv)이 6보다 크거나 같으면 1을 반환하라고 되어있습니다. 쉽게 말해 COOKIE[user_lv)값에 6이상의 숫자를 넣으면 강제로 COOKIE[user_lv)값이 1로 저장된다는 것입니다. 그런데 1은 5보다 작은 숫자이기 때문에 문제가 해결되지 않습니다. 그렇다면 COOKIE[user_lv)값에 6이상의 숫자를 넣으면 안된다라는 결론이 나옵니다. 

정리를 하면 COOKIE[user_lv)값에 6이상의 숫자를 넣으면 안된다. 그런데 해결할려면 5보다 큰 수를 넣어야 한다. 즉 5보단 크고 6보단 작은 수를 넣어줘야 합니다. 문제자체는 풀었습니다. 그런데 이제 이 정답을 어디다가 넣어야 할까요? 아까 페이지에선 정답을 넣는 칸이 없었습니다. 소스를 보니 숨겨진 것도 아닙니다. 이럴때에는 변수즉 COOKIE[user_lv)를 잘 봐야합니다. 쿠키란 뭐 일반적으론 먹는 과자 이름이지만 컴퓨터내에서 쿠키란 웹사이트에 접속할 때 자동적으로 만들어지는 아이디, 비밀번호, IP주소 등의 정보를 담고 있는 일종의 정보파일입니다. 우리는 그 쿠키에 값을 넣어줘야 하므로 쿠키를 관리할 필요가 있습니다. 그래서 쿠키를 관리할 수 있게 도와주는 일종의 프로그램을 설치해 봅시다. 마침 크롬 웹 스토어에 좋은 프로그램이 있으므로 그 프로그램을 사용해 봅시다.

https://chrome.google.com/webstore/에 들어가 쿠키 라고 치고 검색을 하여 아래그림처럼 EditThisCookie를 찾아 'CHROME에 추가'버튼을 눌러주시면 됩니다.

추가가 완료되었으면 오른쪽 상단위에 쿠키모양의 버튼이 생깁니다. 자 이제 아까 들어왔던 문제 1번 화면으로 갑시다. index.phps에서 그냥 뒤로가기버튼을 누르시면 됩니다. 화면으로 돌아왔으면 오른쪽 상단의 쿠키버튼을 눌러봅시다.

보니까 user_lv라는 변수명이 보이네요. COOKIE[user_lv)의 그 user_lv입니다. 자 이제 값만 바꿔주면 됩니다. 값에 1이라고 적혀있으니 지우고 5와 6사이의 값을 적어주세요. 저는 그냥 5.5적겠습니다. 다 적었으면 밑의 V버튼을 눌러주세요. 수정이 완료되었으면 쿠키를 닫고 F5버튼을 눌러주세요.

흠 축하한다네요. 


네 이렇게 첫번째 문제를 풀었습니다. 200점 주네요. 이 점수가 어따 쓰이는지는 모르겠지만 점수가 높은 문제일수록 더 어려워진다는 것만 아시면 됩니다.

감사합니다.




'Webhacking' 카테고리의 다른 글

Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 회원가입  (0) 2015.07.04
Posted by englishmath
,

안녕하세요. 오늘은 웹해킹에 관한 포스트를 써보겠습니다.

일단 www.webhacking.kr 로 들어갑니다.

들어가시면 이런 화면이 뜹니다. 눈치빠른 분은 아시겠지만 이 로그인 화면에는

로그인 버튼은 있는데 회원가입 버튼은 없습니다. 회원가입버튼이 없는데 어떻게

회원가입을 할 수 있을까요? 그래서 일단 비밀을 파헤치기 위해 소스를 확인해 봅시다.

그대로 오른쪽 마우스 - 소스보기를 클릭해주세요.

 

 

소스들을 하나씩 살펴보면 그중 한부분이 혼자 초록색인 부분이 보입니다. 이러한 초록색 소스는 주석처리라고 하여 이 소스에 대한 부가설명을 덧붙여 사용자가 이 소스를 최대한 이해할 수 있도록 하는 설명문 같은 것입니다. 근데 이 소스는 아무리 읽어봐도 설명문으로 보이진 않습니다. 오히려 '<input type = button' 부분을 봐서 명령문이라고 봐야합니다. 해석을 해보면 input = 입력해라 , type button = 형태가 버튼이고 , value Register = 값이 Register인 , 즉 Register버튼을 입력해라 라고 되있습니다. 근데 홈페이지에 아무리 찾아봐도  Register버튼은 없고 Login버튼만 있습니다. 왜냐하면 이부분이 주석처리가 되어 설명문이 되어버려 소스에서 효력이 없어졌기 때문입니다.

그렇다면 이제 할일은 이 주석처리되어있는 문구를 효력이 있는 그냥 문구로 바꿔줘야 합니다. 소스를 수정하기 위해 일반 익스플로러가 아닌 크롬으로 들어갑시다. 크롬으로 들어가셨으면 아래 그림처럼 개발자 도구를 눌러주세요

 

아까 봤던 소스가 나옵니다. 다만 분류가 되서 나오네요. 해당소스를 클릭하니 홈페이지에 해당블록이 잡힙니다. 또한 삼각형버튼은 하위항목이 있다라는 뜻이므로 누르면 아래 하위항목이 나타납니다. 자 이제 아까보았던 주석 소스를 찾아봅시다.

초록색 소스를 찾았습니다. 또한 동시에 홈페이지에 블록이 잡혔습니다. 분명 잡혔는데 아무것도 보이지 않는 것으로 보아 잘 찾아온것 같습니다. 이제 소스를 수정해봅시다. 주석처리된 문구에서 오른쪽 마우스 - Edit as HTML 로 들어갑니다.

소스에서 <!-- -->는 소스를 주석처리하라는 의미입니다. 우리는 주석을 없애야 하므로 다 지워줍시다. 그외에 불필요한것도 지워줍시다. 아래그림처럼 수정해 주시면 됩니다.

 

다 작성한 상태로 관리자 도구를 닫아주시면 다음과 같이 수정이 됩니다.

우와 드디어 Register라는 버튼이 새로 생겼습니다. 눌러서 들어가 봅시다.

딱봐도 회원가입이네요 ID, PW, EMAIL를 입력해줍시다. 그런데 마지막 문구가 신경쓰입니다. 알수없는 언어가 적혀있고 제목은 decode me입니다. decode는 해석하라 라는 의미이므로 아마 암호문인것 같습니다. 근데 딱봐도 어떻게 해석해야 할지 감도 안옵니다. 그렇기 때문에 우리는 프로그램을 이용하여 해석을 해보겠습니다.

해독기로는 base64. MD5, sha1 등이 있습니다. 과연 무엇으로 해야 올바르게 디코딩 할 수 있을까요?  일단 암호문을 보면 맨 끝에 == 가 붙어있습니다. 이 ==는  base64로 인코딩(암호화)을 하여 생기는 문구입니다. 즉 이문구는 base64로 인코딩 된 문구이므로 base64로 디코딩을 해야 올바른 답이 나옵니다. 해석을 위해 https://www.base64decode.org/ 로 들어갑시다.

해독할려는 암호문을 위와 같이 적고 DECODE 버튼을 눌러줍시다.

해독이 완료되었습니다만 제가 바보라서 해독된 문구조차 뭔 소린지 모르겠습니다. 1번 해독된 문구를 아까처럼 위에 올리고 DECODE버튼을 눌러 알아볼 수 있는 문구가 나올때까지 디코딩 해봅시다. 

음 아직도 모르겠군요 한번 더 돌립시다.

우오오오 뭔가가 나왔습니다. IP주소같이 생겼네요. 이 번역된 문구를 아까 decode me 문구에 올리고 밑에 submit버튼을 눌러주시면 회원가입이 완료됩니다. 그리고 입력한 아이디와 패스워드로 로그인을 하시고 들어가시면 됩니다.

이상으로 webhacking 회원가입을 마치겠습니다.

감사합니다.

 

 

 

'Webhacking' 카테고리의 다른 글

Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 문제1번  (0) 2015.07.04
Posted by englishmath
,