본문 바로가기

교육 및 자격증/스터디

GH(NOB); SQL 인젝션

728x90

 

SQL 인젝션 공격이란?

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

 

 - 주로 웹사이트에서 DB안에 개인정보를 탈취할 때 사용한다.

 - '(싱글쿼터, 작은 따옴표), #(주석), 등을 이용해서 문법 형식을 파괴한다.

 ex) ' or 1=1# //#은 #뒤에 나오는 것을 주석처리한다.

 - DB에 악성 스크립트를 삽입하여 접근하는 사용자를 피싱 사이트로 유도

 - Stored Procedure(저장된 프로시저)를 통한 OS 명령어 실행

 

 - owasp top10에서 인젝션

sql 인젝션은 owaasp top 10에서 1위를 하다가 2021년에 XSS공격과 합쳐지며 3위로 빈도수가 줄었다.

https://choimungu.tistory.com/202

 

 - SQL Injection 공격 종류

공격방식에 따른 분류

1. form sql injection

 : HTML Form 기반 인증을 담당하는 애플리케이션의 취약점이 있는 경우 사용자 인증을 위한 쿼리문의 조건을 임의로 조작하여 인증을 우회하는 기법.

 - 쿼리문의 조건절(where절)이 항상 참이 되도록 쿼리문 조작

 - 공격이 성공한 경우, 반환되는 레코드 셋의 첫 번째 레코드에 해당하는 사용자 권한을 획득하게 된다.

ex) 로그인 폼에

 ' or 1=1#, ' or '1'='1'#, 'or 'a'='a'#.. 처럼 1=1로 무조건 참이 되게 하는 연산 만들기

 

2. union select  sql injection

 : 쿼리를 이용하여 한 쿼리의 결과를 다른 쿼리의 결과에 결합하여 공격하는 기법

 - union 문은 2개 이상의 select문을 결합하고자 할 때 사용하며 이때 주의할 점은 각각의 select 문의 필드 개수가 같아야 하며 필드 타입이 호환 가능해야 한다.

Union all : 단순히 2개 이상의 select문 쿼리 결과를 합해서 보여준다.

일반 union : 2개 이상의 select 문 쿼리 결과에서 중복을 제거하고 보여준다.

 

 - union 컬럼 개수 파악하기 

union select문을 성공하기 위해선 컬럼 개수가 일치해야 한다.

  • order by절 - orderby 절은 컬럼 인덱스를 지정할 수 있는데 지정한 인덱스의 컬럼이 없으면 오류가 발생한다는 점을 이용한다.
  • union select문 - 컬럼 개수가 맞지 않으면 오류가 발생한다는 특성을 이용이용한다.

  

ex)

정상 : select id, pass from member where id = 'admin'; //select sql 쿼리 문으로 member테이블에서 admin id의 비밀번호 정보를 조회하는 명령어다.

결과

id pass
admin 1234

 

비정상 :  select id,pass from member where id='' union select 'admin', 'admin'; //union select문을 이용하여 where id를 빈값('')으로 설정하여 결과 레코드가 없도록 만든 후 뒤 pass값을 admin으로 해서 결과를 반환한다.

결과 : 1234 였던 pass를 admin으로 변경시켰다.

id pass
admin admin

 

3. stored procedure sql injection

저장 프로시저는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. 즉, 웹에서 접근권한을 가지는 것.

ex)

 - sql 서버의 xp_distree 확장 프로시저 실행

xxx.php?no=123;EXEC master..xp_dirtree 'C:\' //공격자가 no 파라미터와 함께 세미콜론(;) 문자를 통해 명령어를 연속 수행시키면서 xp_dirtree 확장 프로세저를 실행

 -> c:\의 파일목록을 확인할 수 있다.

 

 - 위 공격이 성공하면 레지스트리 변경을 통해서 윈도우 도움말 실행 시 공격자가 심어놓은 악성코드가 실행하게 되어 서버에 치명적인 공격을 가할 수 있다.

 

4. mass sql injection

 : 기존 sql 인젝션의 확장된 개념으로 한 번 공격으로 대량(mass)의 DB값이 변조되어 홈페이지에 치명적인 영향을 미치는 공격.

 - DB값 변조 시 악성 스크립트를 삽입하여, 사용자가 변조된 사이트 방문 시 감염되거나 악성 bot(DDoS로 사용 가능)이 설치된다.

 - 악성 스크립트는 보통 [js, swf, exe 파일 이용]

 - 관련뉴스

