<현재 환경 세팅>
1. Virtual Box 7.1.4 + 우분투 리눅스 20.04
2. 우분투 APM (Apache2 + PHP + MySQL)
3. 기본 웹 루트 경로 /var/www/html
*노말틱님 강의와 환경 세팅이 다르긴 한데 결국 만들려는 결과물은 같을테니까 괜찮지 않을까 생각한다.
(아니면 ∵☆ shoveling☆∵ 하지 뭐...)
◈ 제대로 복습하기 전에 일단 기억나는 거 실습
1. Termius 설치
https://termius.com/download/windows
구글링으로 방법 찾아서 이것저것 입력해봤지만 역시나 한 번에 되진 않는다.
(어쩌구저쩌구 생략)
chat GPT에게 물어보았더니 비밀번호 인증이 문제라고 한다.
비밀번호 정확히 썼는지, sshd_config 파일에 필요한 부분이 주석처리되진 않았는지, 방화벽이 문제는 아닌지 등을 알려주길래 확인해보고 (사실 며칠 전부터 ssh관련 문제와 씨름해왔다) 오늘 새로 확인하게 된 부분이 바로,
root 계정 문제!!!!
이에 대한 문제를 해결하려 할 때는 두 가지 접근법이 있을 것이다.
root 계정을 유지하느냐, 일반 사용자 계정으로 접근하느냐
1. root 계정 로그인 권한을 허용하여 root 계정으로 접속하기
챗지피티에 따르면 /etc/ssh/sshd_config 파일을 열어 PermitRootLogin 항목이 yes로 되어있는지 확인해야 한다고 한다.
터미널을 이용하여 vi /etc/ssh/sshd_config로 파일을 열어 확인했더니 아니나 다를까
이제 저걸 이예에스로 바꾸면 나는 아마.. 아마도! 또 오류가 나지 않는다면!! root 계정으로 Termius를 이용할 수 있을 것이다.
하지만!!!!!!!!!
root란 무엇인가? 노말틱 가라사대 이것은 최고 권한자요, 신이라고 하였다. (출처: segfault academy 리눅스 기초 강의)
자고로 최고 권한자는 엉댕이가 무거워야 하는 법. 그래서 나는 일반 사용자 계정으로 접근해보기로 하였다.
2. 일반 사용자 계정으로 접근하기
그러기에 앞서 우선 우분투 방화벽을 실행한다.
그럼 이런 문구가 뜬다.
굿.
잘 된 것 같지만 혹시 모르니 방화벽 상태를 확인한다.
명령어를 입력하면
이러한 문구를 시작으로 이런 저런 기본 정보와 현재 열려있는 포트 정보 등이 좌르륵 뜬다.
음 그래, 내가 잘 따라갔군~ 하며 ifconfig를 이용해 내 우분투의 ip번호를 확인하고
마지막으로 ssh에 해당하는 포트 번호 22번이 열려 있는지도 확인한 후에
< Termius로 간다. >
뉴호스트 누르면 우측에 입력 폼이 뜨는데
IP주소나 호스트이름, SSH 포트 번호, 연결할 기기의 Username, password 등 필요한 정보를 입력하고 Connect 하면
Host에 뜬다.
이제 여기서 우분투 터미널로 돌아가 ssh [username]@[ip address] 를 입력하면 다른 소프트웨어에서 SSH로 로그인할 때 root 계정이 아닌 일반 사용자 계정으로 로그인이 될 것이다.
2. PHP로 스켈레톤 코드 만들고 브라우저에서 확인해보기
VScode를 연다.
php 코드를 쓴다
저장하고 Termius를 이용하여 우분투 웹서버의 /var/www/html 디렉토리로 보낸다.
안된다.
이건 또 뭐가 문제였을까. 챗지피티씨는 뭐든지 알고 계신대.
지피티씨는 다섯가지 원인을 들었으나 내 신경이 쏠린 것은 1가지였다. 그것은 바로
디렉토리 사용자 권한!!!!!!!!!
그렇다. 나는 지금 한낮 일반따리 계정으로 어디든 들쑤시고 다닐 수 있을 것이라 생각했던 것이다.
ls -l 명령어로 확인한 /var/www/html 디렉토리의 사용자 권한은 drwxr-xr-x였다.
미천한 일반 계정으로는 디렉토리 근처에 서성이며 먼 발치서 저들은 뭐하고 사나 구경이나 할 수 있지 파일을 쓸 수 없던 것이다. 트리구조 자식. (오 혹시 내 해킹 지식이 많이 쌓이면 일반 계정으로도 침투할 수 있을까? 왕관 뺏기! 왕관 뺏기!)
아무튼 그래서 바로 chmod 명령어로 해당 디렉토리에 대한 권한을 757로 바꿨다.
된다!!!!!!!!!!!!!
크아아아아아아
그리고 이게 최종 확인본이다.
실행 후 남은 의문은 현재 디렉토리를 이동한 뒤 초기 url로 실행해도 실행이 된다는 점이다.
강의에서와 달리 아파치로 해서 그런가.. 파이썬으로는 원하는 디렉토리에서 서버를 열면 그 디렉토리가 웹 루트 경로가 되는데 아파치 서버는 디렉토리 고정인 건가 싶다.
(찾아보니 맞았고 이에 대해 아래에서 좀 더 다룰 예정이다.)
+어차피 VScode도 SSH 확장판이 있고 앞서 확인한 부분을 토대로 연결하면 사용 가능하니
Terminus는 생략할까 싶기도 하다.
이상이 기억에 의존하여 실습해보기였고 이제 본격적으로 복습해보려 한다.
◈ 복습 드간다
1. 웹 서버란?
웹 서버란 클라이언트로 부터 요청받은 정적 리소스를 찾아서 클라이어언트 측에 정적 페이지로 응답하는 일을 하는 녀석으로
쉽게 말해 클라이언트가 요청한 파일을 전달하는 역할을 맡고 있다.
지금 내 LAMP 환경에선 Apache가 그 역할을 하고 있다.
주소창에 홈페이지 네이버 홈 주소 딱 치면 네이버 서버의 정적 페이지를 볼 수 있는 것도 웹 서버가 제 역할을 했기 때문이다.
잠깐!!!!!!!
주소창에 주소를 썼더니 정적 페이지를 받았다..?
그렇다는 것은 즉, 웹 브라우저(클라이언트)가 웹 서버에 파일을 요청하는 방법은 바로 URL에 있다는 뜻일 테다.
URL은 대체 어떤 구성으로 페이지를 요청하고 있을까?
이번엔 URL의 구조에 대해 살펴보자.
2. URL의 구조
url의 기본 구조는 이렇다.
[ Protocol ] :// [ Ip Address 혹은 Domain ] : [Port Number] / [File Path]
- 앞선 과정에서 만들었던 로그인 페이지의 url과 이 기본 구조를 비교해보자.
[ http ] :// [ 192.168.219.104 ] / [ login.php ]
1) http는 프로토콜이며 웹 페이지를 로드하는데 사용된다.
2) 192.168.219.104는 웹 서버의 ip 주소이다.
3) 포트 번호는 well-known 포트로, http에 80번 포트를 사용하면 생략 가능하다.
(https 프로토콜의 well-known 포트 번호는 443번)
4) 파일의 경로. 웹 서버가 실행된 디렉토리(웹 루트 경로)를 기준으로 경로를 표시하며
apache의 경우 기본적으로 웹 루트 경로가 /var/www/html로 고정되어 있고 해당 디렉토리에 login.php 파일을 생성했으므로 다른 표시 없이 login.php 만 적어도 경로 표현이 된다.
- 이왕 본 김에 네이버도 함 비교해보자
[ https ] :// [ www.naver.com ] /
1) https 프로토콜을 사용 중이다. http에서 보안 기능이 추가되었다.
2) ip 주소가 아니라 도메인 네임을 사용하였다.
3) 위와 마찬가지로 포트 번호는 생략되었다. https의 well-known 포트는 443번이다.
4) 파일의 경로이다. 최상위 디렉토리(/)라는 뜻이 아니라 생략되었다. index.html 파일의 경우 생략해도 기본으로 반환된다.
*아래는 웹 루트 경로에 대한 추가 설명이다.
웹 루트 경로는 위에 언급했다싶이 웹 서버가 실행된 디렉토리라고 볼 수 있다.
아파치는 웹 루트 경로가 정해져 있지만 여타 테스트 식의 방법으로 웹 서버를 실행할 경우 '/etc/뭐시기' 디렉토리든 '/tmp/저시기' 디렉토리든 웹 루트 경로가 될 수 있다.
이때 주의해야할 것이 두 가지가 있다.
▷▶ 웹 서버를 실행시킨 계정이 현재 웹 루트 경로에 있어야 그 안에 있는 정적, 혹은 동적 웹 페이지를 응답 받을 수 있다.
예를 들어, 내가 /tmp/test_site 디렉토리에서 python -m http.server 80 또는 php -S [ip 주소:포트번호] 명령어로 웹서버를 실행시켰을 때,
/var 경로 등은 물론, /tmp/tistory_dir 디렉토리처럼 똑같이 /tmp 디렉토리의 하위 디렉토리에 있더라도
/tmp/test_site에 있지 않은 이상 원하는 결과는 얻을 수 없다.
▷▶ 웹 서버는 웹 루트 경로의 상위 경로에 있는 파일은 읽을 수 없다.
당연하다. 안 그러면 url을 조금 고친 정도로 내 리눅스에 있는 데이터가 다 털릴 테니까.
그래서 웹 서버를 실행하는 위치를 주의해야 하는 것이다.
앞선 예비 실습에서 아파치의 경우 /var/www/html 디렉토리에서 실행되도록 고정되어있을 것이라 추측하였는데, 그럴 수 있었던 이유가 첫번째에 쓴 내용 덕분이었다.
그렇다고 또 저기서만 서버 실행이 가능한 것은 아니다. 앞서 언급했듯이 php -S [ip 주소:포트번호] 명령어를 쓰면 다른 디렉토리에서도 테스트용 서버를 사용할 수 있다. 이때는 /var/www/html에서 사용하는 80번 포트가 아닌 다른 포트 번호를 사용해야 하고(당연히 그 포트의 방화벽도 열어야 한다.)
명령어 사용 중 ctrl + C 를 누르면 임시 서버 운용이 끝나는 듯했다. 말그대로 테스트 용으로만 사용하는 게 좋을 것 같다.
그래서 이걸로 뭘 하려고 하는 것이냐!!!!! 하면 동적 페이지를 만들 것이다.
3. 동적 페이지
동적 페이지란 무엇인가?
정적 페이지가 아닌 것을 말한다.
그럼 정적 페이지란 무엇인가?
클라이언트가 누구든, 언제, 어디서, 뭘 위해 요청하든 똑! 같! 은! 모습으로 반환받는 페이지를 말한다.
예를 들자면 웹 서버 설명할 때 언급한 검색 엔진의 홈페이지 등 html(+css)로 표현되는 페이지들이 그러하다.
다시 말해 동적 페이지는 클라이언트가 부여한 어떤 조건에 의해 반환받는 정보가 달라지는 페이지를 말한다.
예를 들자면 로그인 후의 페이지나 뭐.. 많지 쇼핑할 때 주문정보 입력하는 페이지도 그럴 것이고..
html만으로는 표현할 수 없는 페이지들이 그러하다.
동적 페이지를 만들기 위한 웹 서버는 일반적으로 이 세 가지로 구성되어있다고 한다.
- 웹 서버(Apache): 정적 페이지 처리, 요청 페이지에서 동적 메소드 발견하면 WAS한테 토스, Front-End
- WAS(php): Web Application Server, 동적 페이지 처리, 큰 틀에서 필요한 요소만 바꿔서 페이지 찍어냄, 정보 필요하면 DB한테 정보 요청, Back-End
- DB(MySQL): 서버 운영에 필요한 정보를 저장하고 활용, Back-End
와 WAS! 동적 페이지 처리! 이제부터 WAS를 다루겠구나!!
아니, 우분투 LAMP를 사용하는 나의 경우 나는 정석 WAS가 없다. 그래서
php가 WAS의 역할을 담당해줄 것이다.
*아래는 WAS와 php에 대한 추가 설명이다.
WAS
Web Application Server의 약자로, LAMP 환경처럼 정적 페이지와 동적 페이지의 처리를 분리하지 않고 하나의 서버에서 모두 담당할 때 필요한 서버이다. 고성능 애플리케이션이나 복잡한 비즈니스 로직을 처리하기 위해 자바 환경에서 많이 사용한다. 기능 구현뿐만 아니라 보안 등의 기능도 모두 묶어 하나의 WAS로 동작하게 되어있다.
ex) Tomcat 등
php
동적 페이지를 처리하는 인터프리터 언어로 보통 정적 페이지를 구현하는 html과 함께 쓰인다. LAMP 환경에서 정적 페이지를 처리하는 Apache와 묶어서 비교적 단순한 웹 서버 환경을 만들 때 많이 사용하는 듯하다.
Apache와 묶었다곤 하나 WAS에 비해서는 각각의 기능이 독립적인 편이라고 한다.
결론은 WAS는 겁나 훨씬 복잡한 서버인데 내 환경에서는 php가 동적 페이지를 담당할 것이니 WAS의 역할을 담당할 것이라고 표현하였다.
TMI: 스터디 디스코드에서 나온 질문을 통해 알게 된 사실이다. 그 질문을 보기 전까진 동적 페이지? WAS? php~ 하고 넘어갔을 것이다. 이것이 그룹 스터디의 장점...
4. php 맛보기
*사전 지식*
1. 기본 구조
<? php 어쩌구 코드 내용; ?>
2. echo 기능
프로그래밍 언어의 print 함수와 같은 기능 (값을 화면에 출력)
예시: <? php
echo _________;
?>
3. 웹 서버에 데이터를 전달하는 방법
3-1. GET: 파라미터를 url에 붙여서 전달
3-2. POST: 파라미터를 url에 표시 안 함
클라이언트는 서버에 필요한 페이지를 요청하기만 할 수 있는 게 아니다.
동적 페이지에서 웹 서버가 요구하는 정보(파라미터)를 전달하여 결과를 달리 받을 수도 있다.
1. 인풋 박스에서 받은 파라미터를 출력하는 사이트를 구현해보자!
준비물
1. 웹 서버 + php
2. 서버의 머신을 이용할 수 있는 VScode
3. 웹 브라우저
4. 코드 (큰 틀과 input 박스를 위한 html + 동적 페이지를 만들기 위한 php)
- GET 요청 활용하기
"로그인 정보"라는 제목 밑으로 GET 메서드를 이용해 인풋 박스에 받은 텍스트를
PHP 코드로 전달해 동적 처리가 가능하도록 하였다.
여기서 포인트는 URL의 상태이다. 물음표와 등호로 php에 전달된 이름값(id)과 파라미터(shoveling)를 매치시켜 표현하고 있다.
이처럼 GET 요청은 클라이언트로 부터 받은 파라미터를 URL에 노출시킨다.
로그인 시에는 쓰기 뭐한 요청 방식이다.
POST 메서드는 어떤 차이를 보일지 실습해보자.
- POST 요청 활용하기
주소창 밑으로는 GET 요청과 같은 모습을 볼 수 있지만 GET과 달리 URL에서 클라이언트가 전달한 파라미터를 확인할 수 없었다.
이번엔 html 파일로 파라미터를 받고 php 파일로 동적 처리를 시켜보면 어떨까?두 기능을 파일로 분리하는 것이다.
2. 받은 파라미터를 다른 파일에 전달하기
- html 파일
1. GET 메서드를 사용하여 최종 결과 화면의 url에 사용자가 입력한 파라미터 값이 나타날 것이다.
2. action 속성을 이용하여 login_proc.php 파일에 파라미터를 전달하고 있다.
3. 구현된 정적 페이지에 아이디와 비밀번호를 입력하는 텍스트 박스 2개와 입력 값을 제출하는 submit 버튼이 보일 것이다.
- php 파일
각각 아이디와 비밀번호 값을 받아 화면에 출력하고 있다.
- 결과
이러한 실습을 통해 html 과 php 파일을 분리하여 처리하면
1. 페이지 결과를 따로 받아볼 수 있다.
2. 정적 페이지 처리와 동적 페이지 처리를 분리할 수 있다.
3. 어떤 사이트는 동적 페이지 처리를 완료하기 전에 정적 페이지를 먼저 받을 수도 있을 것 같다.
는 결과를 얻을 수 있었다.
추가로 GET 메서드를 POST 메서드로 바꿔서 실행해본 결과를 올리며 1주차 복습을 마치겠다.
'모의해킹 스터디 복습' 카테고리의 다른 글
모의해킹 스터디 6주차: UNION SQL Injection (0) | 2024.11.24 |
---|---|
모의해킹 스터디 5주차: 로그인, 인증 우회 복습 (1) | 2024.11.19 |
모의해킹 스터디 4주차: 웹 프록시 툴 - Burp Suite (5) | 2024.11.12 |
모의해킹 스터디 3주차 과제: 로그인, 쿠키, 세션, 세션ID (3) | 2024.11.06 |
모의해킹 스터디 2주차: Database (4) | 2024.10.29 |