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='아무값'
- 대응방안
- 입력값 검증 - DB와 연동하는 스크립트의 모든 파라미터를 점검하여 사용자의 입력값에 SQL 쿼리문에 이용되는 특수문자(', ", \, ;, :, %, space, # 등) 및 select, update, insert, delete union 등의 sql 관련 문자열을 필터링한다.
- 입력되는 문자열의 길이를 제한하고 숫자일 경우 숫자인지 체크하는 함수를 사용한다.
- MS-SQL의 경우 master..xp_cmdshell, xp_startmail, xp_sendmail과 같은 확장 프로시저는 운영체제 명령 실행, sql 인젝션 등에 이용되기 때문에 제거하는 것이 안전하다.
- 웹 애플리케이션이 사용하는 DB 사용자 권한을 제한한다.
- 선처리 질의문(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/
'교육 및 자격증 > 스터디' 카테고리의 다른 글
GH(NOB); XSS(크로스 사이트 스크립트) (0) | 2023.03.17 |
---|---|
GH(NOB); 크로스 사이트 요청 변조(CSRF: Cross Site Request Forgery) (0) | 2023.03.17 |
GH(NOB); 세션(Session) vs 쿠키(Cookie) (0) | 2023.03.01 |
DB(Database) (0) | 2023.02.26 |
1; jsp, asp, php? (0) | 2023.02.16 |