https://www.boannews.com/media/view.asp?idx=27406

 

공격 유형에 따른 분류

5. error based sql injection

 : DB쿼리에 대한 에러값을 기반으로 한 단계식 점진적으로 DB정보를 획득할 수 있는 방법이다.

 - 최근에는 웹서버 강화로 많진 않지만 과거에 많이 사용

 

ex)

xxx.php?no=' having 1=1--

//리턴값[MS][ODBD SQL 서버][SQL 서버] 'member.no'열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다. -> 리턴값을 보면 group by절이 없다고 해서 다음 컬럼에 group by절을 넣어서 에러를 확인

 

 - 다음 컬럼 정보 얻기

xxx.php?no=' group by member.no having 1=1--

//리턴값[MS][ODBD SQL 서버][SQL 서버] 'member.name'열이 집계 함수나 Group By절에 없으므로 select 목록에서 사용할 수 없습니다. -> 리턴값에서 새로운 정보 member.name 열 확인

 

 

6. Blind based sql injection

 : 쿼리 결과의 참과 거짓을 통해 의도하지 않은 sql문을 실행함으로써 데이터베이스를 비정상적으로 공격하는 기법

 - 조건이 참이면 페이지를 정상 출력, 거짓이면 페이지가 출력되지 않는다.

예)

Select * From users where name= '$name' AND pw = '$pw'; // 로그인 폼

입력 폼

name : admin ' 1=1 --' //공격 코드

pw : 아무값 // --란 주석으로 패스워드는 어떤 값이 들어가도 상관 없음

 

실제 들어가는 코드

select * from users where name='admin' or 1=1 --' and pw='아무값'

 

 - 대응방안

  1. 입력값 검증 - DB와 연동하는 스크립트의 모든 파라미터를 점검하여 사용자의 입력값에 SQL 쿼리문에 이용되는 특수문자(', ", \, ;, :, %, space, # 등) 및 select, update, insert, delete union 등의 sql 관련 문자열을 필터링한다.
  2. 입력되는 문자열의 길이를 제한하고 숫자일 경우 숫자인지 체크하는 함수를 사용한다.
  3. MS-SQL의 경우 master..xp_cmdshell, xp_startmail, xp_sendmail과 같은 확장 프로시저는 운영체제 명령 실행, sql 인젝션 등에 이용되기 때문에 제거하는 것이 안전하다.
  4. 웹 애플리케이션이 사용하는 DB 사용자 권한을 제한한다.
  5. 선처리 질의문(Prepared Statement)을 이용하면 SQL 쿼리문을 선처리 하여 이후 입력되는 변수 값을 항상 문자열 변수로 다루기 때문에 사용자가 어떤 악의적인 변수를 삽입하더라도 sql 인젝션을 막을 수 있다.

 + 무료 SQL 인젝션 취약점 스캐너

  • Nikto : GNU 기반 오픈소스로 웹서버 및 SQL 인젝션에 대한 취약점 점검(리눅스 전용)
  • SQLMap : 블라인드 SQL 인젝션을 자동으로 수행하는 도구로 python에서 개발
  • Absinthe : GUI 기반의 도구로 블라인드 sql 인젝션 취약점에 이용, DB의 스키마와 목록을 자동화 과정으로 다운로드한다.

 

 - 요약

owasp top10 순위에서 밀려났지만 여전히 강력하다.

sql 인젝션의 대응 방안으로 입력값 검증을 할 수 있지만 이에 대항하고자 필터링 우회 방법도 많다.

https://blog.munsiwoo.kr/2019/12/mysql-injection-techniques/

하지만 실제로 취약점 점검을 진행해보면 어느정도 보안을 해놓은 곳에선 sql인젝션 공격은 어렵다.

 

 

 - 출처

정보보안기사 알기사 실기책

https://velog.io/@yu-jin-song/DB-SQL-%EC%9D%B8%EC%A0%9D%EC%85%98SQL-Injection

https://owasp.org/Top10/A03ㅁ_2021-Injection/

https://gomguk.tistory.com/58