HACKING/WEB

[OWASP] 1. INJECTION

myejinni 2021. 9. 16. 19:21

1. INJECTION

 

   : LDAP이나 OS, SQL에서 정상적이지 않은 질의문을 삽입해 비정상적인 동작을 만들어 내는 공격

   : 자신의 권한을 상승시키거나, 볼 수 없는 비밀 자료를 얻어내는데 사용 됨

   -> 어플리케이션에서는 DB 쿼리문을 조작해 원하는 동작을 얻어 낼 수 있는 SQL INJECTION이 많이 사용됨

 

1-1. SQL INJECTION

 

   :  허가받지 않은 사용자가 임의의 값을 주입

      => (-) 인증 우회, 불법 로그인, DB 내용 삭제, 열람 등을 수행하여 비정상적인 DB 접근을 시도하는 공격 기법

 

2. 취약점 발생 이유

 

   : 사용자의 입력값을 사용 => 동적으로 SQL 질의문 생성

     => 특수문자로 이뤄진 입력값 조작으로 개발자의 의도와 완전히 다른 SQL 질의문 생성됨

 

 

-정상적인 로그인: 컴퓨터는 사용자가 말한 것이 맞는지 확인하고 맞다면 맞은 정보에 대한 대답으로 로그인을 시켜줌.

 

      VS

 

-비정상적인 로그인: 무조건 맞는 말을 웹사이트에 삽입해 컴퓨터에게 혼돈을 줘 로그인 성공

 

; 컴퓨터는 아이디 패스워드를 조회해보니까 일단 맞다는 정보를 얻었지만 누구라고 로그인을 시켜                            줘야 할지 모르기 때문에 아무 계정으로 로그인을 시켜줌

 

 

 

 

3. 공격 방법

 

   : SQL 질의문의 임력값 필드에 ' OR 1=1 #을 삽입=> 대부분 우회 가능

 

 JAVA SQL 질의문

 input에 ' OR 1=1 #을 입력하고 input1에 공백을 입력

 

           => SELECT * FROM LOGIN WHERE ID= ' ' OR 1=1 # AND PW = ''

 

           => # 이후는 주석처리되며, 논리 연산자 우선순위에 의해 항상 참인 질의문이 생성되어 로그인에 성공

 


 

[Bee box- SQL injection(GET/SEARCH) 실습]

 

우선 검색창에 ' 를 입력하여 sql injection 취약점이 있는지 확인한다.

 

 

입력 결과 위와 같은 오류 메세지가 표시된다.

 

이를 통해 공격자는 DB가 MySQL 임을 확인할 수 있고, SQL INJECTION 공격을 시도해 볼 수 있다. 

 

다음으로 ' or 1=1# 을 입력해보았다.

 

이를 통해 쿼리 결과가 1=1을 통해 항상 참이 되고 기존 코드 뒷부분을 전부 주석 처리된다.

 

 

 

출력된 결과를 보면, 입력값이 정상 쿼리로 인식되어 영화 목록이 쭉 출력된다.

 


 

4. 방어 방법

 

   :Statement 대신 PreparedStatement를 사용

 

  왜? SQL 질의문으로 사용되기 위해 미리 컴파일된 PreparedStatement

       => 사용자 입력값에 의한 SQL 질의문 구조 변경이 불가능

취약
안전!