BLOG

SQL Injection(SQL 삽입) 본문

SECURITY/Vulnerability

SQL Injection(SQL 삽입)

Radbit 2020. 4. 20. 12:48

( 현재 운영되고 있는 사이트에서 사용하지 마십시오. 책임 질 수도 없고, 불법입니다. )

 

 

가상 홈페이지
가상 홈페이지의 로그 

우선 여기에 가상의 홈페이지가 있다.

일단 임의의 이메일과 패스워드를 입력해보겠다.

입력한 이메일이 데이터베이스에 없다는 로그

당연히도 맞지 않는다. 그래서 이번엔 password 끝에 ' 를 붙여서 입력해보겠다.

unexpected error occurred 라는 오류를 뿜어낸다.
오류가 난 로그 모습

예상하지 못한 오류가 발생했다고 홈페이지와 로그에서 보여주고 있다.

로그에서 중요하게 봐야할 부분은 " 'password' ' limit 1" 이다. 

왜 중요한 지는 아래에서 서술하겠다.

 

이 코드가 DB에서 원하는 데이터를 뽑아내는 코드다.

입력된 email은 user@email.com 이고

패스워드는 password 이다.

Ex. 여기서 limit는 출력되는 레코드의 개수를 제한할 때 사용된다.

간단히 이해하면서 넘어가고, 나머지는 DB를 자세히 공부하면서 알아보는 걸로..

 

이게 아까 오류가 났을 때 입력했던 패스워드다.

위와 뭔가 다르지 않은가? 입력했던 패스워드가 바로 SQL 구문에 직접적으로 들어가있다.

이로 인해 오류가 난 것이다. 이 행동으로 인해 서버가 SQL Injection 공격의 취약점이 될 수 있다는 걸 알 수 있다.

그러니 바로 ' or 1=1-- 라는 간단한 구문으로 실행해보자.

 

로그인이 된 모습
로그
코드

' or 1=1-- 를 입력하니 로그인이 됐다.

패스워드에 들어간 구문이 ' ' or 1=1--' LIMIT 1이 되어있다. 이 부분을 뜯어보자.

우선 뜻을 알아보자면 pass =' ' 로 구문 오류 없이 작은따옴표를 닫았고,

or 1=1 로 참을 만든 후, -- 를 붙여 그 뒤에 구문을 무시할 수 있게 주석처리했다.

이로 인해 올바른 패스워드 입력 없이 로그인 할 수 있었던 것이다.