SQL Injection

justugi·2024년 5월 16일

웹 취약점 진단

목록 보기
4/19

주의사항 : 이 포스팅은 개인 학습 및 교육적 목적으로 작성되었으며, 제공하는 정보를 악용하여 불법적인 행위를 하는 것은 엄격히 금지되어 있습니다. 웹 취약점 진단은 해당 웹사이트의 소유자의 명시적인 허가 없이는 수행해서는 안되며, 웹 취약점을 발견하였을 경우 즉시 해당 웹사이트의 소유자나 관리자에게 알려야 합니다.

SQL Injection

: 웹 보안 취약점을 이용해 SQL 쿼리문을 실행시켜서 공격자가 원하는 데이터베이스의 비정상적인 동작을 일으키는 공격이다. SQL Injection으로 DB에 조작된 명령을 실행할 수 있기 때문에 인증 우회 , 데이터 탈취 및 변조, 서버 장악 등이 가능하다.

  • Normal SQL Injection : 무조건 참이 되게 하는 구문을 입력 후 이후 문장을 주석처리하여 원하는 SQL문을 실행시킨다.
  • Error based SQL Injection : 논리적 에러가 있는 구문을 삽입하여 생성된 에러 메세지를 통해 DB정보를 알아낸다.
  • UNION based SQL Injection : 얻고자 하는 릴레이션과 같은 컬럼 수를 가지는 임의의 릴레이션을 생성하여 UNION 연산 후 이후 문장은 주석처리하여 원하는 SQL문을 실행시킨다.
    • SELECT문의 order by가 컬럼의 index번호로 정렬할 수 있으므로, 컬럼 갯수 보다 큰 수로 order by 정렬하면 에러가 발생한다.
  • Boolean based Blind SQL Injection - 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. subString 함수 등을 이용하여 조건을 임의적으로 조작하면서 참인 경우(페이지가 뜨는 경우 등)만 간추려서 DB구조를 파악하거나 테이블명, 컬럼명 등을 특정하는 방법이다.
  • Time based Blind SQL Injection - 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우에 사용한다. sleep() 함수 등을 이용해서 참이면 몇 초 뒤 페이지 출력, 거짓이면 바로 출력되는 식으로 참거짓을 판별한다.

점검 절차

  1. 게시판에서 게시물 번호 등에 해당하는 파라미터에 참/거짓 쿼리문을 입력하여 서로 다른 결과 페이지가 출력되는지 확인한다.
  2. 취약점이 존재하는 경우 참에 해당하는 쿼리문에서는 일반적으로 게시물 내용이 출력되고, 거짓에 해당하는 쿼리문에서는 게시물 내용이 안보이거나 에러가 발생한다.
  3. 참/거짓에 대한 결과가 보이지 않는 경우, 블라인드 인젝션을 이행하여 DB 버전, DB 이름, DB 사용자 정보 획득이 가능한지 확인한다.

보안 대책

  1. php에서 prepare 함수 등을 사용하여 사용자의 입력과 쿼리문을 분리하거나 Prepared Statement를 사용하여 사용자의 입력을 문자열로 인식하도록 한다.
  2. DB 계정에 최소한의 권한을 부여한다.
  3. 에러 발생 시 웹 서버 또는 WAS에서 통일된 에러 페이지를 출력하거나 아예 에러 페이지를 출력하지 않도록 설정하여 에러 정보와 DB 정보 노출을 방지한다.

출처
https://m.blog.naver.com/PostView.naver?blogId=lstarrlodyl&logNo=221837243294&navType=by
https://hanuscrypto.tistory.com/entry/SQL-Injection-Error-Based-SQL-Injection
https://blog.naver.com/shackerz/220449932926

profile
IT 보안, 관심 있는 것을 공부합니다.

0개의 댓글