본문 바로가기

old/Cyber Security

웹해킹: SQL injection

반응형

정의

SQL injection이란 악의적인 SQL 질의문을 삽입하여 데이터베이스 시스템을 공격하는 기법입니다.

데이터 추출, 변조, 인증 우회 등등이 가능합니다.

취약점 발생 지점 리스트

  • 사용자 입력이 되어 인증하는 모든 곳
  • 로그인 아이디, 비밀번호
  • 게시글 검색

취약점 검증 방법

  • php로그인창의 경우: select id, pwd from table where id =’input’ 라고 한다고 추측하면, 아래와 같이 아이디를 사용하여 로그인이 되는지 확인
아이디'+and+(1=1)+and+'1%'='1
  • php검색창의 경우: 3+4를 했을때, 7이 검색이 된다면 필터링이 없다는것을 추측 가능.
3+4
  • php검색창의 경우: 검색은 보통 ‘%%’이므로, 바로 검색을 하는지 아래 코드로 검색이 되는지 확인
검색어%'+and+(1=1)+and+'1%'='1

sqli의 종류

  1. Union-based SQL Injection: UNION 연산자를 이용하여 쿼리의 결과를 조작합니다.
  2. Error-based SQL Injection: 오류 메시지를 이용하여 데이터베이스의 구조를 파악하고 정보를 추출합니다.
  3. Blind SQL Injection: 참/거짓 기반의 결과를 통해 정보를 추출하는 방법입니다.

공격 순서

  1. 추리: 서버에서 어떤 sql 질의문 사용하는지 결과물을 보고 추측합니다.
  2. 취약점 확인: sql injection이 통하는지 확인한다.
  3. sql 질의문 선택: 어떤 sqli을 사용할지 결정한다.
  4. Data 출력 위치 파악: 만약에 검색 리스트가 보인다면, 컬럼을 몇개 사용하고 있는가?
  5. 사용할 base sql injection 만들기
  6. Database, Table, Columns이름 가져오기
  7. 데이터 추출

로그인 인증 과정

SQLi 공격 과정

1. 추리: 서버에서 어떤 sql 질의문 사용하는지 결과물을 보고 추측합니다.

ex) 인증과 식별을 동시에 하는가? 따로 하는가?

웹 개발: 식별과 인증이란

ex) overwatch를 검색할때, over만 검색해도 나오는가?

2. 취약점 확인: sql injection이 통하는지 확인한다.

ex) ‘ #

ex) and ‘1’=’1

3. sql 질의문 선택: 어떤 sqli을 사용할지 결정한다.

ex) 리스트가 보인다. 게시판, 회원정보(마이페이지), 주소검색,검색페이지…etc → Union-based SQL Injection

ex) 오류메세지가 보인다→Error-based SQL Injection

ex) 로그인 실패만 보인다. 로그인, 아이디 중복 체크…etc →Blind SQL Injection

4. Data 출력 위치 파악: 만약에 검색 리스트가 보인다면, 컬럼을 몇개 사용하고 있는가?

ex) 보이는 컬럼의 수와 서버에서 검색하는 컬럼 수는 다를수 있다.

5. 사용할 base sql injection 만들기

기본적인 틀을 만들어서 나중에 실수하지 않도록 한다.

6. Database, Table, Columns이름 가져오기

이미 사용할 sql질의문과 data출력 위치를 모두 찾았으므로, 필요한 정보를 가져온다.

7. 데이터 추출

SQL injection 성공.

공격 예제

SQL Injection 공격기법 리스트

웹 해킹 예제: union base sql injection_CTF: 노말틱 DB 데이터 추출 1

웹 해킹 예제: Error base sql injection_CTF: 노말틱 DB 데이터 추출 2

웹 해킹 예제: blind sql injection_CTF: 노말틱 DB 데이터 추출 3

대응 반안

필터링은 최후의 수단, 아주 소극적인 방법. 사람들이 아예 못쓰게 만드는 문제임

근본적인 문제는 sql질의문에 사용자의 입력이 그대로 들어가기 떄문이므로, 궁극적인 방어수단은 prepared Statement 임.

preparedStatement

preparedStatement를 쓰면 문자를 오직 문자열만으로 인식함.

미리 컴파일을 해놓는 방식을 사용함.

하지만 PreparedStatement을 써도 문제가 생겨나는 경우가 있음.

  1. preparedStatement를 잘못 쓴 경우.
  2. sql="select "..""
  3. 옛날에 만든 코드(라이브러리)
  4. 그러면 새로운 사람이 옛날 코드를 건드릴수 없으므로, 겉에다가 필터링을 가볍게 거는 경우가 있음. 그러면 우회가 가능함.
  5. 몇몇 커맨드는 적용이 되지 않음 →이런경우 whitelist 기반으로 필터링을 함.
    select * from board where id~~~ order by $_GET['sortOrder']
    
    sortOrder=date
  6. 라면 date가 바로 들어가므로, 이를 이용해서 sql injection가능
  7. order by, table, column
반응형

'old > Cyber Security' 카테고리의 다른 글

CSRF (Client Side Request Forgery) 란  (0) 2023.06.03
사이버 보안: XSS이란  (0) 2023.05.23
아스키 코드 표  (0) 2023.04.30
16진수 아스키 코드 표  (0) 2023.04.30
8진수 아스키 코드표  (0) 2023.04.30