티스토리 뷰

Web Application에서 입력 받아 데이터베이스로 전달하는 정상적인 SQL 쿼리를 변조, 삽입하여 불법 로그인, DB 데이터 열람, 시스템 명령 실행 등을 수행하여 비정상적인 데이터베이스 접근을 시도하는 공격

 

무료 SQL Injection 취약점 스캐너

Nikto, SQLMap, Absinthe

 

Form SQL Injection 

  • 사용자 인증을 위한 쿼리문의 조건을 임의로 조작하여 인증을 우회하는 기법
  • 쿼리문의 조건절(where절)이 항상 참이 되도록 쿼리문 조작

값이 데이터베이스 서버까지 전달됨

에러 메시지가 발생한다면 입력한 값이 데이터베이스 서버까지 전달되어 처리 중 오류가 방생한 것을 알게됨 

데이터베이스 서버까지 전달되었다 = 입력한 값에 대한 검증이 이루어지지 않았다. => 공격자는 땡큐!

where절이 참이 되게 하는 취약한 구문들 'or1=1# ,'or'1'=;1'# , 'or'a'='a'#

 id=''or1=1#'and~     id=''or'1'='1'#'and~  id=''or'a'='a'#'and~

실제 db엔 이런식으로 값이 입력됨- 모든 사용자 정보가 나옴

실제 db엔 이런식으로 값이 입력됨- 모든 사용자 정보가 나옴

 

대응책

입력값에 대한 검증이 필요 - 입력할 수 없는 특수문자들 다 제거

 

1.특수문자(',") -> 일반 문자로 치환

'A' => \' (백슬래시는 넣으면 일반문자로 치환됨)

 

2.php 설정파일에서 (php.ini)magic_quotes_gpc 설정 을 on을 하게 되면 특수문자를 일반문자로 치환해줌 

 

magic_quotes_gpc : get, post, cookie 방식으로 전달되는 데이터의 특수문자를 일반문자로 치환해 주겠다

-> '특수문자의 escape 처리' 라고 함 ,\ 백슬래시가 자동으로 들어감 

실제로는 mysql_real_escape_string()과 같은 mysql 라이브러리 함수 같은 걸 씀 

mysql_real_escape_string함수

'(single quote)가 이스케이스 처리(백슬래시추가)

 

3.Prepared Statement (선처리 질의문)

원래는 성능때문에 만들어짐. 외부로부터의 입력값(변경되는 값)을 제외한 쿼리 부분을 미리 컴파일(쿼리분석 및 최적화) 한 후, 반복적으로 입력값만을 설정해서(이를'바인드'한다고 표현) 실행하는 방식으로 성능상의 장점과 더불어 쿼리문 자체는 미리 컴파일 되어 입력값에 의해 영향을 받지 않으므로 SQL Injection 공격을 방어하는 효과. 

언어마다 다름 시험공부는 php로..

성능상의 이점과 보안상의 이점을 다 가져 올 수 있음 

'or1=1# 이 문자열 전체를 아이디로 봄 

 

4. 파라미터 필터링을 통한 SQL Injection 방지

  • blacklist 기반의 필터링을 통한 실행 차단 or white list 기반의 필터링을 통한 실행 허용

php 코드 -> 서버 스크립트 웹어플리케이션서버쪽에서 동작( AWS 서버에서 동작) 

php, jsp 등 서버측 스크립트 언어들이 웹 서버에서 동작해서 결과를 클라이언트에게 전달해주는것

 

정리 

 

1. SQL  Injection 공격

  • 입력값(사용자)에 대한 검증을 수행
  • SQL Injection 관련 특수문자들을 치환한다.(php.ini, magic_quotes_gpc=On, mysql_escape_string())
  • 블랙리스트 기반의 필터링을 통해 실행 차단
  • Prepared Statement 활용 ? ? ->사용자 입력값을 바인드 하기 위한 지점 

입력값 검증이 아닌 발생한 공격 방식(비밀번호 우회)에 대한 방어 로직을 구성한 형태

 

 

 

 

 

SQL Injection에 대한 입력값을 검증하기 위한 방법으로 인증을 수행해야 하는데

공격패턴을 보고 logic으로 방어하면 안됨 

공격자의 생각) 그럼 쿼리의 결과로 나오는 패스워드를 임의로 조작할 수 있지 않을까?

이걸 가능하게 해주는 게  union select문 

둘 이상의 select 문을 합쳐서 하나의 결과로 보여줌 

union select문

unionselect문을 쓸 때

1.선행컬럼과 후행 컬럼이 같아야함

2.선행과 후행둘 사이의 타입이 상호 호환이 되야함

DB쿼리를 하면서 union select를 이용해서 원하는 결과를 만듦

 

The used SELECT statements have a different number of columns

UNION 컬럼 개수가 맞지 않다는 오류 

 

    부분 긁어서 id로 사용

sql Injection은 입력값 검증으로 막아야함

 

컬럼 갯수 파악

1.order by의 인덱스를 1씩 증가시키면서 SQL 에러 발생 여부를 체크 

union select 문을 파라미터로 전달하여 admin id에 대한 비밀번호를 admin으로 위조한다. 위조된 비밀번호($pass)파라미터를 전달하여 인증을 우회하려는 기법

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함