1주차 과제: 로그인 페이지 만들기

1. python이 설치되어 있는관계로 간단하게 Flask를 사용할 예정
2. Flask에서 html탬플릿 엔진을 사용하기위한 방법 찾아보기


Flask 설치 준비

# 만일의 사태를 대비해 가상환경으로 진행
mkdir ~/flaskWAS
cd flaskWAS

# pip 설치
sudo apt install python3-pip

# 가상환경 패키지 설치
sudo apt install python3.10-venv

# 가상환경 생성
python3 -m venv flask01

# activate 심볼릭 링크생성
cd ~
ln ~/flaskWAS/flask01/bin/activate ~/activate

#가상환경 실행
source activate

좌측에 기입한 가상환경 이름이 보인다(flask01)

이제 패키지 충돌 걱정 없이 Flask 및 Template engine을 설치하면된다.


Flask 설치

# flask 설치
pip install flask

# 플라스크 설치 확인 
pip list

flask 3.0.0 설치 확인


# flask 소스 작성
cd flaskWAS
vi app.py

하기의 내용 기입 후종료

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Flask에서 host를 기입 하지 않는다면 외부에서 접근이 불가능하고 localhost에서만 접근이 가능하다
ps.이것 때문에 3시간을 날렸다....
app.run(host='0.0.0.0', port=5000)

# flask 실행
python app.py

실행이 되었다면 Host에서 접근해 보자

VM에서 실행한 Flask를 Host에서 접근이 가능한 것을 볼 수 있다.

ctl + c를 사용하여 종료한다.


탬플릿 적용

확인해 본 결과 Flask에 html을 호출 할 수 있는 모듈이 존재 한다 (추가적으로 설치할 것이 없다)

# app.py와 동일한 위치에 templates 디렉토리를 생성한다. 
# 플라스크에서 사용하는 html의 기본 위치는 template가 된다.
mkdir templates
cd templates

# html을 작성하여 GET 방식의 데이터를 받아보자
# {{id}}는 탬플릿 엔진에서 받는 변수를 바인딩 한다.
vi login.html

---- 이하 파일 내용
<html>
        <form method="GET">
                <input name="id" type="text" />
        </form>

        <h1>id is {{id}}</h1>
</html>
-------------------

 

app.py에 login.html을 호출 할 수있는 라우터(Spring Controller) 설정을 해주어야한다.

cd ~/flaskWAS
vi app.py
--------이하 파일내용
from flask import Flask, render_template, request
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/login')
def login_1():
    id = request.args.get('id')
    return render_template('login.html', id=id) 


if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=5000)
--------------------

간단 설명

from flask import Flask, render_template, request

  • flask 모듈에서 renter_template, request를 import 받는다.

@app.route('/login')

  • ip:port/login 으로 들어오는 url에 대한 처리를 하는 함수를 지정한다.

id = request.args.get('id')

  • requst(요청)으로 받은 arguments 중 id값을 찾아 id 변수에 assign한다.

return render_template('login.html', id=id)

  • renter_template 처리 결과를 반환하며 사용할 html은 login.html
  • 랜더링 시 사용할 id라는 변수에 python에서 정의한 id를 할당한다.

저장 후 다시 python app.py를 실행하여 ip:5000/login으로 접속해보자.

 

url에 쿼리스트링이 없으므로 request.args.get('id')의 값은 None 이다.

input 태그에 아이디를 기입하고 엔터를 누르면

 

id가 동적으로 표기되는 것을 볼 수 있다.

 

다음 포스트는 GET 방식이아닌 POST 방식으로 데이터를 전달하고
특정 ID와 PW일 경우 로그인성공, 그 외는 로그인 실패 메시지를 표기할 수 있도록 수정하겠다.

 

최종 상태

~/devWeb/flaskWAS 파일 상태
~/devWeb/flaskWAS/tempaltes/login.html

 

~/devWeb/flaskWAS/app.py

-rw-rw-rw- 1 [uid] [gid] [용량] [파일 생성, 업데이트 일시] [파일명]

가장 앞의 “-”는 파일을 의미, “d”는 디렉토리를 의미.

디렉토리 별 역할

/bin: 실행파일 Ex)ls, pwd 등

/dev: 하드웨어 장치 파일

/etc: 리눅스의 설정파일 Ex) conf, profile 등

/home: 각 계정별 home 디렉토리

/lib: 공유 라이브러리 파일 (.so 파일은 윈도우의 dll파일)

/root: root계정의 홈 디렉토리 /sbin: 시스템 바이너, 시스템 관리를 위한 명령

/tmp: 누구나 사용가능, 재기동시 파일들이 모두 사라짐

