DoR@Hee의 끄적끄적
SQL Injection 종류 본문
-
SQL Injection 이란?
4년에 한 번 가장 위험한 웹 애플리케이션 보안 위험 10가지를 알려주는 owasp10에 주기적으로 1등을 하고 있는
Web Hacking 기법으로써 Database에 쿼리문(질의문)을 넣는 과정에서 데이터를 임의적으로 조작 원하는
SQL 구문을 실행하는 기법이다.
SQL Injection 에 기본원리는 WEB과 DB서버 간에 사용되는 쿼리를 우회 원하는 쿼리로 조작을 해 참으로 만들어 원하는 데이터를 추출할 수 있다.
간단한 예제로 확인해 보면
테이블을 간단히 [그림1]와 같이 정의한다
일반적으로 로그인 인증을 할 때 쿼리문을 and 연산으로 사용해서 한다 결과값은 당연히 거짓
당연히 아무런 결과값도 안나온다.
하지만 [그림4]와 같이 쿼리 구문을 우회했을 때
일반적으로 mysql 에서는 or 연산보다 and 연산이 우선순위가 높기 때문에
1=1 and pw = 'guest'를 먼저 하게 된다 결과값은 false
여기서 and 연산은 false이기 때문에 그 다음 or 연산을 진행한다
id = 'admin' or false
or 연산은 조건식 중 한가지만 ture 면 ture 이기 때문에 전체적인 쿼리는 true가 된다.
[그림5] 와 같이 id 와 pw 값을 확인 할 수 있다.
-
Error Based SQL
일반적으로 web 서버와 db 서버간에 통신을 진행할 때 쿼리문이 맞지 않을 경우 에러가 발생할 수 있다
이러한 에러를 기반으로해서 SQL injection을 진행할 수 있다. '(싱글 쿼터)를 넣을 때 발생하는 syntax error를 이용하여 쿼리문을 유추 할 수 도 있고, 참 거짓을 판별하는 쿼리문을 넣어 에러에 따라 값을 추출할 수 도 있다.
wargame 문제를 통해 알아보면
[링크1] https://dorahee.tistory.com/134
[링크 1]와 같이 에러를 기반으로 참 거짓을 판별해 값을 추출한다.
-
Union Based SQL
Union SQL Injection 은 기본으로 작성되는 쿼리 + UINION 쿼리를 이용해서 값을 얻는 방법이다
UNION 구문을 사용 할 경우에는 기존에 쿼리에 작성되는 칼럼에 갯수가 똑같아야 하며 칼럼의 갯수가 다를 경우 에러가 나타난다 Union 구문을 통해 칼럼의 갯수를 알아 내는 것도 가능하다.
첫번째 값은
SELECT * FROM 'here' where name = 'guest' 에 대한 결과값 이고
두번째 값은
SELECT name,1,1,1 from here where name = 'admin'에 대한 결과 값이다.
또한 다른 방법으로는
@a 라는 변수에 name 이 admin에 message를 담고 union 구문을 이용하여 출력한다
이 구문에서 중요한점은
(SELECT @a:message where name = 'admin')은 항상 거짓을 의미하기 때문에 and로 바꿀 시 null 값이 출력된다.
-
Blind SQL
Blind SQL은 Error를 확인 할 수 없으나, 쿼리에 따라 참, 거짓에 결과값이 다를 때 웹 어플리케이션에 반응을 확인하여 공격하는 기법이다
2.Boolean SQL 참 거짓에 따라 발생되는 쿼리를 이용해 값을 유추 https://dorahee.tistory.com/108?category=735413
2. Time Based SQL
일반적으로 참 거짓에 따른 웹 사이트에 반응을 알 수 없을 때 사용하는 기법으로 sleep 구문을 이용한다 ex) if(a>b, sleep(5),
'취약점 진단 > WEB' 카테고리의 다른 글
sql 인젝션 우회 기법 (0) | 2019.05.05 |
---|---|
sql 문자열 결합 방법 (0) | 2019.05.05 |
mysql - information_schema (0) | 2019.03.26 |
Blind Sql Injection -값 길이, 값 가져오기 (0) | 2019.03.25 |
Blind Sql Injection - 칼럼 길이, 이름 가져오기 (0) | 2019.03.18 |