DoR@Hee의 끄적끄적

SQL Injection 종류 본문

취약점 진단/WEB

SQL Injection 종류

DoR@Hee 2019. 4. 27. 18:25
  • SQL Injection 이란?

4년에 한 번 가장 위험한 웹 애플리케이션 보안 위험 10가지를 알려주는 owasp10에 주기적으로 1등을 하고 있는 

Web Hacking 기법으로써 Database에 쿼리문(질의문)을 넣는 과정에서 데이터를 임의적으로 조작 원하는

SQL 구문을 실행하는 기법이다.

SQL Injection 에 기본원리는 WEB과 DB서버 간에 사용되는 쿼리를 우회 원하는 쿼리로 조작을 해  참으로 만들어 원하는 데이터를 추출할 수 있다.

 

간단한 예제로 확인해 보면

 

[그림1] test 테이블

테이블을 간단히 [그림1]와 같이 정의한다

 

[그림2] 인증 쿼리

일반적으로 로그인 인증을 할 때 쿼리문을 and 연산으로 사용해서 한다 결과값은 당연히 거짓

 

[그림3] 거짓

당연히 아무런 결과값도 안나온다.

 

[그림4] 쿼리 우회

하지만 [그림4]와 같이 쿼리 구문을 우회했을 때 

일반적으로 mysql 에서는 or 연산보다 and 연산이 우선순위가 높기 때문에

1=1 and pw = 'guest'를 먼저 하게 된다 결과값은 false

여기서 and 연산은 false이기 때문에  그 다음 or 연산을 진행한다

id = 'admin' or false 

or 연산은 조건식 중 한가지만 ture 면 ture 이기 때문에 전체적인 쿼리는 true가 된다. 

 

[그림5] 인증 성공

[그림5] 와 같이 id 와 pw 값을 확인 할 수 있다.

 

  • Error Based SQL

일반적으로 web 서버와 db 서버간에 통신을 진행할 때 쿼리문이 맞지 않을 경우 에러가 발생할 수 있다

이러한 에러를 기반으로해서 SQL injection을 진행할 수 있다. '(싱글 쿼터)를 넣을 때 발생하는 syntax error를 이용하여 쿼리문을 유추 할 수 도 있고, 참 거짓을 판별하는 쿼리문을 넣어 에러에 따라 값을 추출할 수 도 있다.

 

[그림6] mysql syntax error

 

wargame 문제를 통해 알아보면

 

[링크1] https://dorahee.tistory.com/134

 

los - iron_golem

문제 지금까지 와 문제는 다른 문제이다 Hello guest, Hello admin 등 결괏값에 따른 문자열을 찾아볼 수 없고 sleep, benchmark 등 time based sql injection 구문을 막고 있다. 문제를 확인 하기 위해서 '(싱..

dorahee.tistory.com

[링크 1]와 같이 에러를 기반으로 참 거짓을 판별해 값을 추출한다.

 

  • Union Based SQL

Union SQL Injection 은 기본으로 작성되는 쿼리 + UINION 쿼리를 이용해서 값을 얻는 방법이다

UNION 구문을 사용 할 경우에는 기존에 쿼리에 작성되는 칼럼에 갯수가 똑같아야 하며 칼럼의 갯수가 다를 경우 에러가 나타난다 Union 구문을 통해 칼럼의 갯수를 알아 내는 것도 가능하다. 

 

[그림7] mysql 에서의 UNION 구문
[그림8] UNION 구문에 따른 결과값

첫번째 값은 

SELECT * FROM 'here' where name = 'guest' 에 대한 결과값 이고

두번째 값은

SELECT name,1,1,1 from here where name = 'admin'에 대한 결과 값이다. 

 

또한 다른 방법으로는 

 

[그림10] mysql 변수를 이용한 union 문 응용

@a 라는 변수에 name 이 admin에 message를 담고 union 구문을 이용하여 출력한다

이 구문에서 중요한점은

(SELECT @a:message where name = 'admin')은 항상 거짓을 의미하기 때문에 and로 바꿀 시 null 값이 출력된다.

 

[그림11] admin 에 대한 message 값이 no 칼럼에 나타남

 

  • Blind SQL 

Blind SQL은 Error를 확인  할 수 없으나, 쿼리에 따라 참, 거짓에 결과값이 다를 때 웹 어플리케이션에 반응을 확인하여 공격하는 기법이다

 

2.Boolean  SQL 참 거짓에 따라 발생되는 쿼리를 이용해 값을 유추 https://dorahee.tistory.com/108?category=735413

 

Blind Sql Injection - 데이터베이스 이름 가져오기

1-1 Blind Sql Injection 이란? - 일반적인 SQL Injection은 DB에서 도출되는 내부 오류를 이용해서 SQL 공격을 하지만 그러한 에러 구문이 안보일 경우 쿼리에 참, 거짓에 따라 다른 만들어내는 데이터를 기준으..

dorahee.tistory.com

 2. Time Based SQL 

일반적으로 참 거짓에 따른 웹 사이트에 반응을 알 수 없을 때 사용하는 기법으로 sleep 구문을 이용한다 ex) if(a>b, sleep(5), 

 

  •  
Comments