/var: 리눅스에서 사용하는 프로그램들이 사용하는 파일 보관

/etc/passwd: 리눅스의 사용자 계정 파


기본적인 명령어

file [파일명]: 파일의 정보 확인 more [파일명]: 파일을 한 화면단위로 읽기( space를 사용하여 다음페이지) cp [src] [dist] rm [파일명] -r {디렉토리 삭제} -f{강제삭}: useradd [유저명]: 유저생성 su [유저명]: 유저 변경


특수권한

setuid: 파일을 실행할 때 소유주 권한으로 실행 Ex) setuid가 root라면 kali가 실행하도 내부 명령어도 root로 실행

-rws: 실행 권한 있음 + setuid 설정됨

-rwS: 실행권한 없음 + setuid 설정

setguid: 파일의 그룹의 권한으로 실행

sticky bit: 공유 디렉토리 설정(누구나 마음껏 파일을 생성 할 수 있다. 단 삭제는 생성한 사용자만 삭제 가능)

Ex)rwxrwxrwt


권한 수정

chomd [] u(사용자), g(그룹), o(기타)

+(권한 추가), - (권한 삭제)

rwx (읽기, 쓰기, 실행)

Ex) chmod u-r (사용자 권한 에서 읽기권한 삭제)


Find 사용법

파일 찾고 실행

find ./ -type f -exec sh -c "cat {}; echo;" \; 

//find: 파일찾기 // ./: 시작 위치

// -type f : 찾는 타입은 파일(d는 디렉토리, l은 링크)

// -exec sh -c: 찾은 파일로 실행할 명령어

// cat {}: 파일 읽기 {}는 찾은 파일명이 들어갈 위치

// echo: 개행을 위해

용량으로 파일 찾기

find ./inhere -type f -size 1033c -exec sh -c "cat {}; echo;" \;

// -size 1033c: 1033바이트 (b: 블록, c:바이트, k:키로바이트, m:메가바이트, g:기가비이트)

// -1033c: 1033바이트 "이하" +1033c: 1033바이트 이상

권한으로 파일찾기

find / -type f -size 33c -user bandit7 -group bandit6 -exec sh -c "cat {}; echo;" \;

find / -type f -user bandit7 2>/dev/null

// -user 사용자명

// -group 그룹명

// 1>/dev/null : 1은 정상적인 출력을 의미 /dev/null은 null로 출력(즉 출력하지 않는다.)

// 즉 정상 출력을 표시하지 않음

// 2>/dev/null: 2는 에러를 표시 즉 에러는 표시하지 않는다.


cat 사용법

정렬 및 유니크

cat data.txt | sort |uniq -u // sort: 정렬

// uniq -u: 유일한 라인만 표시 (-d 중복되는 라인만 표시, -c 중복횟수 표시)

파일명이 공백이 있 경우

cat spaces\ in\ this\ filename

// 파일 명에 공백이 있을경우 \를 사용


Data Stream

표준 입력: 0 표준 출력: 1 표준 에러: 2

[표준입력]=============================⇒

[사용자] <=======⇒ [운영체제] ≤=====⇒[컴퓨터]

≤============================= [표준 출력]

Redirection

표준 입력을 넣으면 표준 출력(에러가 발생하지 않는다면)이 발생한다. 해당 표준출력을 다시 입력으로 변환하는 것이 Redirection이다.

Ex1) pwd 1> test.txt (pwd의 결과를 입력으로 test.txt에 사용)

Ex2) pwd >> test.txt(overwirte가 아닌 append, >의 기본은 1이며 생략가능)

Ex3) find / -name “rockyou.txt.gz” 2> error (해당 명령어의 permission denid가 입력으로 redirection되어 파일에 쓰인다.) Ex4) find / -name “rockyou.txt.gz” 2> /dev/null (”/dev/null”은 쓰레기통으로 파일을 집어넣으면 사라지게 된다.)

Ex4)는 표준 에러는 “/dev/null”에 파일로 생기고(그러나 도착지가 쓰레기통이기 때문에 안보임) 표준 출력은 출력으로 나타난다.

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

5주차 SQL Ijection  (2) 2023.11.26
4주차 (burp suitte)  (0) 2023.11.15
3주차 (쿠키, 세션)  (0) 2023.11.08
2주차 (DB)  (0) 2023.11.01
1주차(WEB, WAS, IP, NAT)  (0) 2023.10.26

웹서버(WEB Server)

파일을 전달하는 역할 (정적 리소스)

 

브라우저를 통해 파일을 요청 할 수 있다. URL: [프로토콜]://[도메인 or IP]:[포트]/[파일명]

