본문 바로가기

웹해킹/webhacking.kr

webhacking.kr old 38번 문제풀이(Writeup) 및 Log Injection 설명

반응형

webhacking.kr old 38번 문제 개요(Writeup)

 

 

old 38번 문제풀이 1

문제를 들어가면 위와 같이 출력된다. 이번 문제는 Log Injection 문제이다. 문제를 풀기 전에 Log Injection이 무엇인지

알아보자.

 

Log Injection이란?

Log Injection은 사용자 입력이 로그에 포함되는 경우 공격자가 이를 이용해 로그 항목을 위조하거나 악성 내용을 로그에 삽입하는 공격을 말한다. 간단하게 말하면 SQL Injection과 같이 파라미터를 이용하여 Log를 조작하는 공격 방법이다.

 

공격 방법(Log forging)

사용자 입력에 의해 CRLF(\r\n) 문자를 이용하여 새로운 로그를 작성할 수 있다. 이를 통해 침해사고 대응을 어렵게 

하고, 로그 무결성을 해쳐서 신뢰성을 떨어뜨린다.

코드가 아래와 같을 때

input := r.FormValue("query")
logger.ErrorF("['%s' User][error][input: %s] %s", username, input, err)

공격코드를 넣으면 GET /?query=aaaa]%20invalid%20data%0d%0a['B' User][token]%20re-generate%20token

['A' User][error][input: aaaa] invalid data
['B' User][token] re-generate token
로그에 저장될 것이다.

방어 방법

사용자의 입력이 로그에 반영되지 않는 코드를 작성하고, 로그 포맷에 영향을 주지 않도록 CRLF, Tab, Space 등의 문자는 기록되지 않게 입력값 검증을 한다.

 

이제 문제를 통해 공격 실습을 해보자.

 

webhacking.kr old 38번 문제풀이(Writeup)

old 38번 문제풀이 2

코드에 주석으로 힌트가 있다. admin.php가 존재하고 있음을 알려준다. 확인해보자.

 

 

old 38번 문제풀이 3

로그 뷰어가 보인다. 로그 파일을 웹에서 볼 수 있게 해주는 것이 로그 뷰어이다. 이 모습을 보고 몇 가지 테스트로 index.php에서 넣어봤다.

 

 

old 38번 문제풀이 4

로그 뷰어에서 기록되는 것이 보이고, admin을 입력했을 때 your not admin이 출력되었다. 로그에 남는 규칙을 보니

" IP:id값 "으로 남는다. 따라서 로그인이 되는 guest를 이용해서 admin 로그를 함께 입력해보겠다.

개발자 도구를 이용해 페이지를 개행할 수 있게 만드는 방법도 있지만, 필자는 Burp Suite를 사용했다.

 

 

old 38번 문제풀이 5

id=guest
IP:admin

로그인 버튼을 누를 때를 Intercept 해서 확인해보니 id값이 전달되는 것이 보인다. 몇 번 시행착오를 겪어보니 \r, \n과 같은 개행 문자가 아스키코드로 해도 작동하지 않아서 id값에서 개행을 해서 전달했다.

 

Forward를 하고 admin.php에 들어가서 새로고침을 하니 성공 메시지가 출력되었다.

 


개인적으로 Log Injection이라는 개념을 오늘 알게 되었다. 10P밖에 안 되는 문제였지만, 새로운 개념에 대해 학습하고

실습을 하다 보니 시행착오를 많이 겪었다. 오늘도 한 단계 성장한 기분이다.

 

 

참고 사이트

https://www.hahwul.com/cullinan/log-injection/

https://unabated.tistory.com/entry/Log-Injection

728x90