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