W3_H1_SQL injection

·2023년 4월 19일
0

노말틱 취업스터디

목록 보기
10/16
post-thumbnail

💻 SQL injection

SQL injection : 응용 프로그램 내 보안 상 허점을 이용하여, 악의적 SQL 문을 넣어 실행되게 함으로써 데이터베이스를 비정상적으로 조작하게 된다.

사용자의 입력값이 서버측에서 코드로 실행되는 '코드 인젝션' 기법 중 하나이다. 클라이언트 측의 SQL 쿼리에 신뢰할 수 없는 데이터가 입력되었을 경우, 데이터가 쿼리 로직의 일부로 해석되어 DB에서 실행될 때 발생한다.

SQL injection 으로 인한 문제점

  • 정보의 유출
  • 저장 데이터의 유출 및 조작
  • 원격 코드 실행
  • 인증 우회

✍🏻 SQL injection Example

$username = $_POST["username"];
$password = $_POST["password"];

$mysqli->query("SELECT * FROM users WHERE username='{$username}' AND password='{$password}'");
user name = admin
password = password' OR 1=1

입력 시, 쿼리문은 아래와 같이 바뀌게 된다.

SELECT * FROM users WHERE username='admin' and password='password' OR 1=1--

이 때, 1=1은 항상 참이되므로 유저네임이 admin인 아이디로 로그인이 가능하게 된다.
'--' 는 주석의 의미로 이후 서브쿼리를 모두 의미없는 문자열로 만들어버린다.

✍🏻 SQL injection 예방

1. ESCAPE 함수 사용

mysqli_real_escape_string() 함수 사용

$username = $mysqli->real_escape_string($_POST["username"]);
$password = $mysqli->real_escape_string($_POST["password"]);

2. Prepared Statement 적용하기

: 매개변수화된 구문을 사용하여 동일한 구문 실행에 있어 SQLi 공격을 방지한다. 또한, 바인딩된 변수가 쿼리와 별도로 서버로 전송되어 사용자가 입력한 구문이 쿼리로 실행되지 않는다.

3. 블랙리스트 & 화이트 리스트 기반 필터링

블랙 리스트 기반 필터링 : SQL 쿼리 구조를 변경하는 특수문자 및 SQL 예약어를 미리 등록하고, 입력을 제한하는 방식이다. 해당 문자 입력 시 준비된 문자열로 치환되거나 에러 메시지가 뜨게된다.

화이트 리스트 기반 필터링 : 허용되는 문자열을 등록하고 리스트 이외 문자열 입력 시 차단한다.

4. 오류 메시지 출력 제한

5. DB 보안 적용

관리자 DB 계정과 웹애플리케이션 운영 계정 권한의 분리가 필요하다.

ETC. 웹 방화벽 사용, 주기적 로그 및 취약점 점검

🍳 로그인 접근통제 용어

  • 식별(Identification) : 사용자가 자신이 이용하려는 서비스의 인증 허가를 받기 위해 자신의 신분을 밝히는 것을 말한다.
    ex) ID, MAC Adress, IP, RFID...

  • 인증(Authentication) : 시스템이 자신의 신원을 밝힌 사용자를 여러 인증 방식에 의거하여 시스템에 접근 가능한 사용자라는 것을 인증해주는 것을 말한다.
    ex) 지식 기반 인증, 소유 기반 인증, 존재 기반 인증 등

1. 로그인 식별 및 인증 동시 케이스

  • 사용자가 id 값을 'apple', psw 값을 'sweet' 으로 입력했을 시, DB에서 id 값은 apple이고, psw가 sweet으로 정확히 일치하는 사용자를 한번에 찾는 경우
String sql = "SELECT * FROM users WHERE id=apple AND psw=sweet";

2. 로그인 식별 및 인증 분리 케이스

  • 사용자가 id 값을 'apple', psw 값을 'sweet' 으로 입력했을 시, DB에서 id 값 apple을 먼저 찾고, id 값이 apple 인 사용자 중 psw가 sweet 인 사용자를 찾는 경우
String sql = "SELECT sweet FROM users WHERE id=apple";

if (psw.equals(dbPsw)) {
        System.out.println("로그인에 성공하였습니다.");
    } else {
        System.out.println("비밀번호가 일치하지 않습니다.");
    }

🤍 참고

profile
화이트해커 꿈나무 엘입니다😉

0개의 댓글