SQL Injection 설명
SQL Injection 이란?
SQL Injection이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입해 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위입니다.
공격 종류 및 방법
SQL Injection
논리적 에러를 이용한 SQL Injection
위 사진에서 보이는 쿼리문은 일반적으로 로그인 시 많이 사용되는 SQL 구문입니다. 해당 구문에서 입력값에 대한 검증이 없을 때 악의적인 의도로 임의의 SQL 구문을 주입하였습니다. ' or 1=1--로 WHERE 절에 있는 싱글 쿼터를 닫기 위한 싱글 쿼터와 or 1=1라는 구문을 이용하여 WHERE 절을 모두 참으로 만들고, -- 를 넣어줘 뒤의 구문을 주석 처리해주고 있습니다.
간단한 방법이지만 이 방법이 성공하게 되면 가장 먼저 만들어진 계정으로 로그인에 성공하게 됩니다. 대부분 가장 먼저 만들어진 계정은 관리자 계정이기 때문에 관리자 계정으로 로그인할 수 있게 됩니다.
Union based SQL Injection
Union 명령어를 이용한 SQL Injection
2개 이상의 쿼리를 요청하여 결과를 얻는 UNION이라는 SQL 연산자를 이용한 SQL Injection 공격을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어냅니다.
UNION 연산자를 사용하여 둘 이상의 SELECT 문 결과를 단일 결과 집합을 결합할 수 있습니다.
단 UNION 연산자를 사용하여 결합된 결과 집합은 모두 같은 구조를 가져야 합니다.
위에 보이는 쿼리문은 Board라는 테이블에서 게시글을 검색하는 쿼리문이다. 입력값을 title과 contents 칼럼의 데이 터랑을 비교한 뒤 비슷한 글자가 있는 게시글을 출력합니다. 여기서 입력값으로 Union 키워드와 함께 맞춰서 SELECT 구문을 넣어주게 되면 두 쿼리문이 합쳐져 하나의 테이블로 보이게 됩니다. 위와 같은 인젝션이 성공할 경우 id와 password를 요청하는 쿼리문이기에 사용자의 개인정보가 게시글과 함께 화면에 보이게 될 것입니다.
Blind SQL Injection
Blind SQL Injection은 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용합니다. 로그인 폼에서 SQL Injection이 가능할 때 서버가 응답하는 로그인 성공, 실패 메시지를 통하여 DB의 테이블 정보를 추출해 낼 수 있습니다.
위 주입 문은 데이터베이스의 테이블 명을 알아내는 방법입니다. 인젝션이 가능한 로그인 폼을 통하여 악의 적인 사용자는 임의로 가입한 abc123이라는 아이디와 함께 abc123’ and ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type=‘base table’ limit 0,1) 1,1)) > 100 --이라는 구문을 주입했습니다.
해당 구문은 MySQL에서 테이블 명을 조회하는 구문으로 limit 키워드를 통해 하나의 테이블만 조회하고 SUBSTR 함수로 첫 글자만, 마지막으로 ASCII를 통해서 아스키코드로 변환해 줍니다.
Time Based SQL Injection
Time Based SQL Injection도 마찬가지로 서버로부터 특정한 응답 대신 참 거짓의 응답을 통해 데이터베이스의 정보를 유출하는 기법입니다.
MySQL에서 Sleep() 함수를 이용하여 5초 후에 쿼리 결과를 얻도록 공격 문자열을 삽입했을 때 만약 5초 후 쿼리 결과가 화면에 출력된다면 취약점이 있다고 판단할 수 있습니다.
Stored Procedure SQL Injection
저장 프로시저는 운영상 편의를 위해 만들어둔 SQL 집합 형태이며, 특히 MS SQL에서 사용할 수 있는 xp_cmdshell은 윈도 명령어인 netstat -an을 삽입하고 있다.
에러 기반의 SQL Injection
GET, POST 요청 필드, HTTP 헤더 값, 쿠키값 등에 특수문자(싱글 쿼트(') 혹은 세미콜론(;)) 삽입 시, SQL 에러가 발생된다면 취약 점이 있다고 판단할 수 있다.
SQL Injection에 주로 사용되는 문자열
문자열 | 설명 |
' | 문자 데이터 구분 기호 |
; | 쿼리 구분 기호 |
--, # | 해당 라인 주석 구분 기호 -- : Oracle, MSSQL # MYSQL |
/* */ | /* 와 */ 사이 구문 주석 |
|| | 문자 연결 (Oracle만 해당) |
참고 :
https://noirstar.tistory.com/guestbook
https://kk-7790.tistory.com/74
https://m.blog.naver.com/koromoon/120172851234
'해킹 > 웹해킹' 카테고리의 다른 글
[LOS] 3번 goblin write up (0) | 2021.06.06 |
---|---|
[LOS] 2번 cobolt write up (0) | 2021.06.06 |
정규표현식 / 주로 사용하는 정규표현식 (0) | 2021.06.06 |
[LOS] 1번 gremlin write up (0) | 2021.06.06 |
xss-game level3 write up (0) | 2021.06.02 |