Today I Learned …

[수업] 2주차 정리 본문

Study/수업

[수업] 2주차 정리

염베리 2021. 10. 22. 09:20

* 해당 주차의 수업 내용을 정리합니다.


0. 들어가기 전

[1] OWASP TOP 10

⇒ 웹 어플리케이션 취약점 TOP 10. 현업에서도 많이 참고한다.

[2] 쿠키/세션

① 쿠키 : 클라이언트 측에 저장되는 정보

② 세션 : 서버 측에 저장되는 정보

③ 세션 ID : 쿠키에 저장되는 세션 식별 정보

session_start() : 세션 아이디 발급

$_SESSION['id'] = 'choco' : 세션 아이디의 데이터 안에 id=choco 라는 일종의 변수 정보가 저장되는 것

$ php -i | grep session.save_path

⇒ 세션 파일 위치 확인 가능

⇒ 들어가서 파일 별로 cat 해보면 id|s:5: choco 라고 들어가있는 식

⇒ 직접 해보기 : 오 진짜 된다... 신기ㄷ

 

1. SQL

DB와 대화하기 위한 명령어 (조회, 수정, 삭제...)

[1] Database (관계형 DB)

⇒ 엑셀

① 엑셀 파일 = Database

② 엑셀 시트 = Table

③ 열 = Column

④ 행 = Row

[2] SELECT [컬럼명] FROM [테이블명]

[3] WHERE : 조건절

 

2. 로그인 인증

[1] 식별 : 많은 데이터 중 특정 데이터를 구분하는 작업

⇒ 식별 정보 : ID, 이름, 사번 등

⇒ 보호할 필요 X

[2] 인증 : 그 사람이 맞는지 확인하는 작업

⇒ 인증 정보 : PW, OTP 등

⇒ 보호해야하는 정보!

[예외] 주민등록번호 : 고유식별정보

⇒ 때에 따라선 인증 정보로 쓰이기도 함

 

3. 로그인 인증 5가지 유형

[1] 식별/인증 동시

⇒ SQL 실행 한 번으로 식별/인증 동시 처리

 sql = "SELECT * FROM member WHERE id=' ' and pass=' '"

 

[2] 식별/인증 분리

⇒ 따로

sql = "SELECT pass FROM member WHERE id='choco'"

res = sql.execute

if (pass == res.pass)
	// 로그인 성공
else:
	// 로그인 실패

 

[3] 식별/인증 동시 with hash

sql = "SELECT * FROM member WHERE id = ' ' and pass = md5(' ')"

 

[4] 식별/인증 분리 with hash

sql = "SELECT pass FROM member WHERE id='choco'"

res = sql.execute

if (md5(pass) == res.pass)
	// 로그인 성공
else:
	// 로그인 실패

 

[5] 식별/인증 분리 with 개행

⇒ 이 경우 주석 안통함

Normaltic : 실무에서는 웬만하면 주석 안쓰는게 좋음 (잘 안통하고 DB 꼬일 수도 있음)

sql = "SELECT * FROM member WHERE id = ' ' and \n pass = ' '"

 

4. SQL Injection

[1] 왜 발생?

⇒ 전달받은 파라미터를 SQL 질의문에 그대로 사용하고 있기 때문에

 

[2] 어디에서 발생?

⇒ DB에서 데이터를 처리하는 모든 기능 (로그인, 회원가입, 게시글 검색 등)

 

[3] 공격 시나리오

① 인증 우회

② 데이터 탈취

③ 데이터 변조

④ 서버 장악 (쉘 장악) : DB에 임의의 명령을 실행할 수 있다.

 

5. SQL Injection 인증 우회

[0] TIP

⇒ 서버 측 로직이 어떻게 이루어져 있을 지 예상을 해봐야함.

⇒ 케이스별 쿼리 상황을 머릿속에 그리는 연습. 처음엔 메모장에 써보기. (복붙으로 문법 확인)

⇒ 무지성 대입 X

 

[1] 식별/인증 동시

① admin' --

② admin' or 1=1 --

③ admin' or '1' = '1

⇒ SELECT * FROM member WHERE id = 'admin' or ('1' = '1' and pass = ' ')

⇒ 논리연산자 우선순위에 의해 and가 먼저 실행되기 때문에 아래와 같다.

⇒ id = 'admin' or False

⇒ id = 'admin'

 

[2] 식별/인증 분리

UNION : SELECT를 두 번!

(SELECT ~~~) UNION (SELECT ~~~)

ID : ' UNION SELECT '1234', 'normaltic

PW : 1234

ID에 넣은 쿼리문을 통해

PASS | NAME

1234 | normaltic

를 만들어놓고 PW에 1234를 넣으면 해당 값이 PASS 컬럼에 존재하기 때문에 고대로 로그인 됨;

⇒ 테이블 구조는 order by 트릭을 통해 파악할 수 있음

 

[3] 식별/인증 동시 with hash

[1]과 다르지 않음

 

[4] 식별/인증 분리 with hash

ID : ' UNION SELECT md5('1234'), 'normaltic

PW : 1234

 

[5] 식별/인증 분리 with 개행

주석 안 통함

ID : normaltic' and '1' = '1


2주차 과제

1. 로그인 페이지 케이스별 개발

2. 보고서 (SQL Injection 인증 우회) : 카톡 채널로 제출

'Study > 수업' 카테고리의 다른 글

[수업] 5주차 정리  (0) 2021.11.18
[수업] 4주차 정리  (0) 2021.11.04
[수업] 3주차 정리  (0) 2021.10.29
[수업] 1주차 정리  (0) 2021.10.16
[수업] OT 정리  (0) 2021.10.16
프로필사진
berry
FE Developer, loves React & better DX
Comments