-
13주차 과제모의해킹스터디_과제 2024. 2. 8. 17:23
[1] CSRF 개념 정리 -> 블로그에 정리[2] 웹 개발
- 파일 업로드까지
- 네이버 카페 / 커뮤니티 사이트 비슷한 느낌
[3] DDoS 기법 정리 / slowloris 공부 -> 블로그에 정리
[2] 웹 개발
전에 검색 기능까지 만들어 놓고 다 끝냈다고 생각해서 한동안 만들어둔 웹 서버를 건드린 적이 없었는데, 알고보니 파일 업로드하는 기능까지가 웹 개발 필요조건이었다. 그래서 오랜만에 웹 서버도 켜보고 파일 업로드 기능까지 추가해서 웹 개발을 마무리하도록 하겠다.
웹 페이지에 들어가본게 오랜만이라 처음부터 살펴보겠다. 위의 화면은 웹 페이지에서 처음 나오는 로그인 화면인데, 로그인을 해본지 너무 오래돼서 만들어둔 계정의 ID랑 비밀번호를 다 까먹었었다. 결국 생각나지 않아 DB를 확인하고 로그인했다.
로그인하고 나오는 메인페이지다. 마이페이지와 게시판이 보인다. 파일 업로드 추가를 해야하니 마이페이지는 넘어가도록 한다.
Board 버튼을 누르면 게시판 화면으로 넘어간다. UI가 예쁘지는 않지만 필요한 기능은 다 구현한 상태다. 게시판 글의 날짜를 약 2달 전에 작성한 글이다. 이전에는 어떤 형식으로 보여줬는지 확인해본다.
확실히 일반적인 게시판처럼 보이지는 않는다. 너무 기능만 구현한 것 같긴 한데, 기능 구현에 초점을 두라고 하셔서.. 넘어가도록 하고 다음으로 글쓰는 페이지까지 확인해보겠다.
글쓰는 페이지는 나름 괜찮은 것 같다. 이제 파일 업로드 기능을 구현할 건데, 파일만 따로 업로드하는 기능이 아니라 게시판 글을 작성할 때 추가적으로 파일을 업로드하는 기능이라고 이해를 해서 제목, 내용 밑에 파일을 추가하는 부분을 만들어 보겠다. 이제 코드를 살펴보고 필요한 부분을 추가하겠다.
그 전에 먼저 업로드할 파일을 위해 DB에 file 컬럼을 미리 추가해야 한다.
file 컬럼은 varchar 형식으로 만들었고 특별한 다른 설정은 안했다.
board_write.php
<body> <nav class="navbar bg-dark border-bottom border-body" data-bs-theme="dark"> <a class="navbar-brand" href="index.php">Home</a> </nav> <div class="container"> <form method="POST" action="/board_write_check.php" id="write-form" enctype="multipart/form-data"> <div class="form-group"> <label for="title">제목:</label> <input type="text" class="form-control" name="title" required> </div> <div class="form-group"> <label for="content">내용:</label> <textarea class="form-control" rows="5" name="content" required></textarea> </div> //파일 업로드 기능 추가 <div> <input type="file" name="myfile" /> </div> <button type="submit" class="btn btn-primary">작성하기</button> </form> </div> <footer class="footer"> <p>© normaltic</p> </footer> </body>
form 태그의 내용 부분 밑에 파일을 업로드하는 부분을 추가했다. file이라는 type으로 파일을 추가할 수 있다.
board_write_check.php
//board_write.php에서 업로드한 파일을 서버에 저장 $uploaded_file_name_tmp = $_FILES['myfile']['tmp_name']; $uploaded_file_name = $_FILES['myfile']['name']; $upload_folder = "upload/"; move_uploaded_file($uploaded_file_name_tmp,$upload_folder.$uploaded_file_name); // DB 삽입 $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); $sql = "INSERT INTO board(userName, title, content, date, file) values('{$userName}', '{$title}', '{$content}', '{$date}', '{$uploaded_file_name}')"; $result = mysqli_query($db_conn, $sql); mysqli_close($db_conn);
submit으로 넘어가는 페이지에서 업로드한 파일을 서버에 저장하는 코드를 추가한다. 나는 서버에 업로드한 파일을 저장하기 위해 upload라는 폴더를 추가했는데, move_uploaded_file()함수가 폴더를 자동으로 생성해주는 것이 아니라 미리 저장폴더를 만들어두어야 한다.
그리고 DB에 접근하는 SQL도 file 부분도 추가하여 삽입하도록 수정하면 된다.
INSERT INTO board(userName, title, content, date, file) values('{$userName}', '{$title}', '{$content}', '{$date}', '{$uploaded_file_name}')
마지막으로 게시판 글 읽는 페이지에서 파일도 받을 수 있도록 코드를 수정해주면 끝이다.
content.php
<div> 파일 : <a href="upload/<?php echo $row['file'];?>" download><?php echo $row['file']; ?></a> </div>
그렇게 해서 완성된 파일 업로드 기능
업로드와 다운로드까지 잘 된다.
[3] DDoS 기법 정리 / slowloris 공부
디도스 기법은 지난 주에 블로그에 정리했기 때문에 Slowloris에 대해서만 정리해보도록 하겠다.
Slowloris에 대해 검색해보니 이것도 DDoS의 한 종류인데 다른 DDoS와는 다른 성격을 지닌다. 가장 큰 차이점은 적은 양의 네트워크 대역폭으로도 상대를 서비스 거부 상태로 만들 수 있다는 점이다. 상대의 네트워크 대역폭을 가득 채우는 것을 목표로 하는 DDoS와는 다르게 어떤 원리로 공격을 진행하는지 살펴보자.
Slowloris는 공격자가 피해자에게 대량의 HTTP 연결을 시도하고 유지함으로써 서버 리소스를 소모시키는 공격이다. 아래 이미지를 살펴보자.
이렇게만 보면 기존의 DDoS처럼 대량으로 패킷을 보내서 네트워크를 마비시키는 것과 다를바 없어보이는데 중요한 것은 네트워크 대역폭을 가득 채우는 게 아니라 HTTP 연결을 담당하는 스레드를 계속 붙잡아 둬서 가능한 서버 연결 개수를 초과시키는 것이 목적이다.
여기서 HTTP 요청 헤더의 구조를 봐야 한다.
GET / HTTP/1.1 Host: www.naver.com Cookie: nx_ssl=2; _ga_EFBDNNF91G=GS1.1.1706528417.1.0.1706528417.0.0.0; _ga=GA1.2.539842620.1706528417 Sec-Ch-Ua: "Chromium";v="121", "Not A(Brand";v="99" Sec-Ch-Ua-Mobile: ?0 Sec-Ch-Ua-Platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 Priority: u=0, i Connection: close
위에 보이는 건 NAVER에 접속하는 GET 방식의 요청의 헤더값들을 가져온 것이다. 보면 Host 부터 Connection까지 많은 헤더들이 존재하고 헤더의 종류와 개수는 서버마다 다르다. 그렇다면 서버는 요청 헤더의 끝을 어떻게 확인하고 구분할 수 있을까? 답은 줄바꿈(CRLF)이다.
...
Sec-Ch-Ua-Mobile: ?0 [CRLF]
Sec-Ch-Ua-Platform: "Windows" [CRLF]
Upgrade-Insecure-Requests: 1 [CRLF]
...헤더의 끝마다 줄바꿈(CRLF) 값이 들어가 있고 서버는 이 값으로 헤더의 끝을 구분한다. 그렇다면 마지막은 마지막 헤더의 끝, 즉 요청의 끝은 어떻게 구분할까?
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 [CRLF]
Priority: u=0, i [CRLF]
Connection: close [CRLF] [CRLF]줄바꿈(CRLF)을 두 번 쓰면 된다.
Slowloris는 이 차이를 이용한 공격이다. HTTP 요청 패킷을 보낼 때 마지막 헤더 값 이후에도 줄바꿈을 한 개만 보낸다. 그렇게 하면 서버의 입장에서 볼 때 "뒤에 더 헤더가 존재하구나" 라고 생각하면서 그 값을 기다리게 되는 것이다.
그리고는 주기적으로 부분 헤더를 이어서 보낸다. 서버 연결에 있어서 너무 많은 시간을 초과하게 되면 강제로 연결을 끊어버리기 때문에 조금씩 값을 보내서 연결 시도 상태를 활성화시키는 것이다. 서버는 요청 종료를 받기 전까지는 부분 연결을 끊을 수 없기 때문에 연결을 관할하는 TCP 세션을 계속 소모시키게 된다. 그렇게 가능한 모든 세션 수를 넘기게 되면 서비스 요청 거부가 발생한다.
참조
[PHP] 게시판 파일 업로드 #10
※ 2018/07/07 전격 수정 ※ 2019/06/06 코드 수정 ※ 2020/05/12 코드 수정 ※ 해당 php게시판 포스팅은 ...
blog.naver.com
[HTTP DDoS] Slowloris 공격
이번 포스팅에서 Slowloris 라는 DDoS 공격 방법에 대해 정리한다. # HTTP 요청헤더의 시작과 끝 웹서버는 클라이언트의 요청을 받으면 요청 내용을 처리한 후 되돌려 준다. 그렇다면 웹서버는 클
withbundo.blogspot.com