[Web Root 경로]: 웹이 실행된 경로 웹 루트 경로 이상의 데이터를 받을 수 없다.

만약 /경로에 웹서버를 실행하게 된다면 많은 파일을 접근 할 수 있다.

 

프로토콜 기본 포트

http: 80 https:443

WAS: Web Application Server

동적페이지 및 api를 제공

method: GET / POST Get: 데이터의 전달을 쿼리스트링(URL)에 포함됨

쿼리스트링: path?key1=value1&key2=value2

 

POST: 데이터의 전달을 Request Body에 포함되어 전달된다.

 

Front-End: 클라이언트 측 (브라우저) javascript

Back-End: 서버 코드(WAS) PHP, ASP, SAP


Internet Protocol adress(IP address)

데이터를 송,수신을 위한 네트워크 주소로 네트워크에 연결된 장치는 이 특수한 번호를 가지고 있어야한다.

그러나 숫자로 이루어진 IP addess는 사람이 외우기 어렵기 때문에 전화번호부 같은 역할을 하는 것이 필요하다.

이를 DNS(Domain Name System)이 필요하며 naver.comxxx.xxx.xxx.xxx 와 같이 문자열을 ip 주소로 변환하는 시스템 서비스 이다.

 

IP는 Class가 존재하며 해당 클래스 별 host(사용할 수 있는 Sub IP address) IP address가 달라진다.

예를 들어 A Class를 가진 IP address 192.xxx.xxx.xxx IP address는 하위 24비트의 IP주소를 사용 할 수 있다.

IP address는 약 43억개의 한정된 주소를 사용할 수 있다 그러나 라우터, PC, 등 많은 장비로 인해 IP Address가 부족하게 되었고 이를 해결하기 위해 IPv6, Private Network(이하 사설망)등이 사용되고 있다.

Private Network(사설망)

사설망은 IPv4 공인망을 사용하는 것이 아닌 내부망을 사용하는것으로 별도의 Network 설정을 하지 않는다면 외부Network 접근은 불가능하며 같이 연결된 내부 Network간의 연결만 가능하다.

 

집의 PC에서 WEB Server를 기동해도 wifi를 사용하지 않은 휴대폰으로 접속이 불가능 한 것이 이와 같다.

PC가 집 공유기와 연결되어있고 휴대폰이 해당 공유기의 WIFI신호를 사용하고 있다면 두 기기는 사설망을 사용하고 있는 것으로 http:[IP]/[Path]:[Port]를 사용하여 접근 할 수 있다.

 

그러나 사설망의 IP를 그대로 사용하여 외부로 나가게 된다면 중복된 IP 등으로 인해 응답을 받을 수 없다. 그렇기 때문에 내부 IP를 공인 IP로 변환하는 작업이 필요하며 이를 NAT라 한다.

NAT(Network Address Translation)

IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. -위키백과-

 

즉 내 PC에서 출발지 주소를 사설망 IP 192.100.100.1로 출발지 IP를 설정해서 전달하고 중간의 NAT가 공인 IP로 200.200.200.105로 변환하여 인터넷으로 전달한다.

[내 PC] =================⇒ [NAT] ==================⇒ [인터넷]

[192.100.100.100.1]<=======⇒[변환]<=============⇒[200.200.200.105]

[내 PC] <================== [NAT] <================= [인터넷]

그러나 내부의 사용 장비가 2대 이상이이라면 응답을 받을 때 어느 장비로 돌아가는 지 알 수 없다. 이러한 상활을 방지하기 위해 PAT를 사용한다.

PAT(Port Address Translation)

[PC 1] =======================⇒ [NAT] ==================⇒ [인터넷]
[192.100.100.100.1:9999]<=========⇒[변환]<=================⇒[200.200.200.105:10000]
[PC 1] <============== ==========[NAT] <================== [인터넷]


[PC 2] ===============⇒ [NAT] ==================⇒ [인터넷]
[192.100.100.100.1:8888]<=========⇒[변환]<=============⇒[200.200.200.105:20000]
[PC 2] <============== [NAT] <================= [인터넷]

 

PAT는 이름과 같이 Port를 변경하는 역할을 하며 응답을 받을 때 목적지 포트가 10000이라면 PC1로 목적지 포트가 20000이라면 PC2로 응답을 전달한다.

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

5주차 SQL Ijection  (2) 2023.11.26
4주차 (burp suitte)  (0) 2023.11.15
3주차 (쿠키, 세션)  (0) 2023.11.08
2주차 (DB)  (0) 2023.11.01
0주차 (리눅스 기초 명령어)  (2) 2023.10.26

+ Recent posts