본문 바로가기
WEB

SQL Injection

by Luuii 2018. 1. 30.

SQL Injection

> 웹 어플리케이션에서 데이터베이스로 전달되는 SQL쿼리 값을 변조 및 삽입히여 비정상적인 방법으로 데이터베이스에 접근하는 공격을 의미

> 이러한 공격을 통해 발생될 수 있는 취약점은 인증우회(계정 및 암호없이 로그인), 시스템 명령어 삽입(저장 프로시저를 악용한 OS 명령어 삽입 등), 웹쉘 생성등이 있다.

 

 

웹 클라이언트 → 웹 서버 → DB 서버

 

SQL Injection 유형

> SQL Injection에는 공격기법에 따라 다양한 유형이 존재

> 에러가 발생되는 사이트에서는 논리적 에러 및 UNION SQL Injection을 사용하지만,

> 에러가 발생되지 않는 사이트에서는 Blind SQL Injection 기법등을 사용.

 

 


논리적 에러를 이용하는 SQL Injection

> or 1=1 등의 논리적 에러를 발생시킬 수 있는 패턴을 이용한 인증우회 기법.

> 특히 에러가 발생되는 사이트에서는 에러정보를 이용하여 데이터베이스 및 쿼리 구조 등의 정보를 추측.

 

[Ex]

SELECT * FROM Users WHERE Username='$username' AND Password='$password' 

 

외부에서 입력될 수 있는 계정($username)과 암호($password)에 참 조건(or 1=1)을 수행하는 문장을 삽입하여 계정과 암호 없이도 로그인 우회가 가능.

 

SELECT * FROM Users HERE Username='1' or '1'='1' AND Password='1' or '1'='1'

 

 

두 개 이상의 쿼리를 이용하는 Union SQL Injection

> UNION은 2개 이상의 쿼리를 요청하여 결과를 얻는 SQL 연산자이며,

> 공격자는 이를 악용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어내는 방식.

 

[EX] id=5라는 1개의 쿼리와 테이블 정보가 들어있는 information_schema.tables를 얻으려는 추가 쿼리가 합쳐진 공격패턴


http://www.site.com/news.php?id5 union all select 1,table_name,3 from information_schema.tables 

 

 

쿼리 가능여부를 이용하는 Blind SQL Injection

> 악의적인 문자열 삽입 대신 쿼리(참 혹은 거짓)에 따라 정보를 취득하는 기법.

 

why use?

에러가 발생되지 않는 사이트에서 위의 기법들을 사용할 수가 없기 때문에 공격을 통해 정상적인 쿼리가 수행되는지 혹은 쿼리가 수행되지 않아 쿼리 결과가 없느지를 통해 판단할 수 있다.


[EX] 

id=5 다음에 and 1=1을 삽입하였고 이는 where id=5 and 1=1로 처리될 것이다.

id=5(참) and 1-1(참)이기 대문에 page.php?id=5 입력한 것과 동일한 결과 페이지가 제공 될 것이다.


 

 http://ww.xxx.com/page.php?id= and 1=1 (참 조건)


그러나 and 1=2를 삽입한 경우, 

id=5(참)와 1=2(거짓)의 거짓조건으로 인해 정상적인 쿼리가 수행되지 않아 화면에 결과가 출력되지 않을 것이다.


 http://www.xxx.com/page.php?id=5 and 1=2 (거짓 조건)




저장 프로시저를 이용하는 Stored Procedure SQL Injection

> 저장 프로시저는 운영상 편이를 위해 만들어둔 SQL 집합형태이며, 

> 특히 MS SQL에서 사용할 수 있는 xp_cmdshell은 윈도우 명령어인 netstat -an(네트워크 상태정보 제공)을 삽입하고 있다.


 http://www.site.com/member/checkid.asp?id=';CREAT.....r.dbo.xp_cmdshell%20' netstat%20-an';




타임기반의 Blind SQL Injection

> 쿼리 결과를 특정시간만큼 지연시키는 방법을 이용하는 기법.

> Blind 기법과 마친가지로 에러가 발생되지 않은 조건에서 사용하는 기법.


[EX]

MySQL에서 Sleep() 함수를 이용하여 5초 후에 쿼리 결과를 얻도록 공격문자열을 삽입

만약 5초 후에 쿼리 결과가 화면에 출력도니다면 취약저이 있다고 판단 가능.


http://testphp.vulnweb.com/listproducts.php?cat=1 AND SLEEP(5) 




에러 기반의 SQL Injection

GET, POST 요청필드, HTTP 헤더 값, 쿠키값 등에 특수문자(싱글 쿼트( ' ) 혹은 세미콜론( ; )) 삽입 시, SQL 에러가 발생된다면

취약점이 있다고 판단 가능.


[EX] 데이터베이스별 에러정보 예시


MsSQL Server

Microsoft OLE DB Provider for ODPC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ' '.

/target/target.asp, line113 


MySQL

You have an error in you SQL syntax; check the manual

that corresponds to your MySQL server version for the

right syntax to user near '\'' at line 1 


Oracle

ORA-00933: SQL command not properly ended 


PostgreSQL

Query failed: ERROR: syntax error at or near

" ' " at character 56 in /www/site/test.php on line 121. 


+

특징 중의 하나는 비정상적인 패턴삽입 공격 시 응답코드는 500번 혹은 200번이 될 수 있다.

500번인 경우는 시스템 에러가 발생되는 일반적인 경우나 200번인 경우에도 정상적인 페이지 중간에 에러 문자열이 포함되는 경우도 있다.

반응형